Snapper es una herramienta de línea de comandos de Linux para crear y administrar instantáneas de sus sistemas de archivos.
Con el comando snapper, puede crear instantáneas de solo lectura. Puede usar estas instantáneas para restaurar archivos específicos o todos los archivos durante cualquier situación de desastre.
También puede usarlo para comparar varias instantáneas y volver a una instantánea anterior específica.
Snapper solo es compatible con btrfs (sistemas de archivos B-tree copy-on-write), sistemas de archivos ext4 y thin- volúmenes lógicos basados en LVM aprovisionados.
Cuando se toma una instantánea con el comando snapper, residirá en el mismo sistema de archivos, por lo que debería haber suficiente espacio libre disponible y es posible que se requiera una limpieza regular de FS.
Si está interesado en usar una instantánea basada en rsync, también debe consultar la utilidad rsnapshot que discutimos anteriormente.
Instalar la utilidad Snapper
Puede descargar el binario Snapper para varias distribuciones e instalarlo, o descargar el código fuente y compilarlo usted mismo.
Por ejemplo, puede descargar los rpm de Snapper desde el repositorio de SUSE SLES11 SP2.
# rpm -ivh snapper-0.1.6-2.1.x86_64.rpm
Las siguientes son dependencias para el paquete Snapper. Cuando usa yum u otras herramientas de administración de paquetes, todas las dependencias se instalarán automáticamente.
- libsnapper-devel-0.1.6-2.1.x86_64.rpm
- pam_snapper-0.1.6-2.1.x86_64.rpm
- snapper-debuginfo-0.1.6-2.1.x86_64.rpm
- snapper-debugsource-0.1.6-2.1.x86_64.rpm
Crear sistema de archivos btrfs
Dado que btrfs es un sistema de archivos compatible con SLES11 SP2, puede usar btrfs para crear su volumen lógico o usar los comandos btrfs-convert para convertir su sistema de archivos ext3 existente a btrfs.
Ejecute los siguientes comandos para crear un nuevo sistema de archivos btrfs. Si no tiene instalado el programa btrfs, utilice zypper install btrfsprogs para instalarlo.
# lvcreate -L 8G -n snapvol vglocal Logical volume "snapvol" created # mkfs.btrfs /dev/vglocal/snapvol # mount /dev/vglocal/snapvol /snapmount
Crear LVM de aprovisionamiento fino
Si desea crear un LVM de aprovisionamiento delgado, use el comando lvcreate para hacer lo siguiente.
# lvcreate --thin vglocal/vgthinpool --size 20G Rounding up size to full physical extent 32.00 MiB Logical volume "vgthinpool" create # lvcreate --thin vglocal/vgthinpool --virtualsize 8G --name lvthin_snap Logical volume "lvthin_snap" created # lvs LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert opt vglocal -wi-ao--- 2.73g tmp vglocal -wi-ao--- 2.73g usr_local vglocal -wi-ao--- 2.73g var vglocal -wi-ao--- 2.73g lvthin_snap vglocal Vwi-a-tz- 8.00g vgthinpool 0.00 vgthinpool vglocal twi-a-tz- 20.00g 0.00 # mkfs.ext3 /dev/vglocal/lvthin_snap # mkdir /snapmount # mount /dev/vglocal/lvthin_snap /snapmount
Crear archivo de configuración de Snapper
Para crear el archivo de configuración usando el comando snapper, use el comando "snapper -c" como se muestra a continuación.
Sintaxis en btrfs:
snapper –c create-config
En btrfs, solo especificará el nombre del archivo de configuración y el punto de montaje como se muestra a continuación.
snapper -c snapconfig create-config /snapmount
Sintaxis en LVM de aprovisionamiento delgado:
snapper –c create-config --fstype="lvm(xfs)"
En LVM de aprovisionamiento delgado, además de especificar el nombre del archivo de configuración y el punto de montaje, también debe especificar el tipo de sistema de archivos usando –fstype como se muestra a continuación:
snapper -c snapconfig1 create-config --fstype="lvm(xfs)" /snapmount1
Ver y eliminar archivos de configuración de Snapper
Después de crear los archivos de configuración, verá el directorio .snapshots creado en el directorio /snapmount.
También notará que el archivo de configuración se crea en /etc/snapper/configs/snapconfig. La información sobre todo el subvolumen que está configurado para la instantánea se almacenará en este archivo.
El archivo de registro utilizado para solucionar problemas se encuentra en /var/log/snapper.log
Para ver todos los archivos de configuración, ejecute el siguiente comando snapper:
# snapper list-configs Config | Subvolume ------------+------------ snapconfig | /snapmount ? btrfs filesystem snapconfig1 | /snapmount1 ? Thin provisioned filesystem
Para eliminar un archivo de configuración, use la siguiente sintaxis:
snapper –c delete-config
Por ejemplo, el siguiente comando elimina el archivo de configuración snapconfig en el directorio /etc/snapper/configs.
# snapper -c snapconfig delete-config
Crear una instantánea usando Snapper
Para crear una instantánea del sistema de archivos, use la siguiente sintaxis del comando snapper:
snapper –config create –description "description of the snapshot"
Por ejemplo, lo siguiente tomará una nueva instantánea.
# snapper --config snapconfig create --description "Snapshot taken on 02-24-0354"
Una vez que tome una instantánea, vea la información de la instantánea como se muestra a continuación:
# snapper --config snapconfig list Type | # | Pre # | Date | User | Cleanup | Description | Userdata -------+---+-------+--------------------------+------+---------+------------------------------+--------- single | 0 | | | root | | current | single | 1 | | Mon Feb 24 15:57:00 2014 | root | | Snapshot taken on 02-24-0354 |
Tomar la segunda instantánea para comparar
Con fines de prueba, anulé el archivo de prueba1 en el directorio /snapmount.
# cat /dev/null > testfile1 # ls -ltr -rw-r--r-- 1 root root 11 Feb 24 11:28 testfile2 -rw-r--r-- 1 root root 43 Feb 24 11:28 testfile3 drwxr-x--- 1 root root 2 Feb 24 15:57 .snapshots -rw-r--r-- 1 root root 0 Feb 24 16:25 testfile1
Después del cambio anterior, tomemos otra instantánea.
# snapper --config snapconfig create --description "Snapshot taken on 02-24-0427"
Como puede ver a continuación, ahora tenemos dos instantáneas.
# snapper --config snapconfig list Type | # | Pre # | Date | User | Cleanup | Description | Userdata -------+---+-------+--------------------------+------+---------+------------------------------+--------- single | 0 | | | root | | current | single | 1 | | Mon Feb 24 15:57:00 2014 | root | | Snapshot taken on 02-24-0354 | single | 2 | | Mon Feb 24 16:27:48 2014 | root | | Snapshot taken on 02-24-0427 |
Comparar la primera y la segunda instantánea
Ahora, comparemos ambas instantáneas.
El siguiente comando compara la instantánea #1 con la instantánea #2.
# snapper -c snapconfig status 1..2 c.... /snapmount/testfile1
En la salida:
- “c” en la salida indica que el contenido ha sido modificado.
- “+” indica que se agregaron nuevos archivos al directorio.
- “-” indica que hay archivos que se han eliminado.
Tome varias instantáneas y compare resultados
Creé varias instantáneas de prueba con pocos archivos agregados, pocos archivos eliminados y pocos cambios de contenido.
# snapper --config snapconfig list Type | # | Pre # | Date | User | Cleanup | Description | Userdata -------+---+-------+--------------------------+------+---------+------------------------------+--------- single | 0 | | | root | | current | single | 1 | | Mon Feb 24 15:57:00 2014 | root | | Snapshot taken on 02-24-0354 | single | 2 | | Mon Feb 24 16:27:48 2014 | root | | Snapshot taken on 02-24-0427 | single | 3 | | Mon Feb 24 16:37:53 2014 | root | | Snapshot taken on 02-24-0437 | single | 4 | | Mon Feb 24 16:38:17 2014 | root | | Snapshot taken on 02-24-0440 |
El siguiente resultado enumera los archivos que se agregan, modifican y eliminan.
# snapper -c snapconfig status 4..1 -.... /snapmount/a -.... /snapmount/b -.... /snapmount/c c.... /snapmount/testfile1 +.... /snapmount/testfile2
Ver la diferencia entre instantáneas
Ahora, para ver la diferencia de contenido específico en el archivo entre la instantánea n.º 1 y la instantánea n.º 4, puede usar el siguiente comando.
# snapper -c snapconfig diff 4..1 /snapmount/testfile1 --- /snapmount/.snapshots/4/snapshot/testfile1 2014-02-24 16:25:44.416490642 -0500 +++ /snapmount/.snapshots/1/snapshot/testfile1 2014-02-24 11:27:35.000000000 -0500 @@ -0,0 +1 @@ +This is a test file
La salida tiene el formato típico de una salida de comando diff.
Restaurar un archivo específico desde una instantánea
Una vez que haya visto las diferencias entre las instantáneas y sepa qué archivo específico desea restaurar, puede restaurarlo como se explica aquí.
Antes de la restauración, no tenemos el testfile2 en esta lista.
# ls -ltr -rw-r--r-- 1 root root 43 Feb 24 11:28 testfile3 -rw-r--r-- 1 root root 0 Feb 24 16:25 testfile1 drwxr-x--- 1 root root 10 Feb 24 16:45 .snapshots
Por ejemplo, para restaurar un solo archivo de la instantánea, es decir, /snapmount/testfile2 (el archivo que se eliminó) de la instantánea n.º 1, use el siguiente comando:
# snapper -c snapconfig -v undochange 1..4 /snapmount/testfile2 create:1 modify:0 delete:0 creating /snapmount/testfile2
Después de la restauración, vemos el testfile2 en la lista.
# ls -ltr -rw-r--r-- 1 root root 43 Feb 24 11:28 testfile3 -rw-r--r-- 1 root root 0 Feb 24 16:25 testfile1 drwxr-x--- 1 root root 10 Feb 24 16:45 .snapshots -rw-r--r-- 1 root root 11 Feb 24 16:55 testfile2
Restaurar todos los archivos desde una instantánea
Para restaurar todos los archivos de la instantánea, haga lo siguiente:
Ahora, restauremos todos los archivos de una instantánea en particular. Observe cómo esto elimina algunos archivos, crea un archivo y modifica un archivo.
# snapper -c snapconfig -v undochange 1..4 create:1 modify:1 delete:3 deleting /snapmount/c deleting /snapmount/b deleting /snapmount/a modifying /snapmount/testfile1 creating /snapmount/testfile2