Btrfs en Pop OS

27 de julio 2021ComentarioslinuxDavid Poza SuárezComentarios

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.

installer advanced

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.

Ventajas de Btrfs vs LVM+ext4

Información extra