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

  1. 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.

  1. 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.

Na imaxe podemos ver o resumo das opracións a aplicar. Crear a táboa de particións, as particións, o cifrado e os subvolumes. Cos botons para cancelar e voltar ao particionador ou aceptar os cambios

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.

Menú de GRUB no que se pode ver unha entrada Fedora Linux snapshots

E dentro veremos os puntos de restauración, neste caso un previo a instalar VIM e outro posterior.

Menú de snapshots onde temos dúas entradas de antes e despois de instalar VIM

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í.

Aplicación Btrfs assistant na vista para escoller e restaurar puntos de restauración

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