Snapper è uno strumento da riga di comando Linux per creare e gestire istantanee dei tuoi filesystem.
Usando il comando snapper, puoi creare snapshot di sola lettura. Puoi utilizzare questi snapshot per ripristinare file specifici o tutti i file durante qualsiasi situazione di emergenza.
Puoi anche usarlo per confrontare più snapshot e tornare a uno specifico vecchio snapshot.
Snapper è supportato solo su btrfs (file system B-tree copy-on-write), filesystem ext4 e thin- volumi logici basati su LVM forniti.
Quando uno snapshot viene acquisito utilizzando il comando snapper, risiederà nello stesso filesystem, quindi dovrebbe esserci spazio libero sufficiente e potrebbe essere necessaria una pulizia regolare di FS.
Se sei interessato a utilizzare uno snapshot basato su rsync, dovresti anche controllare l'utilità rsnapshot di cui abbiamo discusso in precedenza.
Installa l'utility Snapper
Puoi scaricare il binario snapper per varie distribuzioni e installarlo, oppure scaricare il codice sorgente e compilarlo tu stesso.
Ad esempio, puoi scaricare gli snapper rpm dal repository SUSE SLES11 SP2.
# rpm -ivh snapper-0.1.6-2.1.x86_64.rpm
Di seguito sono riportate le dipendenze per il pacchetto snapper. Quando utilizzi yum o altri strumenti di gestione dei pacchetti, tutte le dipendenze verranno installate automaticamente.
- 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
Crea filesystem btrfs
Poiché btrfs è un filesystem supportato da SLES11 SP2, puoi usare btrfs per creare il tuo volume logico o usare i comandi btrfs-convert per convertire il tuo file system ext3 esistente in btrfs.
Esegui i seguenti comandi per creare un nuovo filesystem btrfs. Se non hai il programma btrfs installato, usa zypper install btrfsprogs per installarlo.
# lvcreate -L 8G -n snapvol vglocal Logical volume "snapvol" created # mkfs.btrfs /dev/vglocal/snapvol # mount /dev/vglocal/snapvol /snapmount
Crea LVM con thin provisioning
Se desideri creare un LVM con thin provisioning, utilizza il comando lvcreate per eseguire le seguenti operazioni.
# 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
Crea file di configurazione Snapper
Per creare il file di configurazione utilizzando il comando snapper, utilizzare il comando "snapper -c" come mostrato di seguito.
Sintassi su btrfs:
snapper –c create-config
Su btrfs, dovrai semplicemente specificare il nome del file di configurazione e il punto di montaggio come mostrato di seguito.
snapper -c snapconfig create-config /snapmount
Sintassi su LVM con thin provisioning:
snapper –c create-config --fstype="lvm(xfs)"
Su LVM con thin provisioning, oltre a specificare il nome del file di configurazione e il punto di montaggio, dovresti anche specificare il tipo di filesystem usando –fstype come mostrato di seguito:
snapper -c snapconfig1 create-config --fstype="lvm(xfs)" /snapmount1
Visualizza ed elimina i file di configurazione Snapper
Dopo aver creato i file di configurazione, vedrai la directory .snapshots creata nella directory /snapmount.
Noterai anche che il file di configurazione viene creato in /etc/snapper/configs/snapconfig. Le informazioni su tutto il sottovolume configurato per lo snapshot verranno archiviate in questo file.
Il file di registro utilizzato per la risoluzione dei problemi si trova in /var/log/snapper.log
Per visualizzare tutti i file di configurazione, eseguire il seguente comando snapper:
# snapper list-configs Config | Subvolume ------------+------------ snapconfig | /snapmount ? btrfs filesystem snapconfig1 | /snapmount1 ? Thin provisioned filesystem
Per eliminare un file di configurazione, utilizzare la seguente sintassi:
snapper –c delete-config
Ad esempio, il comando seguente elimina il file di configurazione snapconfig nella directory /etc/snapper/configs.
# snapper -c snapconfig delete-config
Crea uno snapshot utilizzando Snapper
Per creare un'istantanea del filesystem, usa la seguente sintassi del comando snapper:
snapper –config create –description "description of the snapshot"
Ad esempio, quanto segue acquisirà una nuova istantanea.
# snapper --config snapconfig create --description "Snapshot taken on 02-24-0354"
Dopo aver scattato un'istantanea, visualizza le informazioni sull'istantanea come mostrato di seguito:
# 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 |
Scatta la seconda istantanea per il confronto
A scopo di test, ho annullato il file test1 nella directory /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
Dopo la modifica di cui sopra, facciamo un'altra istantanea.
# snapper --config snapconfig create --description "Snapshot taken on 02-24-0427"
Come vedi sotto, ora abbiamo due istantanee.
# 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 |
Confronta la prima e la seconda istantanea
Ora confrontiamo entrambi gli snapshot.
Il comando seguente confronta lo snapshot#1 con lo snapshot#2.
# snapper -c snapconfig status 1..2 c.... /snapmount/testfile1
Nell'output:
- "c" sull'output indica che il contenuto è stato modificato.
- “+” indica che i file newl vengono aggiunti alla directory.
- “-” indica che ci sono file che sono stati eliminati.
Scatta più istantanee e confronta l'output
Ho creato più istantanee di prova con pochi file aggiunti, pochi file rimossi e poche modifiche al contenuto.
# 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 |
Il seguente output elenca i file che vengono aggiunti, modificati ed eliminati.
# snapper -c snapconfig status 4..1 -.... /snapmount/a -.... /snapmount/b -.... /snapmount/c c.... /snapmount/testfile1 +.... /snapmount/testfile2
Visualizza la differenza tra le istantanee
Ora per visualizzare la differenza di contenuto specifica nel file tra snapshot#1 e snapshot#4, puoi utilizzare il comando seguente.
# 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
L'output è nel formato tipico di un output di comando diff.
Ripristina un file specifico da un'istantanea
Una volta che hai visto le differenze tra le istantanee e sai quale file specifico desideri ripristinare, puoi ripristinarlo come spiegato qui.
Prima del ripristino, non abbiamo testfile2 in questo elenco.
# 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
Ad esempio, per ripristinare un singolo file dallo snapshot, ovvero /snapmount/testfile2 (il file che è stato eliminato) dallo snapshot#1, utilizzare il comando seguente:
# snapper -c snapconfig -v undochange 1..4 /snapmount/testfile2 create:1 modify:0 delete:0 creating /snapmount/testfile2
Dopo il ripristino, vediamo il file test2 nell'elenco.
# 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
Ripristina tutti i file da un'istantanea
Per ripristinare tutti i file dallo snapshot, procedi come segue:
Ora ripristiniamo tutti i file da uno snapshot particolare. Nota come questo sta eliminando alcuni file, creando un file e modificando un file.
# 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