Instalar Fedora con BTRFS, cifrado e Snapshots activos
Introducción
Cando escribín os artigos para instalar Fedora en VirtualBox, ou crear un USB para executar unha distro en vivo, non incluín a opción de cifrar o disco. Pero o certo é que na instalación actual, no meu sobremesa, teño cifradas as particións, incluída a /boot.
Moita xente pensará que para un sobremesa non fai falla cifrar os discos, xa que para que alguén acceda terá que estar na miña casa. Co que só engado complexidade innecesaria a instalación. Cun portátil si que o ven normal, xa que viaxas con el e nun descoido poden levalo. Pode que en parte teñan razón, pero dende o meu punto de vista ese extra de seguridade paga a pena e non custa nada. Ademais tamén está a parte lúdica de facelo e aprender.
Xa levaba un tempo lendo sobre as vantaxes de BTRFS sobre EXT4, como os snapshots ou o tamaño de sector dinámico. Sobre todo no grupo de telegram do proxecto atareao. Así que apunteimo para buscar máis información cando tivese tempo. Xa das primeiras fontes que atopei foi a de Sysguides. A que utilicei é a que enlaza nese mesmo artigo, na que da os pasos para instalar Fedora con BTRFS, _Snapshots e cifrado. Esta
Instalación de Fedora con Snapshots e Rollback
O inicio da instalación será o mesmo que con VirtualBox, arrancar a ISO. Pero neste caso pecharemos a fiestra de instalación dándolle a Skip. Antes debemos facer que o instalador soporte cifrar a partición /boot. Deberemos modificar dous ficheiros de configuración. Para facer isto abrimos unha terminal e entramos en modo sudo.
A continuación executamos o seguinte comando, para activar o soporte do cifrado de /boot durante a instalación.
sed -i.bkp 's/encryption_support = False/encryption_support = True/' \
/usr/lib64/python3.*/site-packages/pyanaconda/modules/storage/bootloader/base.py
Unha vez feito isto volvemos lanzar o instalador. No escritorio teremos o icono, ca
lenda, Install to Hard Drive.
Escolleremos os nosos básicos, como idioma, distribución do teclado, etc.
Para configurar os discos escolleremos a opción de personalizado-avanzado. Seleccionaremos o disco no que queremos instalar o sistema, con coidado de non equivocarnos, para evitar a perda de datos. E comezaremos a crear a estructura que queremos para o disco.
Se non a temos daremos a crear unha nova táboa de particións nese disco.
Creando os Volumes
- A primeira que crearemos terá estes datos:
- Device type: Partition
- Label: ESP
- Mountpoint: /boot/efi
- Type: EFI System Partition
- Size: 1Gb
Nota: Neste punto non marcamos a opción de cifrar.
- A segunda será a partición principal de Fedora:
- Device type: Btrfs Volume
- Name: Fedora
- Mountpoint: deixarémolo en branco
- Encrypt: marcado, si.
- Encryption type: luks2
- Sector size: Automático
- Contrasinal: aquí poremos unha de a lo menos oito díxitos. Se usamos unha máis curta, teremos que mudala máis diante.
Creación dos subvolumes
Agora crearemos os subvolumes, nos que dividiremos a partición de Fedora.
– | Nome | Punto de montaxe |
---|---|---|
1. | root | /root |
2. | home | /home |
3. | opt | /opt |
4. | cache | /var/cache |
5. | sddm | /var/lib/sddm |
6. | libvirt | /var/lib/libvirt |
7. | log | /var/log |
8. | spool | /var/spool |
9. | tmp | /var/tmp |
Unha vez feito isto pulsaremos o botón Done, para continuar ca instalación. Isto amosaranos un resumo das operacións a aplicar, o cal levará un tempo.
Rematamos cas opcións da instalación, como a creación de usuarios e a rede. E comezamos a instalación. Pero non reiniciamos.
Despois de instalar
Como comentaba, cando remata a instalación pechámola, pero non reiniciamos. Según a guía de Sysguides ao escoller LUKS2 para cifrar, por defeco escolle Argon2id, que non é soportado por GRUB. Así que temos que mudalo a PBKDF2.
Buscaremos o noso dispositivo LUKS co seguinte comando
LUKS_DEVICE="$(cryptsetup status \
$(grub2-probe --target=device /mnt/sysroot) \
| grep 'device:' | awk '{print $2}')" \
; echo $LUKS_DEVICE
No meu caso devolve /dev/sda2.
Agora buscamos o cifrado PBKDF usado actualmente:
cryptsetup luksDump $LUKS_DEVICE | grep -A7 '0: luks2'
Que devolve:
0: luks2
Key: 512 bits
Priority: normal
Cipher: aes-xts-plain64
Cipher key: 512 bits
PBKDF: argon2id
Time cost: 4
Memory: 1048576
Así que o mudaremos a pbkdf2 co seguinte comando. O número de iteracións depende da potencia da CPU, a máis alto máis poderemos por, pero tamén fará máis lento o arranque.
cryptsetup luksChangeKey ${LUKS_DEVICE} \
--pbkdf pbkdf2 \
--pbkdf-force-iterations 500000
Cando lancemos o comando anterior pediranos o contrasinal de cifrado do disco. Aquí verificará que o contrasinal sexa seguro, se o que escollemos antes non o é. Deberemos escoller un novo. Se fose seguro, podemos volver introducir o mesmo como novo contrasinal.
cryptsetup luksDump $LUKS_DEVICE | grep -A7 '0: luks2'
0: luks2
Key: 512 bits
Priority: normal
Cipher: aes-xts-plain64
Cipher key: 512 bits
PBKDF: pbkdf2
Hash: sha256
Iterations: 500000
A continuación precisamos activar Crypto Disk e Cryptomount para que GRUB cargue os modulos necesarios que permitan cifrar /boot.
Buscamos o UUID do LUKS
LUKS_UUID="$(cryptsetup luksUUID ${LUKS_DEVICE})" ; echo $LUKS_UUID
Engadimos cryptomount á configuración de GRUB
sed -i.bkp "1i cryptomount -u ${LUKS_UUID//-/}" \
/mnt/sysroot/boot/efi/EFI/fedora/grub.cfg
Activamos os módulos requeridos na configuración de GRUB
echo 'GRUB_PRELOAD_MODULES="cryptodisk luks"' >> /mnt/sysroot/etc/default/grub
Activamos cryptodisk para GRUB
echo 'GRUB_ENABLE_CRYPTODISK=y' >> /mnt/sysroot/etc/default/grub
Aplicamos os cambios á configuración
chroot /mnt/sysroot grub2-mkconfig -o /boot/grub2/grub.cfg
E xa podemos reiniciar o sistema para continuar a configuración.
Despois do reinicio
Durante este reinicio pediranos dúas veces o contrasinal, antes da carga do GRUB e antes de montar o sistema.
Durante a carga podemos ver un erro coma este, error: ../../grub-core/commands/loadenv.c:216:sparse file not allowed. Esta mensaxe non afecta a carga do sistema, simplemente é porque /boot está en BTRFS en troques de EXT4. O único que se perde é que GRUB non lembrará a última escolla que fixemos no menú.
Facendo visible GRUB
Para activar os snapshots e volver atrás, queremos que GRUB sexa sempre visible. Xa que se algo fose mal, sería dende aquí onde poderíamos entrar no sistema nun estado anterior.
Executaremos o comando seguinte na terminal, para que GRUB sexa sempre visible.
sudo grub2-editenv - unset menu_auto_hide
Revisaremos o noso sistema de ficheiros con:
sudo btrfs filesystem show /
Label: 'FEDORA' uuid: 17378d24-d4f9-4877-953a-f2126b17bce4
Total devices 1 FS bytes used 6.54GiB
devid 1 size 127.05GiB used 10.02GiB path /dev/mapper/luks-e2adcde7-5739-4c37-beaf-0030cf25c5b5
Se queremos ver como temos configurado todo executaremos o seguinte comando, lembrando de mudar o disco polo noso. No meu caso é o sda, pero pode ser outro calquera.
lsblk -p /dev/sda
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
/dev/sda 253:0 0 128G 0 disk
├─/dev/sda1 253:1 0 954M 0 part /boot/efi
└─/dev/sda2 253:2 0 127.1G 0 part
└─/dev/mapper/luks-17378d24-d4f9-4877-953a-f2126b17bce4 252:0 0 127G 0 crypt /var/log
/var/spool
/var/tmp
/var/lib/sddm
/var/lib/libvirt
/var/cache
/home
/opt
/
E os subvolumes
sudo btrfs subvolume list /
ID 256 gen 59 top level 5 path root
ID 257 gen 60 top level 5 path home
ID 258 gen 21 top level 5 path opt
ID 259 gen 55 top level 5 path cache
ID 260 gen 51 top level 5 path sddm
ID 261 gen 48 top level 5 path libvirt
ID 262 gen 60 top level 5 path log
ID 263 gen 48 top level 5 path spool
ID 264 gen 58 top level 5 path tmp
Actualización con problemas
Neste punto actualizaremos o sistema. Compre dicir que neste punto eu tiven problemas.
sudo dnf update -y
NOTA: Ao reiniciar é onde teríamos o erro. Así que antes de reiniciar temos que editar un ficheiro. O ficheiro é /boot/efi/EFI/fedora/grub.cfg. Que por algún motivo, ao actualizar o ficheiro é reescrito e elimina a liña que permite descifrar o disco. Así que o editaremos e engadimos como primeira liña o seguinte: cryptomount -u LUKS_UUID, mudando LUKS_UUID polo noso.
Podemos obter o noso LUKS_UUID con lsblk u con cryptsetup luksUUID /dev/sda2, mudando sda2 polo dispositivo luks que toque. No caso de facelo con lsblk, copiaremos o UUID que segue a luks-.
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 238,5G 0 disk
├─sda1 8:1 0 1G 0 part /boot/efi
└─sda2 8:2 0 237,5G 0 part
└─luks-71cf263d-c767-46ba-aea4-19d21143708d 252:0
Gardamos, aplicamos a configuración de GRUB co comando grub2-mkconfig e reiniciamos.
NOTA: se estas a seguir este titorial con outra distro, para aplicar os cambios executa update-grub.
O problema apareceu igualmente
Xa sexa porque nos esquecemos de facer o paso que indico no punto anterior, ou que nos equivocásemos. Cando reinicia o sistema pediranos o contrasinal de cifrado e remataremos na consola de GRUB.
Para solucionar isto imos listar os contidos aos que temos acceso, con ls.
O seguinte será montar o noso disco con cryptomount (hd0,gpt2). Mudando (hd0,gpt2) polo noso disco. Vainos pedir a clave para descifrar o disco.
A última orde será normal, para arrancar o sistema con normalidade.
Xa dentro do sistema seguimos os pasos do punto anterior.
Pedindo só un contrasinal ao iniciar
Agora mesmo cada vez que iniciamos o equipo pidenos o contrasinal dúas veces. Para evitar isto temos dúas opcións, usar un ficheiro de chaves ou TPM2.
Usando un Key File
Excutaremos os seguintes comandos coma super usuario.
LUKS_UUID="$(grub2-probe --target=cryptodisk_uuid /)" ; echo $LUKS_UUID
Anotamos a saída do comando anterior e creamos o directorio de chaves
mkdir -v /etc/cryptsetup-keys.d
Xeramos un ficheiro aleatorio para a chaves
dd if=/dev/random \
of=/etc/cryptsetup-keys.d/luks-${LUKS_UUID}.key \
bs=512 count=8
Mudamoslle os permisos
chmod -c 0400 /etc/cryptsetup-keys.d/luks-${LUKS_UUID}.key
E engadimos a chave
cryptsetup luksAddKey \
--pbkdf pbkdf2 \
--pbkdf-force-iterations 500000 \
/dev/disk/by-uuid/${LUKS_UUID} \
/etc/cryptsetup-keys.d/luks-${LUKS_UUID}.key
Aquí pediranos a nosa clave para descifrar o disco.
Indicamoslle a dracut que inclúa a nosa clave no initramfs
echo "install_items+=\" /etc/cryptsetup-keys.d/luks-${LUKS_UUID}.key \"" \
> /etc/dracut.conf.d/cryptodisk.conf
E facemos build de dracut.
dracut -vf
Xa por último reiniciamos.
TMP2
Deixoo aquí indicado, pero non foi a miña opción, xa que o meu equipo non a soporta. Os comandos executaránse tamén como administrador.
Verificamos que o secure boot está activo
mokutil --sb-state
Comprobamos se o noso sistema soporta TPM
systemd-cryptenroll --tpm2-device=list
No meu caso devólveme No suitable TMP2 devices found.
Gardamos o LUKS UUID a unha variable
LUKS_UUID="$(grub2-probe --target=cryptodisk_uuid /)" && echo $LUKS_UUID
Activamos o dispositivo TPM2. Cando nola pida, introducimos o contrasinal para descifrar o disco.
systemd-cryptenroll \
--wipe-slot=tpm2 \
--tpm2-device=/dev/tpmrm0 \
/dev/disk/by-uuid/${LUKS_UUID}
Confirmamos a key TPM
systemd-cryptenroll /dev/disk/by-uuid/${LUKS_UUID}
Engadimos a información do dispositivo TPM ao kernel de arranque
grubby --update-kernel=ALL \
--args="rd.luks.options=tpm2-device=/dev/tpmrm0"
Confirmamos que as opcións fosen cargadas
grubby --info=DEFAULT
Veríamos unha saída como a seguinte, según Sysguides
index=0
kernel="/root/boot/vmlinuz-6.14.2-300.fc42.x86_64"
args="ro rootflags=subvol=root rd.luks.uuid=luks-17378d24-d4f9-4877-953a-f2126b17bce4 rhgb quiet $tuned_params rd.luks.options=tpm2-device=/dev/tpmrm0"
root="UUID=e2adcde7-5739-4c37-beaf-0030cf25c5b5"
initrd="/root/boot/initramfs-6.14.2-300.fc42.x86_64.img $tuned_initrd"
title="Fedora Linux (6.14.2-300.fc42.x86_64) 42 (Workstation Edition)"
id="347197e21a7d4bc2b50c1a7675c2a395-6.14.2-300.fc42.x86_64"
Actualizamos /etc/crypttab
echo "luks-${LUKS_UUID} UUID=${LUKS_UUID} none tpm2-device=/dev/tpmrm0" \
> /etc/crypttab
Activamos o módulo TPM en dracut
echo 'add_dracutmodules+=" tpm2-tss "' > /etc/dracut.conf.d/tpm2.conf
Rexeneramos a configuración de GRUB
grub2-mkconfig -o /boot/grub2/grub.cfg
Reconstruímos initramfs
dracut -vf
E reiniciamos.
Preparando as Snapshots
Xa temos o noso sistema instalado e funcionado, pero queda por configurar os puntos de salvado. Antes de nada imos crear outros subvolumes, para que cando apliquemos un punto de salvado, non se vexan afectados. Cousas como os nosos documentos, marcadores, etc. Non queremos perder cousas por restaurar a un punto anterior.
Imos crear por exemplo un subvolume para as nosas claves ssh.
btrfs subvolume create ~/.ssh
Se xa existise a carpeta de antes, podemos movela temporalmente
mv -v ~/.ssh ~/.ssh_old
btrfs subvolume create ~/.ssh
cp -arv ~/.ssh_old/. ~/.ssh/
rm -rfs ~/.ssh_old
restorecon -vRf ~/$(ls -A)
Faríamos o mesmo con calquer outra carpeta que quixésemos deixar fora das restauracións. .gpg, Images, etc.
Configurando Snapper, grub-btrfs e Btrfs Assistant
O primeiro será instalar os paquetes necesarios. Snapper para xestionar os puntos de restauración, grub-btrfs para integrar as snapshots no menú de GRUB e Btrfs Assistant para ter unha interfaz gráfica sinxela no sistema para ver e restaurar puntos de restauración.
sudo dnf install snapper libdnf5-plugin-actions btrfs-assistant \
inotify-tools git make
Snapper permite integrarse con DNF a través de disparadores, cun ficheiro de accións. Isto permite executar accións antes e despois de ordes de DNF, o que fai que Snapper poida crear puntos de restauración, automáticamente, antes e despois de actualizar, instalar e eliminar paquetes.
Crearemos o noso ficheiro de accións co seguinte:
sudo bash -c "cat > /etc/dnf/libdnf5-plugins/actions.d/snapper.actions" <<'EOF'
# Get snapshot description
pre_transaction::::/usr/bin/sh -c echo\ "tmp.cmd=$(ps\ -o\ command\ --no-headers\ -p\ '${pid}')"
# Creates pre snapshot before the transaction and stores the snapshot number in the "tmp.snapper_pre_number" variable.
pre_transaction::::/usr/bin/sh -c echo\ "tmp.snapper_pre_number=$(snapper\ create\ -t\ pre\ -c\ number\ -p\ -d\ '${tmp.cmd}')"
# If the variable "tmp.snapper_pre_number" exists, it creates post snapshot after the transaction and removes the variable "tmp.snapper_pre_number".
post_transaction::::/usr/bin/sh -c [\ -n\ "${tmp.snapper_pre_number}"\ ]\ &&\ snapper\ create\ -t\ post\ --pre-number\ "${tmp.snapper_pre_number}"\ -c\ number\ -d\ "${tmp.cmd}"\ ;\ echo\ tmp.snapper_pre_number\ ;\ echo\ tmp.cmd
EOF
A primeira liñá volcará o contido que aparece nas seguintes, dentro do ficheiro. Nos comentarios podemos ver o que fai cada un.
Agora crearemos as configuracións de Snapper para os subvolumes raíz e home
sudo snapper -c root create-config /
sudo snapper -c home create-config /home
Faríamos o mesmo para calquer outro subvolume que queiramos incluír nos puntos de restauración. Os subvolumes non incluídos, como o que creamos antes .ssh non se van salvar. Aínda que esté dentro da nosa carpeta home, está nun subvolume a parte.
Podemos ver que se crearon con:
sudo snapper list-configs
Resturamos o contexto SELinux para os directorios das snapshots.
sudo restorecon -RFv /.snapshots
sudo restorecon -RFv /home/.snapshots
E verificamos as etiquetas
ls -1dZ /.snapshots /home/.snapshots
Temos que activar o acceso do usuario a Snapper e a sincronizar os ACLs. Isto permitirá que o usuario poida listar, ver e administrar puntos de restauración sen privilexios de root.
sudo snapper -c root set-config ALLOW_USERS=$USER SYNC_ACL=yes
sudo snapper -c home set-config ALLOW_USERS=$USER SYNC_ACL=yes
Se listamos os nosos subvolumes, poderemos ver que aparecen os das snapshots.
sudo btrfs subvolume list /
Evitaremos a continuación que updatedb indexe estes directorios, para evitar un uso excesivo de memoria e posibles ralentizacións.
echo 'PRUNENAMES = ".snapshots"' | sudo tee -a /etc/updatedb.conf
Podemos listar os puntos cos seguintes comandos, pero de momento non teremos nada.
snapper ls # root
snapper -c home ls # home
Cando teñamos algunha captura veremos algo coma isto
# │ Tipo │ Pre # │ Date │ User │ Cleanup │ Descrición │ Userdata
────┼────────┼───────┼──────────────────────────┼──────┼──────────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────
0 │ single │ │ │ root │ │ current │
1 │ pre │ │ Ven 27 Xuñ 2025 14:33:58 │ root │ number │ dnf install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-42.noarch.rpm https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-42.noarch.rpm -y │
2 │ post │ 1 │ Ven 27 Xuñ 2025 14:33:59 │ root │ number │ dnf install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-42.noarch.rpm https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-42.noarch.rpm -y │
Instalar e configurar grub-btrfs
Este paquete permite que GRUB detecte as snapshots e as inclúa no menú de arranque.
git clone https://github.com/Antynea/grub-btrfs
cd grub-btrfs
Aplicamos uns cambios específicos para Fedora ao arquivo de configuración
sed -i.bkp \
-e '/^#GRUB_BTRFS_SNAPSHOT_KERNEL_PARAMETERS=/a \
GRUB_BTRFS_SNAPSHOT_KERNEL_PARAMETERS="rd.live.overlay.overlayfs=1"' \
-e '/^#GRUB_BTRFS_GRUB_DIRNAME=/a \
GRUB_BTRFS_GRUB_DIRNAME="/boot/grub2"' \
-e '/^#GRUB_BTRFS_MKCONFIG=/a \
GRUB_BTRFS_MKCONFIG=/usr/bin/grub2-mkconfig' \
-e '/^#GRUB_BTRFS_SCRIPT_CHECK=/a \
GRUB_BTRFS_SCRIPT_CHECK=grub2-script-check' \
config
E instalamos e activamos o servizo
sudo make install
sudo systemctl enable --now grub-btrfsd.service
Xa podemos eliminar o repositorio de grub-btrfs que clonamos.
Aquí xa teríamos configurados os snapshots e o rollback. GRUB detectará os snapshots e poderemos volver atrás se algo foi mal.
Activar puntos de restauración temporais
Outra opción que temos é a de crear puntos de restauración cada certo tempo. Cada hora, unha vez ao día, etc. Dependendo do noso interese. Isto farémolo con systemd, polo que a configuración dos tempos podémola ver en artigos anteriores, como o de engadir tarefas a systemd.
sudo snapper -c home set-config TIMELINE_CREATE=no
sudo systemctl enable --now snapper-timeline.timer
sudo systemctl enable --now snapper-cleanup.timer
Cando reiniciemos o sistema poderemos ver que GRUB xa amosa o menú de snapshots.
E dentro veremos os puntos de restauración, neste caso un previo a instalar VIM e outro posterior.
Se seleccionamos o punto de restauración anterior á instalación de VIM, efectivamente, veremos que non está instalado. Isto será útil no caso de facer algún cambio que rompa o sistema. Iremos a este menú, entraremos no punto de restauración anterior e abriremos Btrfs Assistant. Dende aí, poderemos ir á lapela Snapper, Browse/Restore e seleccionar o punto ao que queremos volver. Pulsamos restaurar e listo, o noso sistema quedará reconfigurado nese punto. A próxima vez que iniciemos normal, estaríamos aí.
Conclusión
Os puntos de restauración xe levan un tempo noutros sistemas. Se non lembro mal, a primeira vez que os vin foi en Windows XP. Sempre me pareceu unha opción útil, en caso de catástrofe. Se por exemplo algo se rompe ao actualizar, se borramos unha carpeta que non debíamos etc.
Deste xeito podemos estar máis seguros á hora de utilizar o noso sistema. Sabendo que se pasa algo, sempre podemos volver atrás no tempo.
Fontes:
Sysguides: Instalar fedora con soporte rollback
Artigos Relacionados:
- AWK
- Mudar as DNS en Fedora
- Distrobox
- Instalar Fedora en VirtualBox
- Eliminar liñas nun ficheiro con sed
- Cómo crear un live USB dende a terminal
- Engadir tarefas a Systemd
- Copiar a saída do terminal ao portapapeis
- Configurar acceso SFTP a un directorio
- Inicio de sesión automático en Alpine linux
- Crear un usuario con permisos restrinxidos para backups
- error: gpg failed to sign the data
- Xestionar varias claves ssh
- Cómo instalar Traefik con docker
- Configurar sshfs para acceder al sistema de ficheros de forma segura
- Securizar sudo no noso sistema
- Cómo instalar Raspberry OS
- Instalando docker en modo rootless en Debian
- Configuración e uso de GPG en linux
- Ciberseguridad de tú a tú
- Copias de seguridade con Borgbackup
- Crear un usuario con permisos restrinxidos para backups
- error: gpg failed to sign the data
- Instalación de Pi-hole