A partir de la versión OpenSUSE 13.2 el sistema de ficheros por defecto es el nuevo Btrfs. Este sistema es el sustituto del ext4. Btrfs, b-tree fs, basado en la funcionalidad copy-on-write y entendido como un “better FS”, aporta rapidez, robustez y muchas posibilidades. Entre ellas la que hoy nos ocupa, los “snapshots”.

Introducción

A partir de la versión OpenSUSE 13.2 el sistema de ficheros por defecto es el nuevo Btrfs. Este sistema es el sustituto del ext4. Btrfs, b-tree fs, basado en la funcionalidad copy-on-write y entendido como un “better FS”, aporta rapidez, robustez y muchas posibilidades. Entre ellas la que hoy nos ocupa, los “snapshots”.

El término “snapshot” se utiliza en distintos entornos, y hace mucho tiempo que ha estado disponible. Sin embargo, en estos momentos, el soporte que ofrece Opensuse 13.2 y superiores (ya ha salido la OpenSUSE Leap 34.1) permite aplicarlos para casos de uso muy cotidianos y útiles.

Para probar las bondades de los snapshots, montamos un servidor de pruebas, y creamos una partición de tipo Btrfs.

Tutorial

Formateamos la partición:

miserver /root# cfdisk /dev/sdb
Disk: /dev/sdb
Size: 15 GiB, 16106127360 bytes, 31457280 sectors
Label: dos, identifier: 0x0a20e307

Device       Boot     Start     Sectors      Size      Id Type        
>> /dev/sdb1 2048     31457279  31455232     15G       83 Linux       

Creamos el file system, de tipo Btrfs:

miserver /root# mkfs.btrfs  /dev/sdb1 
btrfs-progs v4.1.2+20151002
See http://btrfs.wiki.kernel.org for more information.

Label:              (null)
UUID:               ffce50d9-ab70-4712-a4d1-8b87b638d655
Node size:          16384
Sector size:        4096
Filesystem size:    15.00GiB
Block group profiles:
 Data:             single            8.00MiB
 Metadata:         DUP               1.01GiB
 System:           DUP              12.00MiB
SSD detected:       no
Incompat features:  extref, skinny-metadata
Number of devices:  1
Devices:
  ID        SIZE  PATH
   1    15.00GiB  /dev/sdb1
miserver /root# 

Montamos el file system y comprobamos que es ‘btrfs’:

miserver /root# mkdir /mibtrfs
miserver /root# mount /dev/sdb1  /mibtrfs
miserver /root# mount | grep mibt
/dev/sdb1 on /mibtrfs type btrfs (rw,relatime,space_cache,subvolid=5,subvol=/)
miserver /root#

Cada partición de la que queramos mantener snapshots, debe tener una configuración propia. Al iniciar el sistema, no hay ninguna configuración disponible. El sistema nos obliga a tener una configuración por cada partición sobre la que queramos tomar “snapshots”, porque pueden tener parámetros de configuración distintos.

miserver /root# snapper list-configs
Config | Subvolume
-------+----------

Vamos a crear una configuración para mantener los snapshots de nuestra partición /mibtrfs:

miserver /root# snapper -c mibtrfs  create-config /mibtrfs/
miserver /root# snapper list-configs
Config  | Subvolume
--------+----------
mibtrfs | /mibtrfs 
miserver /root#

Dada esta configuración, listamos los snapshots disponibles:

miserver /root# snapper -c mibtrfs list
Type   | # | Pre # | Date | User | Cleanup | Description | Userdata
-------+---+-------+------+------+---------+-------------+---------
single | 0 |       |      | root |         | current     |         

Ahora creamos el primer snapshot:

miserver /root# snapper -c mibtrfs create  --description "snapshot despues de crear el filesystem" 

Volvemos a listar los snapshots disponibles:

miserver /root# snapper -c mibtrfs list
Type   | # | Pre # | Date                     | User | Cleanup | Description                             | Userdata
-------+---+-------+--------------------------+------+---------+-----------------------------------------+---------
single | 0 |       |                          | root |         | current                                 |         
single | 1 |       | Tue Mar 29 17:05:27 2016 | root |         | snapshot despues de crear el filesystem |         
miserver /root# 

Comprobamos si hay diferencias entre el snapshot 1 y el estado actual, y no hay diferencias, porque no ha habido actividad en el file system.

miserver /root# snapper -c mibtrfs  status 1..0
miserver /root# 

Creamos un fichero y comprobaremos otra vez las diferencias. Ahora, nos aparece el fichero nuevo que hemos creado.

miserver /root# touch /mibtrfs/PROVA

miserver /root# snapper -c mibtrfs status 1..0
+..... /mibtrfs/PROVA
miserver /root# 
miserver /root# 

Volvemos a copiar algunos ficheros más y volvemos a comprobar:

cp -a  /usr/lib64/yui/ /mibtrfs/

miserver /root# snapper -c mibtrfs status 1..0
+..... /mibtrfs/PROVA
+..... /mibtrfs/yui
+..... /mibtrfs/yui/libyui-ncurses-pkg.so.7
+..... /mibtrfs/yui/libyui-ncurses-pkg.so.7.0.0
+..... /mibtrfs/yui/libyui-ncurses.so.7
+..... /mibtrfs/yui/libyui-ncurses.so.7.0.0
miserver /root#

Ahora creamos un snapshot:

miserver /root# snapper -c mibtrfs create --description  "PROVA y  libyui creados" 
miserver /root# snapper -c mibtrfs list
Type   | # | Pre # | Date                     | User | Cleanup | Description                             | Userdata
-------+---+-------+--------------------------+------+---------+-----------------------------------------+---------
single | 0 |       |                          | root |         | current                                 |         
single | 1 |       | Tue Mar 29 17:05:27 2016 | root |      | snapshot despues de crear el filesystem |         
single | 2 |       | Wed Mar 30 10:54:18 2016 | root | PROVA y  libyui creados                          |         

Veamos las diferencias entre los 2 snapshots disponibles, y vemos los cambios, que corresponden a los ficheros nuevos. Lo mismo, si hubiéramos hecho borrados y/o modificaciones.

miserver /root# snapper -c mibtrfs status 1..0
+..... /mibtrfs/PROVA
+..... /mibtrfs/yui
+..... /mibtrfs/yui/libyui-ncurses-pkg.so.7
+..... /mibtrfs/yui/libyui-ncurses-pkg.so.7.0.0
+..... /mibtrfs/yui/libyui-ncurses.so.7
+..... /mibtrfs/yui/libyui-ncurses.so.7.0.0

Si los cambios no nos interesan, podríamos volver atrás en el tiempo y restaurar el estado existente en el snapshot número 1:

miserver /root# snapper -c mibtrfs -v undochange 1..2
create:0 modify:0 delete:6
deleting /mibtrfs/yui/libyui-ncurses.so.7.0.0
deleting /mibtrfs/yui/libyui-ncurses.so.7
deleting /mibtrfs/yui/libyui-ncurses-pkg.so.7.0.0
deleting /mibtrfs/yui/libyui-ncurses-pkg.so.7
deleting /mibtrfs/yui
deleting /mibtrfs/PROVA
miserver /root# 

Aparte de los snapshots que se hacen bajo demanda, el sistema, a través del cron y usando la utilidad snapper, va haciendo cada hora, un snapshot de seguridad, a no ser que lo desactivemos explícitamente. Veamos los snapshots disponibles después de varias horas de actividad:

miserver /etc/cron.daily# snapper -c mibtrfs list
Type   | # | Pre # | Date                     | User | Cleanup  | Description                             | Userdata
-------+---+-------+--------------------------+------+----------+-----------------------------------------+---------
single | 0 |       |                          | root |          | current                                 |         
single | 1 |       | Tue Mar 29 17:05:27 2016 | root |          | snapshot despues de crear el filesystem |         
single | 2 |       | Wed Mar 30 10:54:18 2016 | root |          | PROVA y  libyui creados |         
single | 3 |       | Wed Mar 30 11:30:01 2016 | root | timeline | timeline                                |         
single | 4 |       | Wed Mar 30 12:30:01 2016 | root | timeline | timeline                                |         
single | 5 |       | Wed Mar 30 13:30:01 2016 | root | timeline | timeline                                |         
miserver  /etc/cron.daily#

Hemos aplicado los snapshots en una partición de usuario o de datos. OpenSUSE permite el file system Btrfs en la partición root y /usr permitiendo aplicar los beneficios de los snapshots a esta partición. Esto permite que cada vez que hagamos un update de sistema, o cuando hacemos un mantenimiento con resultados desconocidos, podamos hacer un snapshot antes del cambio, para luego poder volver a ese punto de recuperación.

Aplicaciones de los snapshots

Conclusión

Las nuevas versiones de las distribuciones, entre ellas, openSUSE 13.2, openSUSE Leap 42.1, Ubuntu 14 entre otras, nos ofrecen la posibilidad de trabajar de forma nativa con el file system Btrfs. Este sistema, que usa la funcionalidad “copy_on_write”, permite realizar snapshots, de una forma muy eficiente y robusta. Un snapshot nos ofrece un punto de recuperación al que volver cuando el sistema ha llegado a un punto erróneo.

En el futuro inmediato, habrá que tener en cuenta este sistema, para saber aprovecharlo al máximo. También el file system, Btrfs, dispone de otras funcionalidades que se deberán aprovechar, como son los subvolumes. Por otro lado, tiene que quedar claro que el snapshot no sustituye a la herramienta de backup, solamente la complementa.