SDB:Snapshot e Rollback con Snapper


Provato su openSUSE Articoli consigliati Articoli correlati
Icon-checked.png

Icon-manual.png Icon-help.png


Introduzione

Essere in grado di creare degli snapshots del file system su Linux e successivamente ripristinare attraverso dei Rollback fa parte di una caratteristica fortemente richiesta in passato. Il programma Snapper, in combinazione con il file system Btrfs, colma questa lacuna.

Btrfs, l'innovativo file system copy-on-write per Linux, supporta gli snapshots del file system (una copia dello stato di un volume secondario ad un certo punto del tempo) di uno o più file system montabili separatamente all'interno di ogni partizione fisica. Snapper consente di gestire queste istantanee. Esso è configurabile tramite riga di comando o un'interfaccia attraverso YaST.

Per impostazione predefinita Snapper e Btrfs su openSUSE sono impostati per servire come "strumento undo" per modifiche apportate al sistema con YaST e zypper. Prima e dopo l'esecuzione di un modulo di YaST o zypper, viene creato uno snapshot. Snapper permette di confrontare le due istantanee e fornisce i mezzi per annullare le differenze tra le due istantanee. Gli strumenti forniscono anche backup di sistema con la creazione di snapshots orari dei sottovolumi di sistema.

Requisiti

Dal momento che Btrfs è l'unico filesystem su openSUSE che supporta gli snapshots, è richiesto su tutte le partizioni o subvolumes che si desidera "istantanea".

Gli snapshots e spazio libero

Quando viene creato uno snapshot, sia l'istantanea e il punto originale per gli stessi blocchi si trovano nel file system. Così, inizialmente uno snapshot non occupa spazio su disco. Se il contenuto del file originale viene alterato, i blocchi di dati modificati vengono copiati mentre quelli antecedenti alle modifiche vengono conservati per l'istantanea. Pertanto, un'istantanea occupa la stessa quantità di spazio come dati modificati. Nel tempo, la quantità di spazio di un'istantanea allocata cresce costantemente. Di conseguenza, rimuovere il file contenente lo snapshot dal file system Btrfs non può liberare spazio su disco.

Nota tecnica
  • Gli snapshots risiedono sempre nella stessa partizione o volume secondario che è stato fotografato nell'istantanea. Non è possibile memorizzare le istantanee in differenti volumi o partizioni secondarie.

Come risultato, le partizioni contenenti gli snapshots devono essere più grandi di partizioni considerate "normali". Tali dimensioni dipendono fortemente dal numero di istantanee che si desiderano mantenere e la quantità di modifiche di dati. Come regola generale si consiglia di utilizzare il doppio di quanto si farebbe normalmente.

Come liberare spazio su disco
  • Al fine di liberare spazio su disco in una partizione Btrfs contenente gli snapshots è necessario cancellare quelli meno importanti piuttosto che spendere tempo ad eliminare file. Generalmente gli snapshots più vecchi tendono ad occupare più spazio rispetto a quelli recenti.

Dal momento che df non mostra l'utilizzo corretto del disco sul file system Btrfs, è necessario usare il comando btrfs filesystem df MOUNT_POINT. Attualmente gli strumenti per il file system Btrfs non offrono metodi per visualizzare la quantità di spazio su disco allocata dagli snapshots.

Utilizzo di Snapper per annullare i cambiamenti di YaST e zypper

Se si imposta la partizione di root con Btrfs durante l'installazione, Snapper preconfigurato per effettuare rollback dei cambiamenti di YaST o zypper sarà automaticamente installato. Ogni volta che si avvia un modulo YaST o una transizione zypper, verranno create due istantanee: un “pre-snapshot” e un “post-snapshot”. Il primo cattura l'inizio del modulo, il secondo dopo che quest'ultimo è stato completato.

Utilizzando il modulo Snapper da YaST o attraverso il richiamo da riga di comando è possibile annullare le modifiche apportate da YaST o zypper per il ripristino dei file dal “pre-snapshot”. Confrontando i due snapshot gli strumenti consentono di verificare quali file sono stati modificati. Inoltre è possibile visualizzare le differenze tra due versioni di un file (diff).

Linux è un sistema multitasking, processi diversi da YaST o zypper possono modificare i dati nell'arco temporale tra il pre e post-snapshot. Se questo è il caso è possibile tornare alla pre-istantanea annullando le modifiche da parte di altri processi. Nella maggior parte dei casi questo non è previsto, quindi è vivamente consigliato di rivedere i cambiamenti tra due istantanee prima di iniziare il rollback. Se i cambiamenti provengono da altri processi che si desiderano conservare, selezionare i file da ripristinare.

Nota tecnica
  • Assicuratevi di conoscere le limitazioni di Snapper prima di effettuare il meccanismo di rollback. Per i dettagli, vedere la sezione “Limiti”.
Nota tecnica
  • Per impostazione predefinita, gli ultimi 100 snapshots di YaST e zypper vengono conservati. Se questa soglia viene superata lo snapshot(s) più vecchio verrà cancellato.

Annullamento delle modifiche utilizzando il modulo YaST Snapper

  1. Accedere al modulo Snapper dalla sezione Varie in YaST o inserire da riga di comando con i privilegi di amministratore il comando yast2 snapper (Visualizzazione del modulo con la libreria ncurses).
  2. Assicurarsi che la Configurazione Attuale sia impostata a root. Questo è sempre il caso predefinito a meno che non siano stati aggiunti manualmente configurazioni aggiuntive su Snapper.
  3. Scegliere un paio di pre e post-snaphots dall'elenco. Coppie di snapshot sono tipi Pre e Post. Snapshots di YaST sono etichettati come yast module_name nella colonna Descrizione; snapshots zypper sono etichettati zypp (zypper).

Schermata iniziale Snapper ITA.png

  1. Fare click su Mostra modifiche per aprire l'elenco dei file che differiscono tra le due istantanee. L'immagine seguente mostra un elenco dei file che sono stati modificati dopo l'aggiunta dell'user tester.

Snapper Yast2.png

  1. Rivedere l'elenco dei file. Per visualizzare un “diff” tra il pre e post-versione di un file, selezionarlo dall'elenco. La seguente immagine mostra le modifiche al file /etc/passwd dopo aver aggiunto il tester user.

Panoramica selezionata Snapper ITA.png

  1. Per ripristinare un insieme di file, selezionare i file o le directory, spuntando la relativa casella di controllo. Fare click su Ripristina e confermare l'azione facendo click su .

Snapper yast2 restore.png

Per ripristinare un singolo file, attivare il suo diff facendo click sul suo nome. Fare click su Ripristina e confermare la scelta con Sì.

Annullamento delle modifiche con il comando snapper

  1. Ottenere una lista degli snapshot di YaST e zypper attraverso il comando snapper list -t pre-post. Gli snapshots YaST sono etichettati come yast nome_modulo nella colonna Descrizione; gli snapshots zypper sono etichettati zypp (zypper).
# snapper list -t pre-post
Pre # | Post # | Pre Date                 | Post Date                | Description
------+--------+--------------------------+--------------------------+----------------------+
4     | 5      | Tue Jan 10 14:39:14 2012 | Tue Jan 10 14:39:33 2012 | yast system_settings
65    | 66     | Thu Jan 12 17:18:10 2012 | Thu Jan 12 17:18:23 2012 | zypp(zypper)
68    | 69     | Thu Jan 12 17:25:46 2012 | Thu Jan 12 17:27:09 2012 | zypp(zypper)
73    | 74     | Thu Jan 12 17:32:55 2012 | Thu Jan 12 17:33:13 2012 | yast system_settings
75    | 76     | Thu Jan 12 17:33:56 2012 | Thu Jan 12 17:34:42 2012 | yast users
77    | 92     | Thu Jan 12 17:38:36 2012 | Thu Jan 12 23:13:13 2012 | yast snapper
83    | 84     | Thu Jan 12 22:10:33 2012 | Thu Jan 12 22:10:39 2012 | zypp(zypper)
85    | 86     | Thu Jan 12 22:16:58 2012 | Thu Jan 12 22:17:09 2012 | zypp(zypper)
88    | 89     | Thu Jan 12 23:10:42 2012 | Thu Jan 12 23:10:46 2012 | zypp(zypper)
90    | 91     | Thu Jan 12 23:11:40 2012 | Thu Jan 12 23:11:42 2012 | zypp(zypper)
108   | 109    | Fri Jan 13 13:01:06 2012 | Fri Jan 13 13:01:10 2012 | zypp(zypper)
  1. Ottenere un elenco di file modificati per un paio di snapshot con snapper status PRE..POST. File con modifiche sono evidenziati con c, file che sono stati aggiunti sono evidenziati con +, mentre quelli rimossi con -. L'esempio seguente mostra un paio di snapshots per l'installazione del pacchetto ncftp.
# snapper status 108..109
+... /usr/bin/ncftp
+... /usr/bin/ncftpbatch
+... /usr/bin/ncftpget
+... /usr/bin/ncftpls
[...]
+... /usr/share/man/man1/ncftpspooler.1.gz
c... /var/cache/zypp/solv/@System/cookie
c... /var/cache/zypp/solv/@System/solv
c... /var/lib/rpm/Basenames
c... /var/lib/rpm/Dirnames
c... /var/lib/rpm/Filemd5s
c... /var/lib/rpm/Group
c... /var/lib/rpm/Installtid
c... /var/lib/rpm/Name
c... /var/lib/rpm/Packages
c... /var/lib/rpm/Providename
c... /var/lib/rpm/Provideversion
c... /var/lib/rpm/Requirename
c... /var/lib/rpm/Requireversion
c... /var/lib/rpm/Sha1header
c... /var/lib/rpm/Sigmd5
c... /var/lib/zypp/SoftLocks
  1. Per visualizzare il diff per determinati file, avviare snapper diff PRE..POST FILENAME. Se non si specifica FILENAME, saranno visualizzati i diff di tutti i file.
# snapper diff 108..109 /var/lib/zypp/SoftLocks
--- /.snapshots/108/snapshot/var/lib/zypp/SoftLocks	2012-01-12 23:15:22.408009164 +0100
+++ /.snapshots/109/snapshot/var/lib/zypp/SoftLocks	2012-01-13 13:01:08.724009131 +0100
@@ -1,4 +1,2 @@
-# zypp::SoftLocksFile generated Thu Jan 12 23:10:46 2012
-#
-ncftp
-#
+# zypp::SoftLocksFile generated Fri Jan 13 13:01:08 2012
+##
  1. Per ripristinare uno o più file avviare snapper -v undochange PRE..POST FILENAME. Se non si specifica un nome di file, verranno visualizzati tutti i cambiamenti ripristinati.
# snapper -v undochange 108..109
create:0 modify:16 delete:21
undoing change...
deleting /usr/share/man/man1/ncftpspooler.1.gz
deleting /usr/share/man/man1/ncftpput.1.gz
[...]
deleting /usr/bin/ncftpls
deleting /usr/bin/ncftpget
deleting /usr/bin/ncftpbatch
deleting /usr/bin/ncftp
modifying /var/cache/zypp/solv/@System/cookie
modifying /var/cache/zypp/solv/@System/solv
modifying /var/lib/rpm/Basenames
modifying /var/lib/rpm/Dirnames
modifying /var/lib/rpm/Filemd5s
modifying /var/lib/rpm/Group
modifying /var/lib/rpm/Installtid
modifying /var/lib/rpm/Name
modifying /var/lib/rpm/Packages
modifying /var/lib/rpm/Providename
modifying /var/lib/rpm/Provideversion
modifying /var/lib/rpm/Requirename
modifying /var/lib/rpm/Requireversion
modifying /var/lib/rpm/Sha1header
modifying /var/lib/rpm/Sigmd5
modifying /var/lib/zypp/SoftLocks

Utilizzo di Snapper per ripristinare i file da backup orari

Oltre le istantanee di YaST e zypper, il programma Snapper crea delle istantanee orarie della partizione di sistema (/). E' possibile adoperarle per ripristinare i file che sono stati accidentalmente cancellati o modificati olltre il recupero. Facendo uso della funzione diff di Snapper si possono scoprire quali modifiche sono state apportate ad un certo punto del tempo.

Per impostazione predefinita, le ultime dieci istantanee di ogni giorno vengono conservate. Inoltre dieci istantanee sono tenute negli ultimi dieci giorni, mesi e anni.

Gestione degli snapshots

Con Snapper non è solo possibile creare ed eliminare le istantanee, ma anche impostare e modificare i metadati. Tutte le operazioni di di Snapper vengono eseguite per una determinata configurazione. Se non se ne specifica una ad-hoc verrà utilizzata quella di default (root). Se si desidera gestire gli snapshot per la propria configurazione è necessario specificare con l'opzione -c la configurazione globale.

snapper -c myconfig list

Per informazioni dettagliate su snapper consultare la pagina relativa di manuale (man snapper).

Snapshot metadata

Ogni istantanea consiste dell'istantanea stessa e alcuni metadati. Con Snapper è possinile impostare e modificare alcuni metadati. Il seguente metadati è disponibile per ogni snapshot:

  • Tipo: Questo dato non può essere modificato. Per i tipi di snapshot, vedere la sezione “Tipi di snapshot”.
  • Numero: Numero unico dello snapshot. Questo dato non può essere modificato.
  • Pre numero: Specifica il numero del corrispondente snapshot pre. Per le istantanee di tipo solo dopo. Questo dato non può essere modificato.
  • Descrizione: Una descrizione di uno snapshot.
  • Userdata: Una descrizione estesa in cui è possibile specificare i dati personalizzati. Tasto = lista di valori: reason = testing_stuff, user = tux
  • Algoritmo-Cleanup: Cleanup-algoritmo per l'istantanea.

Tipi di snapshot

Snapper conosce tre differenti tipi di snapshots: pre, post e single. Fisicamente non differiscono, ma Snapper li gestisce in modo diverso.

  • pre
Istantanea di un filesystem prima di una modifica. Ogni istantanea pre ha uno snapshot post corrispondente. Usato per esempio per snapshots automatici YaST o zypper.
  • post
Istantanea di un filesystem dopo una modifica. Ogni istantanea post ha uno snapshot pre corrispondente. Usato per esempio per snapshots automatici YaST o zypper.
  • single
Snapshots stand-alone. Utilizzato, per esempio, per istantanee automatizzate in orari prestabiliti. Questo è il tipo predefinito quando si necessita di “ingabbiare” gli snapshots.

Algoritmi per pulizia snapshot obsoleti

Snapper fornisce tre algoritmi per pulire vecchi snapshots. Gli algoritmi sono eseguiti in un lavoro cronologico quotidiano (daily cron-job). La frequenza di rimozione è definita all'interno della configurazione di snapper per la partizione o sottovolume. Quanto segue sono i tre algoritmi:

  1. number: Rimuove vecchi snapshots quando se ne raggiungono un certo numero.
  2. Timeline: Rimuove vecchi snapshots quando si supera una certa età, ma mantiene una serie di istantanee orarie, giornaliere, mensili e annuali.
  3. Empty-pre-post: Rimuove coppie di snapshots pre/post con differenze vuote.

Creazione degli snapshots

Attraverso il comando snapper create per una configurazione di default (root) è possibile creare nuovi snapshot. E' consigliabile specificare sempre una descrizione significativa con -d per essere poi in grado di identificare il suo scopo.

Esempio
snapper create -d “Before the Apache config cleanup”
Crea uno snapshot stand-alone (tipo singolo) per una configurazione di default (root) con una descrizione. Poiché non viene specificata alcuna pulizia dell'algoritmo, lo snapshot non verrà mai cancellato automaticamente.
Esempio
snapper -c home create -d “.-file cleanup in ~tux”
Crea uno snapshot stand-alone (tipo singolo) per una configurazione personalizzata chiamata home con una descrizione. Poiché non viene specificata alcuna pulizia dell'algoritmo, lo snapshot non verrà mai cancellato automaticamente.
Esempio
snapper -c home create -d "daily HOME backup" -c timeline
Crea uno snapshot stand-alone (tipo singolo) per una configurazione personalizzata chiamata home con una descrizione. Il file verrà automaticamente rimosso quando incontra uno specifico criterio per la timeline cleanup-algorithm nella configurazione.

Modificare il metadata di uno snapshots

Snapper permette di modificare la descrizione, ripulire l'algoritmo e lo spazio utente di uno snapshot. Tutti gli altri metadata non possono essere cambiati.

snapper modify -c "timeline" 10
Modifica il metadata dello snapshot 10 per la configurazione di default (root). L'algoritmo di cleanup è impostato su timeline.
snapper -c home modify -d "daily backup" -c "" 120
Modifica il metadata dello snapshot 120 per la configurazione personalizzata nominata home. Una nuova descrizione viene impostata e l'algoritmo di pulizia è disinserito.

Cancellare gli snapshots

Per cancellare uno snapshot è necessario conoscere il numero corrispondente. Per ottenerlo basta digitare da riga di comando snapper list. Eseguito questo comando è sufficiente digitare snapper delete NUMBER. Quando si cancella un pre snapshot, si dovrebbe eliminare il suo corrispondente post snapshot (e viceversa).

snapper delete 65
Cancella lo snapshot 65 per la configurazione di default (root).
snapper -c home delete 89 90
Cancella gli snapshots 89 e 90 per una configurazione personalizzata chiamata home.

Se si cancellano gli snapshots in ordine per liberare spazio su disco assicurarsi di cancellare prima i vecchi snapshots. Gli snapshots più vecchi occupano maggiore spazio.

Disabilitare Snapper

Se durante l'installazione di openSUSE la partizione di root è stata configurata con Btrfs, Snapper crea automaticamente snapshots ogni ora del sistema, così come pre e post snapshot per YaST e transazioni zypper. Tutte le funzioni possono essere disabilitate come segue:

Disabilitare Snapshot orari

Modificare /etc/snapper/configs/root e configurare TIMELINE_CREATE in no:
TIMELINE_CREATE="no"

Disabilitare snapshots zypper

Disinstallare il pacchetto snapper-zypper-plugin

Disabilitare snapshot YaST

Modificare /etc/sysconfig/yast2 e configurare USE_SNAPPER in no:
USE_SNAPPER="no"

Creazione di una configurazione per Snapper

Il modo in cui si comporta Snapper è definito in un file di configurazione specifico per ogni partizione o volume secondario Btrfs. Questi file di configurazione risiedono sotto /etc/snapper/configs. La configurazione di default installata con Snapper per la directory / si chiama root. Crea e gestisce le istantanee di YaST e zypper così come l'istantanea di backup orario per /.

Si può creare una propria configurazione per altre partizioni formattate con Btrfs o sottovolumi formattati sempre in Btrfs. L'esempio che segue imposterà una configurazione Snapper per il backup dei dati del webserver che risiede in un altro punto, una partizione formattata Btrfs montata su /srv/www.

E' possibile usare Snapper stesso o il modulo YaST per ripristinare i file da queste istantanee. In YaST è necessario selezionare la configurazione corrente, mentre è necessario specificare la configurazione per Snapper con -c (Ad esempio snapper -c myconfig list).

Per creare una nuova configurazione Snapper lanciare snapper create-config

snapper -c www-data create-config
/srv/www

La prima stringa si riferisce al nome del file di configurazione, mentre la seconda al punto di montaggio di una partizione o sottovolume Btrfs di snapshot.

Questo comando creerà un nuovo file di configurazione /etc/snapper/config-templates/www-data con valori ragionevoli di default (preso da /etc/snapper/config-templates/default).

I valori di default per una nuova configurazione sono tratte da /etc/snapper/config-templates/default. Per utilizzare il proprio set di valori predefiniti, creare una copia di questo file nella stessa directory e adattarlo alle proprie esigenze. Per adoperarlo specificare l'opzione -t con il comando create-config:

snapper -c www-data create-config -t my_defaults /srv/www

Calibrare il file di configurazione

Per effettuare una “messa a punto” del file di configurazione è necessario disporre di un editor di testo. Il file di configurazione contiene le coppie key / value sotto forma di key=value. E' possibile modificare solo il valore.

SUBVOLUME

Punto della partizione o sottovolume. Non modificabile.

FSTYPE

Tipo di filesystem. Non modificabile.

NUMBER_CLEANUP

Definisce se eliminare automaticamente le vecchie istantanee quando il conteggio totale degli snapshot supera un determinato numero con NUMBER_LIMIT e un valore specificato con NUMBER_MIN_AGE. I valori validi sono yes o no.

NUMBER_LIMIT e NUMBER_MIN_AGE sono sempre valutati entrambi. Gli snapshot vengono eliminati solo quando vengono soddisfatte entrambe le condizioni. Se si vuole mantenere un certo numero di istantanee, indipendentemente dalla loro età, impostare NUMBER_MIN_AGE su 0. D'altra parte, se non si desidera mantenere le istantanee al di là di una certa età impostare NUMBER_LIMIT su 0.

NUMBER_LIMIT

Definisce il numero di istantanee da conservare se NUMBER_CLEANUP è impostato su yes.

NUMBER_MIN_AGE

Definisce l'età minima in secondi di un'istantanea.

TIMELINE_CREATE

Se impostato su yes gli snapshot orari verranno creati. Correntemente è l'unica via per creare automaticamente degli snapshots. E' fortemente consigliato settare su yes ma il valore può essere anche no.

TIMELINE_MIN_AGE

Definisce l'età minima in secondi che uno snapshot deve avere prima che questo venga rimosso.

TIMELINE_LIMIT_HOURLY, TIMELINE_LIMIT_DAILY, TIMELINE_LIMIT_MONTHLY, TIMELINE_LIMIT_YEARL

Numero di snapshots da prendere per ora, giorno, mese e anno.

Esempio di configurazione

TIMELINE_CREATE="yes"
TIMELINE_CLEANUP="yes"
TIMELINE_MIN_AGE="1800"
TIMELINE_LIMIT_HOURLY="10"
TIMELINE_LIMIT_DAILY="10"
TIMELINE_LIMIT_MONTHLY="10"
TIMELINE_LIMIT_YEARLY="10"

Questa configurazione consente per esempio di visualizzare le immagini che vengono pulite automaticamente. In questo esempio, l'età minima di un'istantanea prima di poter essere rimosso è settato su 30 minuti (1800 secondi). Dal momento che si creano istantanee orarie si garantisce che vengano mantenute solo le ultime. Se invece TIMELINE_LIMIT_DAILY è impostato a zero, significa che la prima schermata del giorno è mantenuta.

Istantanee da tenere

  • Orari: Gli ultimi snapshot che sono stati creati.
  • Giornalieri: Il primo snapshot giornaliero che è stato creato, mantenuto degli ultimi dieci giorni.
  • Mensili: Il primo snapshot creato nell'ultimo giorno di un mese, mantenuto degli ultimi dieci mesi.
  • Annuali: Il primo snapshot creato il 31 dicembre, mantenuto degli ultimi dieci anni.

Limiti

Anche se il programma è stabile e collaudato, Btrfs e Snapper sono costantemente in via di sviluppo. Le seguenti limitazioni sono quelle esistenti in questo momento. L'elenco che segue è organizzato per risolvere alcuni aspetti per i futuri rilasci.

Consistenza dei dati

Non vi è alcun meccanismo per garantire la coerenza dei dati durante la creazione di snapshot. Ogni volta che un file viene scritto (ad esempio un database) contemporaneamente viene creata l'istantanea: il risultato sarà un file danneggiato o scritto in parte. Il ripristino di un file può causare problemi. Pertanto si raccomanda vivamente di rivedere sempre da vicino l'elenco dei file modificati e dei loro diff. Ripristinare solo quei file che veramente hanno bisogno di appartenenza all'azione che si desidera, eseguire il rollback.

Reverting user addition

Generalmente la cartella /home risiede in una partizione separata. Quest'ultima non fa parte della configurazione di base. Pertanto la partizione home dell'utente non verrà eliminata quando viene effettuata l'aggiunta di un utente. Si raccomanda vivamente di utilizzare l'utente YaST e lo strumento Gestione di utenti e gruppi per rimuovere l'utente.

YaST Italiano.png

Frequently Asked Questions

  • Perché snapper non mostra variazioni di /var/log, /tmp e altre directory?
Per alcune directory è stato deciso di disabilitare snapshot, ad esempio /var/log perché il feedback dei registri renderebbe la ricerca di problemi molto complessa. Per escludere un percorso dagli snapshot si crea un volume secondario. Le seguenti cartelle sono escluse:
  • /opt
  • /srv
  • /tmp
  • /var/crash
  • /var/log
  • /var/run
  • /var/spool
  • /var/tmp
  • E possibile avviare uno snapshot dal Bootloader?
Attualmente non è possibile. Il bootloader correntemente non supporta il booting da una partizione Btrfs