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:

jueves, septiembre 19, 2019

Recuerdos del #19s

 El sismo del 2017 en la Roma, ver caer edificios, es lo más devastador que he vivido.

Con la adrenalina del momento y el instinto de sobrevivencia, sacas fuerzas y energía quien sabe de donde.

En ese entonces trabajaba en la PB de un coworking, uno de esos edificios viejos que solo maquillan para rentarlos a sobre precio.... la sra Angy estaba en la cocineta haciendo la limpieza, como todos los días, sentimos  la vibración de la mesa, como si hubiera pasado un tráiler, alguien gritó, está temblando.... todos salimos corriendo, pero.... la sra Angy, se quedo congelada, inmóvil, me regresé por ella y literalmente casi la arrastro, ella solo caminaba por la inercia de que la jalaba de la mano....

Cuando salimos del edificio, comenzaron a caer vidrios, uno de ellos me alcanzo a rozar muy levemente en la espalda (solo fue el rasguño), en ese momento solté a la sra Angy y corrí hacia avenida Insugentes, justo la calle daba hacia una estación del metrobús, yo solo veía como la estructura se venia hacia a mi, afortunadamente solo fue la sensación (creo), el edificio de enfrente caían vidrios y vidrios, hacia el otro lado, se escuchaban  transformadores explotando y el crujir de los edificios...

Después del sismo, la señora Angy me abrazo y me agradeció mucho... ☺️ 

Caminé desde la Roma hasta Iztapalapa, no sé de donde saque fuerza, no tengo condición física.


Al otro día aun tenia la adrenalina y regresé a la Roma a intentar ayudar. levantamos carpas, repartimos comida, cargamos víveres.
 Dos semanas después de todo, sentado en la sala, me puse a llorar de la nada.

Un llanto inconsolable que no sabia la razón, y no podía parar, estuve así como una hora....

Dejé esa oficina en el 2019 y la señora angelica me escribe de vez en vez para saludarme....

viernes, mayo 22, 2015

Ejecutar en segundo plano Maquinas Virtuales VirtualBox al arrancar sistema Linux

Tengo 2 maquinas virtuales windows en las que estoy desarrollando unas modificaciones.  El acceso a las VMs es solo para tener el servicio de SQL Server y IIS.

Como me resulta tedioso abrir VirtualBox y despues encender las VMs manualmente y ademas tener ahí las pantallas de las maquinas sin usar, ocupando espacion en mi monitor.

He encontrado en http://askubuntu.com/questions/57220/start-vboxheadless-vm-at-startup la manera de cargar en automatico las VMs de VirtualBox al iniciar el sistema.

Paso 1: Crear archivo dentro de /etc/init.d

sudo vim /etc/init.d/StartVM

Paso 2: Pegar el siguiente código, adecuar segun tus necesidades. 


#! /bin/sh
# /etc/init.d/VM
#
#Edit these variables!
VMUSER=pixelead0
case "$1" in
  start)
    echo "Starting VirtualBox VM DevSQLServer ..."
    sudo -u $VMUSER VBoxManage startvm DevSQLServer --type headless
    echo "Starting VirtualBox VM DevIIS ..."
    sudo -u $VMUSER VBoxManage startvm DevIIS --type headless
    ;;
  stop)
    echo "Saving state of Virtualbox VM DevSQLServer ..."
    sudo -u $VMUSER VBoxManage controlvm DevSQLServer savestate
    echo "Saving state of Virtualbox VM DevIIS ..."
    sudo -u $VMUSER VBoxManage controlvm DevIIS savestate
    ;;
  *)
    echo "Usage: /etc/init.d/VM {start|stop}"
    exit 1
    ;;
esac

exit 0

Paso 3: Dar permiso de ejecución al script

 sudo chmod +x /etc/init.d/StartVM

Paso 4: Agregar script en el arranque del sistema.

 sudo update-rc.d StartVM defaults 99 01


Con esos 4 pasos tendremos levantadas la maquinas virtuales en segundo plano. Si por alguna razón requieres tener acceso a ellas, habilita el acceso remoto y utiliza rdesktop.

#! /bin/sh
rdesktop -u dev -p{PASSWORD} -K -T{nombreVentana} {HOST}  -g 1280x800 -r disk:share={~/Escritorio}


Happy Coding!

domingo, enero 04, 2015

Comprimir varias carpetas en archivos separados. #ShellSripting

Para comprimir varias carpetas en archivos ZIP separados desde la terminal de linux. Nos ubicamos en el directorio que contiene los directorios a comprimir y escribimos.

for i in * ;
do zip ../backup/$i.zip -j $i;
done

Parametro:
-j En mi caso solo requiero que se guarden los archivos sin subdirectorios, para eso utilizo este parametro.


martes, diciembre 30, 2014

Personalizar Sublime Text 3

Les comparto mi configuración perzonalizada para Sublime-Text-3.

Entre las que destacan.
  • Desactivar el ajuste de línea.
  • Cambiar de color las pestañas con archivos modificados.
  • Eliminar espacios en blanco al final de las lineas, despues de guardar.
  • Mostrar en la barra de estado el tipo de codificación
  • Resaltar la linea en donde se encuentra el cursor.
  • Remarcar el recuadro en el minimapa.

Así se ve la configuración personalizada.
Solo hay que entrar en Menú --> Preferences --> Settings - User y pegar las siguientes líneas.



// Settings in here override those in "Default/Preferences.sublime-settings",
// and are overridden in turn by file type specific settings.

{
    // Adds whitespace up to the first open bracket when indenting. Requires
    // auto_indent to be enabled.
    "indent_to_bracket": true,

    // Disables horizontal scrolling if enabled.
    // May be set to true, false, or "auto", where it will be disabled for
    // source code, and otherwise enabled.
    "word_wrap": "false",


    // Controls auto pairing of quotes, brackets etc
    "auto_match_enabled": true,

    // Set to true to draw a border around the visible rectangle on the minimap.
    // The color of the border will be determined by the "minimapBorder" key in
    // the color scheme
    "draw_minimap_border": true,

    // Always visualise the viewport on the minimap, as opposed to only
    // showing it on mouse over
    "always_show_minimap_viewport": true,

    // If enabled, will highlight any line with a caret
    "highlight_line": true,

    // Valid values are "smooth", "phase", "blink" and "solid".
    "caret_style": "smooth",

    // Set to false to not highlight angle brackets. This only takes effect if
    // match_brackets is true
    "match_brackets_angle": true,

    // Controls how the indent guides are drawn, valid options are
    // "draw_normal" and "draw_active". draw_active will draw the indent
    // guides containing the caret in a different color.
    "indent_guide_options": ["draw_active"],

    // Set to true to removing trailing white space on save
    "trim_trailing_white_space_on_save": true,

    // Makes tabs with modified files more visible
    "highlight_modified_tabs": true,

    "show_tab_close_buttons": true,

    // Display file encoding in the status bar
    "show_encoding": true,

    // Display line endings in the status bar
    "show_line_endings": true,
}



HAPPY CODING!

.