domingo, marzo 09, 2025

Migración de ext4 a BTRFS: Mi experiencia con Debian 12

Recientemente me embarqué en la aventura de migrar mi sistema Debian 12 del tradicional sistema de archivos ext4 a BTRFS. En este artículo, comparto mi experiencia completa, desde la planificación hasta la implementación final, incluyendo los obstáculos que encontré y cómo los superé.

¿Por qué migrar a BTRFS?

Antes de entrar en los detalles técnicos, quiero explicar brevemente por qué decidí dar este salto:

  • Instantáneas (snapshots): La capacidad de crear puntos de restauración del sistema de forma rápida y eficiente.
  • Compresión transparente: Ahorro de espacio en disco sin sacrificar rendimiento.
  • Checksums para integridad: Protección automática contra la corrupción silenciosa de datos.
  • Balanceo inteligente: Redistribución de datos que optimiza el uso del almacenamiento.
  • Preparación para el futuro: BTRFS sigue evolucionando con nuevas características.

Mi configuración inicial

Mi sistema contaba con la siguiente estructura:

/dev/sdb1 - 512M - Partición EFI
/dev/sdb2 - 58.8G - Partición raíz (ext4)
/dev/sdb3 - 15.6G - Partición swap
/dev/sdb4 - 158G - Partición home (ext4)

Preparación: Lo primero es el respaldo

Como cualquier operación que modifica los sistemas de archivos, un respaldo completo es absolutamente necesario. Utilicé una herramienta robusta como ddrescue para crear una imagen bit a bit del disco:

sudo ddrescue -dDfnv /dev/sdb /media/mint/hdd_2tb/pix_ssd.img /home/mint/Desktop/pix_ssd.log

Este paso me llevó aproximadamente una hora, pero me dio la tranquilidad de poder recuperar todo en caso de desastre.

Primer intento: La conversión directa (que no funcionó)

Mi primer enfoque fue utilizar la herramienta btrfs-convert, que promete una conversión in-situ de ext4 a BTRFS:

sudo btrfs-convert /dev/sdb2  # Partición raíz
sudo btrfs-convert /dev/sdb4  # Partición home

La conversión en sí funcionó sin errores, y procedí a crear los subvolúmenes necesarios:

sudo btrfs subvolume snapshot /media/mint/6b6a90ad-5b76-4951-9e8e-c748321dfe37/datos /media/mint/6b6a90ad-5b76-4951-9e8e-c748321dfe37/@home

Modifiqué el fstab y la configuración de GRUB para que reconocieran los nuevos sistemas BTRFS y sus subvolúmenes. Sin embargo, al reiniciar, me encontré con que el sistema era inaccesible. El problema principal: los datos de usuario no estaban en las rutas esperadas dentro de la estructura de subvolúmenes.

Segundo intento: El enfoque definitivo

Después del fracaso inicial, opté por un enfoque más radical pero controlado:

1. Reorganización completa de particiones

Decidí consolidar mi partición raíz y home en una única partición BTRFS grande, manteniendo separadas solo la partición EFI y swap:

sudo mkfs.btrfs -L rootfs /dev/sdb2  # Nueva partición grande de 216.8G

2. Creación de la estructura de subvolúmenes

En BTRFS, los subvolúmenes son fundamentales para una gestión eficiente:

sudo mount /dev/sdb2 /mnt
sudo btrfs subvolume create /mnt/@        # Subvolumen para /
sudo btrfs subvolume create /mnt/@home    # Subvolumen para /home

3. Transferencia de datos desde el respaldo

Utilicé rsync para preservar todos los atributos y permisos de los archivos:

# Montar los subvolúmenes en puntos temporales
sudo mount -o subvol=@ /dev/sdb2 /mnt/root_mount
sudo mount -o subvol=@home /dev/sdb2 /mnt/home_mount

# Copiar los datos preservando atributos
sudo rsync -axHAWXS --numeric-ids --info=progress2 /media/mint/be512e73-0c9c-4f3a-bc33-f18e77d8e3d2/ /mnt/root_mount/
sudo rsync -axHAWXS --numeric-ids --info=progress2 /media/mint/01f7dd63-a05f-4c7f-b04a-83ddd39de834/ /mnt/home_mount/

4. Actualización de la configuración del sistema

El archivo fstab requería ser actualizado para la nueva estructura:

UUID=b5a97c2c-4fd8-4aa9-9f0f-47d0937f880d / btrfs defaults,subvol=@,ssd,noatime,space_cache=v2,compress=zstd 0 1
UUID=b5a97c2c-4fd8-4aa9-9f0f-47d0937f880d /home btrfs defaults,subvol=@home,ssd,noatime,space_cache=v2,compress=zstd 0 2
UUID=C6BC-68D3 /boot/efi vfat umask=0077 0 1
UUID=6287ad64-b356-415e-b5b1-b36047a0dd00 none swap sw 0 0

Observa que tanto la partición raíz como home tienen el mismo UUID, ya que ahora están en la misma partición pero en diferentes subvolúmenes.

También tuve que actualizar la configuración de GRUB para reconocer BTRFS:

GRUB_CMDLINE_LINUX_DEFAULT="quiet rootflags=subvol=@"
GRUB_CMDLINE_LINUX="root=UUID=b5a97c2c-4fd8-4aa9-9f0f-47d0937f880d"

5. Finalización desde un entorno chroot

Para finalizar la migración, entré en un entorno chroot en el nuevo sistema:

sudo mount --bind /dev /mnt/root_mount/dev
sudo mount --bind /proc /mnt/root_mount/proc
sudo mount --bind /sys /mnt/root_mount/sys
sudo mount /dev/sdb1 /mnt/root_mount/boot/efi
sudo chroot /mnt/root_mount

Dentro del chroot, instalé las herramientas BTRFS, actualicé el initramfs y reinstalé GRUB:

apt install btrfs-progs
update-initramfs -u -k all
update-grub
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian

Resultado: Un sistema renovado

Después de reiniciar, el sistema arrancó perfectamente con BTRFS. La estructura unificada de particiones quedó así:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2       217G  117G  100G  55% /
/dev/sda2       217G  117G  100G  55% /home
/dev/sda1       511M   28M  484M   6% /boot/efi

Optimizaciones posteriores

Una vez con el sistema funcionando, implementé algunas optimizaciones:

  1. Balanceo de datos: Para distribuir equitativamente los datos en el disco:

    sudo btrfs balance start /
    
  2. Verificación de integridad: Para comprobar la integridad de los datos:

    sudo btrfs scrub start /
    
  3. Compresión: Ya habilitada en fstab con la opción compress=zstd, que ofrece una buena relación entre nivel de compresión y uso de CPU.

Lecciones aprendidas

Esta migración me dejó varias enseñanzas importantes:

  1. Siempre hacer un respaldo completo: Sin mi imagen de respaldo, habría perdido datos cuando el primer intento falló.

  2. La conversión directa puede ser problemática: Aunque btrfs-convert funciona técnicamente, las estructuras resultantes pueden no ser óptimas para un sistema en producción.

  3. El enfoque de recreación es más seguro: Recrear el sistema de archivos desde cero da más control sobre la estructura final.

  4. La documentación es clave: Investigar a fondo antes de empezar me permitió anticipar muchos problemas.

  5. Tiempo de migración: En total, el proceso me llevó unas 11 horas, incluyendo planificación, respaldos y dos intentos.

¿Valió la pena?

Puedo decir que absolutamente sí. La capacidad de crear instantáneas rápidas del sistema, la compresión transparente y la detección de corrupción son características que ya he aprovechado. Además, el sistema parece funcionar con la misma velocidad que antes, sin penalizaciones de rendimiento perceptibles.


Referencias y Recursos Útiles sobre Btrfs

Para aquellos que quieran profundizar más en BTRFS o realizar su propia migración, he recopilado estos recursos que me fueron extremadamente útiles durante mi proceso.

Documentación Oficial de Btrfs

Tutoriales y Guías Prácticas

Videos y Cursos en Línea

Herramientas Útiles

Recursos Adicionales

Recuperación de Datos con ddrescue

Si estás preocupado por la posibilidad de pérdida de datos durante la migración, estas referencias sobre ddrescue son fundamentales:

Creación de un Live USB para la Migración

Trabajar desde un Live USB fue crucial en mi proceso:

Configuración de fstab para Btrfs

El archivo /etc/fstab es crítico en la migración. Estos recursos me ayudaron a configurarlo correctamente:

Configuración de GRUB con Btrfs

La configuración del gestor de arranque es fundamental para trabajar con subvolúmenes Btrfs:

Montaje de Subvolúmenes Btrfs con mount

Para trabajar con subvolúmenes, estos recursos son esenciales:

.