Nunca había dedicado mucho tiempo a pensar sobre el sistema de archivos de mi computadora. Desde el punto de vista de un usuario, los detalles de este tipo de tecnología son irrelevantes hasta que algo falla; se encuentra en un muy bajo nivel y es manejado por el sistema operativo. Su función es definir el uso de la memoria en disco. Hasta hace poco, lo único que había investigado sobre sistemas de archivos era en relación a temas de compatibilidad.1

Btrfs en Garuda Linux

Fue al instalar Garuda Linux en mi desktop que empecé a indagar en el tema. Una de sus características emblemáticas es el uso de snapshots de Btrfs como estrategia de recuperación del sistema:2 En caso de que el sistema se rompa, lo cual sucede en ocasiones al actualizarlo, se puede acceder a una lista imágenes previas del sistema desde el menú arranque (GRUB). Estas imágenes (las snapshots) se toman de manera automática antes y después de cada actualización del sistema. Esta característica específica permite utilizar Arch Linux, en la que se basa Garuda,3 de manera confiable. Arch es una distribución que (valga la redundancia) distribuye el software directo desde los repositorios de sus desarrolladores (upstream) de manera continua.4 La ventaja: siempre se tienen los ultimos arreglos, parches de seguridad y características. La desventaja: las cosas pueden salir mal y un programa o todo el sistema puede dejar de funcionar. Ambas son razones por las que Arch Linux es una distribución considerada exclusiva para usuarios de Linux expertos o entusiastas.5 Btrfs tiene la capacidad de crear snapshots con un costo computacional prácticamente nulo.6 Explicar que es exactamente una snapshot en Btrfs excede la intención de este post;7 baste decir que se trata de una imagen (de alguna parte) del sistema que permite revertir los cambios en caso necesario. Así, en caso de que algo se rompa al actualizar el sistema, podemos revertir los cambios sin mayor problema.

Es importante mencionar que estas snapshots no son una una solución de respaldo para la integridad de los archivos (aunque se puede implementar con ellas). Dada la naturaleza de Btrfs, y los sistemas de archivos CoW, si un archivo está corrupto entonces lo está para todas las snapshots que lo comparten.

Tuve que investigar estas cosas debido a que cuando instalé Garuda cometí un error inocente. Decidí hacerle caso a un video tutorial de instalación en que se creaba una partición Btrfs separada para guardar los archivos personales (/home). Experiencias previas con otras distribuciones de Linux me habián enseñado la ventaja de tener particiones separadas para los archivos del sistema (/) y los archivos personales. Sin embargo esto no aplicaba de la misma manera en Garuda. Al hacer la partición, evité que el instalador de Garuda ubicara /home en su propio subvolumen. Los subvolúmenes de Btrfs son similares a una partición, pues permiten administrarla de manera independiente gracias a que establecen un tipo de división lógica, con la capacidad extra de acceder al almacenamiento disponible de forma dinámica.8 En Garuda se crean por defecto snapshots de /, cada vez que se hace una actualización del sistema. Para ilustrar como funciona esto hay que considerar el arreglo de subvolúmenes que hace Garuda al instalar el sistema:9

Nombre del subvolumen Punto de montaje
@ /
@root /root
@srv /srv
@cache /var/cache
@log /var/log
@tmp /var/tmp
@home /home

La función de este arreglo de subvolúmenes es omitir los directorios correspondientes de las snapshots de /. Estos contienen archivos que no conviene revertir al volver a un estado anterior del sistema. /home contiene los archivos y configuraciones personales de los usuarios. /root es análogo a /home para el usuario root. /var/cache contiene archivos transitorios de las aplicaciones. /var/log es para los registros del sistema. /var/tmp contiene archivos temporales que las aplicaciones preservan entre reinicios. /srv contiene archivos relacionados con servicios de red proporcionados por el sistema.10

Tener /home en una partición separada me impidía administrarla con las herramientas de Garuda que dependen de este arreglo, aunque la partición fuera también Btrfs. Además me empecé a quedar con espacio limitado en el disco para mis archivos. La solución que encontré a esto, evitando reinstalar todo el sistema, está documentada en el foro de Garuda.

Respaldar Doom Emacs

Lograr utilizar lo aprendido sobre Btrfs para idear una simple estrategia para respaldar mi editor de texto me inspiró a escribir este post. Utilizó Doom Emacs: una esquema de configuración para el clásico editor de texto hacker Emacs. El problema con Doom es similar a Arch: muchos de los paquetes se actualizan regularmente siguiendo al upstream, además de que la configuración de Emacs puede ser temperamental per se. Esto me ha llevado en muchas ocasiones (significativamente más de las que me han sucedido con Arch), a que Doom deje de funcionar después de una actualización. La siguiente estrategia sólo aplica a sistemas operativos tipo-unix donde /home/user (denotado ~) es (parte de) un sistema de archivos Btrfs.

La estrategia

Lo primero es mudar Doom Emacs a un subvolumen, para ello hay que:

Cambiar el nombre del directorio donde se guardan los componentes de Doom,

mv ~/.emacs.d ~/.emacs.d.bak

crear un subvolumen para la nueva ubicación con el nombre que liberamos

sudo btrfs subvolume create ~/.emacs.d

y copiar todos los archivos (con sus propiedades) a la nueva ubicación:

cp -a ~/.emacs.d.bak/* ~/.emacs.d

Este último paso es relativamente innecesario, pues Doom es declarativo y su especificación se encuentra en ~/.doom.d:11 bastaría correr doom sync -u para volver a poblar esta ubicación. Sin embargo es una descarga grande, que toma algo de tiempo y que podemos omitir.

Si Doom está funcionando correctamente, podemos borrar el respaldo con rm -rf ~/.emacs.d.bak.

La estrategia consiste en crear una snaphot de solo escritura, o read-only,7 antes una actualización.

sudo btrfs subvolume snapshot -r ~/.emacs.d/ ~/.emacs.d.bak.ro

En caso de que la actualización deje a Doom fuera de combate, los siguientes pasos lo reviertiran a su estado anterior:

  1. Borrar la configuración defectuosa: sudo btrfs subvolume delete ~/emacs.d/
  2. Restaurar la vieja configuración: sudo btrfs subvolume snapshot ~/.emacs.d.bak.ro ~/.emacs.d

Doom Emacs es un editor fantástico, y ahora no tengo reservas en actualizarlo más cotidianamente. Por su parte Btrfs me ha demostrado las posbilididades de los sistemas de archivos.


  1. Cuando tuve que formatear un disco externo para respaldo de video de alta definición descubrí que exFAT es LA opción de sistema de archivos para soporte multiplataforma. FAT32 es mejor en cuanto a compatibilidad, pero limita los archivos a un tamaño máximo de 4 GB. 

  2. Garuda es una de las primeras distribuciones que ofreció Btrfs como sistema de archivos por defecto. Este es un sistema de archivos copy-on-write(CoW), lo que permite la creación ágil de snapshots. Otro sistema de archivos CoW muy querido por los administradores de sistemas es ZFS, creado originalmente por Sun Microsystems. 

  3. Quizás sería más claro pensar Garuda Linux como una configuración empaquetada de Arch Linux. Sin embargo hay características que le hacen merecer el título de distribución derivada:

    • Incluye dos repositorios adicionales: garuda (desde donde distribuyen sus propias configuraciones y scripts) y chaotic-aur.
    • Utilizan Calamares para instalación con interfaz gráfica.
    • Además de la curaduría de paquetes pre-instalados, mantienen varios programas propios para la administración del sistema.
    • Su script de instalación, garuda-update, envuelve al comando regular de actualización de Arch (sudo pacman -Syu). Esto les permite incluir arreglos desde la actualización.
    • Mientras no se utilizen las herramientas de Garuda, la experiencia de uso y administración es identica a la de Arch.

  4. A esto se le conoce como modelo rolling release

  5. Otra razón es que su instalación, sin la mediación de una distribución preconfigurada como Garuda Linux o EndeavorOS, involucra la elección e instalación de todos los componentes del sistema desde una terminal. 

  6. Las ventajas de Btrfs tienen sus costos: este sistema de archivos requiere de más acciones de mantenimiento por parte del usuario, en comparación a ext4 (el estándar en Linux). Por ejemplo, es necesario borrar las snapshots viejas, ya que con el paso del tiempo sus diferencias con el sistema en operación crecen y llegan a ocupar mucho espacio en disto. En Garuda el mantenimiento está automatizado utilizando herramientas como btrfsmaintenance y snapper

  7. En Btrfs, una snapshot es esencialmente un subvolumen. Ver Fedora Magazine: Workging with Btrfs - Snapshots  2

  8. Por ejemplo, resulta trivial añadir un nuevo dispositivo de almacenamiento al sistema y redistribuir los archivos entre todos los dispositivos disponibles: simplemente se lo conecta, se añade al pozo de dispositivos y luego se da la instrucción de balancear el sistema de archivos. Para detalles ver este tutorial

  9. En Garuda el arreglo de subvolúmenes, utilizado por snapper, es plano y está probablemente inspirado en el arreglo de openSUSE

  10. Estos roles están especificados en la Filesystem Hierarchy Standard (FHS) a la que se apega Arch Linux. 

  11. En este directorio se ubican tres archivos: uno para la especificación de componentes (init.el), otro para las opciones de configuración (config.el) y uno para paquetes adicionales (packages.el).