Como comentaba en el post sobre popOS, he comenzado a usarlo con Btrfs como sistema de ficheros. Primero vamos a ver la parte práctica pero luego intentaré profundizar en su funcionamiento, algo de teoría y sus comandos básicos.
Para ponerlo en marcha he seguido esta estupenda guía: https://github.com/spxak1/weywot/blob/main/Pop_Btrfs_Subvolumes_with_Timeshift.md, asi que voy a adaptarla y traducirla para que llegue a más gente.
Para llevar a cabo el proceso, lo primero que debemos hacer es iniciar el instalador de popOS desde un usb, seleccionar instalación personalizada (avanzada) y después modificar particiones.
Esquema de particiones
Mi esquema de particionado es hiper simple:
- EFI FAT32 - 1GB
- /recovery FAT32 - 6GB
- / BTRFS resto del espacio
Creación de subvolumes
Procedemos con la instalación de forma habitual hasta que acabe, momento en el que no reiniciamos y pasamos a la terminal.
Lo primero es montar el subvolumen principal o top-level subvolume o root subvolume, que es el que posee un subvolid=5, que no se puede borrar ni editar y que no aparece listado como tal, simplemente existe y tiene ese id por diseño.
mount -o subvolid=5,ssd,noatime,space_cache,commit=120,compress=zstd /dev/sda3 /mnt
Ahora podremos crear el subvolumen raíz. Usamos esta nomenclatura para poder usar luego timeshift.
btrfs subvolume create /mnt/@
Ahora movemos todo el contenido actual de la raíz al nuevo subvolume. Es una operación que tarda poco porque en realidad estamos modificando punteros???
cd /mnt
ls | grep -v @ | xargs mv -t @
Ahora hacemos lo mismo con el /home.
btrfs subvolume create /mnt/@home
Y nos aseguramos que exista el directorio /home/usuario y seamos propietarios.
Por último crearemos el subvolume para el swapfile.
btrfs subvolume create /mnt/@swap
Creamos el swapfile
truncate -s 0 /mnt/@swap/swapfile
chattr +C /mnt/@swap/swapfile
btrfs property set /mnt/@swap/swapfile compression none
fallocate -l 9G /mnt/@swap/swapfile
chmod 600 /mnt/@swap/swapfile
mkswap /mnt/@swap/swapfile
mkdir /mnt/@/swap
Modificamos puntos de montaje
Editando /etc/fstab, mantenemos la partición efi y /recovery pero ahora vamos a cambiar el montaje de la raíz.
UUID=xxxxxxxxxxxxxxxx / btrfs defaults,subvol=@,ssd,noatime,space_cache,commit=120,compress=zstd 0 0
Con el mismo UUID crearemos el punto de montaje para @home y @swap:
UUID=xxxxxxxxxxxxxxxx /home btrfs defaults,subvol=@home,ssd,noatime,space_cache,commit=120,compress=zstd 0 0
UUID=xxxxxxxxxxxxxxxx /swap btrfs defaults,subvol=@swap,compress=no 0 0
Además añadimos esta línea para montar la swap:
/swap/swapfile none swap defaults 0 0
Ya solo queda montar todo mount -av
y activar la swap sudo swapon /swap/swapfile
.
Configuramos el bootloader
En popOS el bootloader no es grub sino systemd. Editamos `/mnt/@/boot/efi/loader/entries/Pop_OS-current.conf` para añadir `rootflags=subvol=@`
Quedando así:
title Pop!_OS
linux /EFI/Pop_OS-78c9787f-1d36-42e8-89bd-7b94b501afaf/vmlinuz.efi
initrd /EFI/Pop_OS-78c9787f-1d36-42e8-89bd-7b94b501afaf/initrd.img
options root=UUID=78c9787f-1d36-42e8-89bd-7b94b501afaf ro quiet loglevel=0 systemd.show_status=false splash rootflags=subvol=@
Ahora hemos modificado la configuración del bootloader, pero cada vez que se actualiza el kernel, esta se vuelve a escribir.
El encargado de gestionar esta configuración del bootloader es kernelstub, y debemos indicar en su configuración /mnt/@/etc/kernelstub/configuration
que añada por nosotros la línea que hemos añadido hace un momento con rootflags=subvol=@
.
La config de kernelstub quedará así:
{
"default": {
"kernel_options": [
"quiet",
"splash"
],
"esp_path": "/boot/efi",
"setup_loader": false,
"manage_mode": false,
"force_update": false,
"live_mode": false,
"config_rev": 3
},
"user": {
"kernel_options": [
"quiet",
"loglevel=0",
"systemd.show_status=false",
"splash", ← la anterior línea deberá llevar coma
"rootflags=subvol=@" ← aquí añadimos la línea
],
"esp_path": "/boot/efi",
"setup_loader": true,
"manage_mode": true,
"force_update": false,
"live_mode": false,
"config_rev": 3
}
Actualizamos el bootloader
Para ello debemos desmontar todo de umount -l /mnt
para montar ahora el subvolume @ y sobre este la partición EFI.
Para ello debemos de montar todo lo necesario para poder hacer un chroot.
Lo que queremos hacer es el equivalente al típico update-grub, pero que en este caso se llama update-initramfs.
mount -o defaults,subvol=@,ssd,noatime,space_cache,commit=120,compress=zstd /dev/sda3 /mnt
mount /dev/sda1 /mnt/boot/efi
for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done
sudo cp /etc/resolv.conf /mnt/etc/
sudo chroot /mnt
update-initramfs -c -k all
En este punto ya podemos reiniciar la máquina y tendremos el sistema funcionando sobre btrfs.