Rsnapshot
Rsnapshot e` uno script perl che si appoggia a Rsync per fare backup (remoti o locali) con la possibilita` di storicizzare le vecchie versioni dei files. In un certo senso e` simile a backuppc, ma ci sono differenze che possono fare preferire l'uno o l'altro a seconda delle situazioni. Rsnapshot e` molto semplice, usa un file di configurazione e la command line, non ha alcuna interfaccia per il restore dei files, e a differenza di backuppc non effettua mai backup completi, ma sempre e solo le differenze (tranne alla prima esecuzione, ovviamente).
Rsnapshot e` forse la migliore soluzione per gestire backup remoti attraverso una linea lenta, fermo restando il vincolo che Rsnapshot deve girare sulla macchina che contiene i backup, e non su quella di cui vogliamo fare il backup (a meno che il backup non sia locale sulla stessa macchina). Rsnapshot consente anche in teoria di usare per il backup dei dischi USB o dischi che non siano permanentemente connessi alla macchina (a differenza di backuppc).
Installazione
Su Debian e` sufficiente installare il pacchetto rsnapshot sulla macchina che conterra` il backup e il pacchetto rsync sulla macchina della quale vogliamo fare il backup. (In debian 11 l'hanno tolto, ma poi in 12 l'hanno rimesso, nel caso per 11 si puo` usare dai backport)
Configurazione per uso via ssh su storage "fisso"
Il file di configurazione e` /etc/rsnapshot.conf, e puo` contenere la definizione dei backup di piu` di un host remoto o locale. Volendo lanciare rsnapshot con diverse configurazioni e` possibile farlo da command line.
Importante: il file di configurazione di Rsnapshot non puo` contenere spazi per separare i vari comandi, ma solo TAB. Questo puo` crearvi non pochi problemi quando lo editate.
Qui di seguito elenco le modifiche fatte per Linux (Rsnapshot e` multipiattaforma) con impostato il comando per dire a Rsync di non seguire i mountpoint. Consiglio di leggere il man e di tenere il file di configurazione originale da parte perche` ci sono molte opzioni che magari vale la pena di studiare meglio per adattare il programma ai vostri scopi.
Basandosi sul file di configurazione originale di Rsnapshot 1.3.1 le modifiche sono:
Modificare eventualmente rsnapshot_root
Scommentare la riga cmd_cp
Scommentare la riga cmd_ssh
Scommentare la riga cmd_du
Scommentare la riga cmd_rsnapshot_diff e modificare il path a /usr/bin/rsnapshot-diff
Scommentare la riga logfile
Scommentare la riga one_fs e impostare il parametro a "1" anziche` "0"
Scommentare la riga link_dest e impostare il parametro a "1" anziche` "0"
Fatto questo, occorre configurare i backup che vogliamo eseguire. Ci sono esempi sempre nel file di configurazione originale, per backup locali o remoti. Eventualmente commentate quegli esempi locali che sono scommentati, e poi create i vostri backup. Io uso rsync su ssh, un esempio potrebbe essere questo:
# centralino backup root@192.168.0.252:/ centralino/
Questa riga esegue il backup dell'intero file system della macchina 192.168.0.252 su una directory che si chiama "centralino" sotto allo "rsnasphot_root" (sotto la directory che indica il numero di versione).
Configurazione degli intervalli di tempo
Rsnapshot con la configurazione di default suppone che noi vogliamo fare piu` di una copia al giorno (diciamo una ogni tot ore, dove "tot" puo` essere anche un'ora sola) e quindi imposta gli intervalli in modo che siano divisi in "orari" "giornalieri" e "settimanali", cosi`:
retain hourly 6 retain daily 7 retain weekly 4
Occorre capire bene come funziona questo meccanismo, perche` non e` ovvio.
Innanzitutto i nomi "orario" "giornaliero" eccetera sono sono parole, e non implicano che rsnapshot tratti effettivamente i dati li` dentro tenendo conto dei giorni, delle settimane, delle ore, eccetera. Semplicemente il primo intervallo specificato in ordine di apparizione (il primo in alto) e` quello "di base", e gli altri sono di fatto sottomultipli di quello di base.
La configurazione di esempio indicata qui sopra prevede che cron lanci un backup ogni 4 ore (ci stanno SEI backup in un giorno, quindi "hourly 6") e poi una "migrazione verso il giornaliero" una volta al giorno (7 giorni in una settimana), e una "migrazione verso il settimanale" una volta a settimana. La scelta di tenere 4 settimanali potrebbe essere giustificata dal voler mettere dopo un mensile (4 settimane al mese). Non mettendolo, dopo 4 settimane i vecchi dati saranno cancellati. Volendo, potremmo tenere i dati per 10 settimane o per il numero di settimane che vogliamo noi.
Volendo fare una sola copia al giorno (quindi eliminando totalmente il concetto di "hourly" potremmo per dire impostare una cosa di questo tipo:
retain daily 7 retain weekly 4 retain monthly 3
In questo caso l'intervallo orario sparisce del tutto, e noi lanceremo un backup al giorno, poi una "migrazione verso la settimana" ogni settimana, e poi una "migrazione verso il mese" una volta al mese. Teniamo 3 mesi di vecchi dati e poi cancelliamo.
La configurazione che si fa qui va poi correttamente sincronizzata con quella che si fa in cron per il lancio dei backup e delle "migrazioni dei dati" verso i vari intervalli piu` lunghi.
Configurazione di ssh
Volendo usare rsync via ssh occorre, a meno che non vogliamo inserire le password a mano, configurare ssh per fare login con le chiavi RSA. Per farlo occorre creare una coppia di chiavi pubblica e privata sulla macchina sulla quale gira rsnapshot per l'utente che fa girare rsnapshot (nel mio caso, root). Quindi dalla shell di root lancero` ssh-keygen e poi creero` una chiave privata senza alcuna passphrase. Fatto questo, copiero` la chiave pubblica dell'utente root dal file /root/.ssh/id_rsa.pub nel file root/.ssh/authorized_keys della macchina (o delle macchine) che voglio backuppare.
Fatto questo, dalla macchina su cui gira rsnapshot provero` a fare ssh alle macchine che voglio backuppare. Se e` la prima volta che lo faccio, ssh mi chiedera` se voglio accettare la chiave dell'host remoto, gli devo dire di si`. La seconda volta dovrei riuscire a entrare in ssh sulla macchina remota senza alcuna richiesta. Ora ssh funzionera` anche per rsnapshot.
Esecuzione di rsnapshot
Lanciandolo a mano, e` sufficiente da root eseguire il comando rsnapshot hourly oppure rsnapshot daily a seconda di qual'e` l'intervallo di backup piu` breve che abbiamo definito in configurazione per eseguire una copia. Attenzione, perche` la prima copia puo` richiedere ore.
Esecuzione programmata in cron
Installando Rsnapshot dal pacchetto Debian viene creato un file /etc/cron.d/rsnapshot che contiene (commentato) un esempio di esecuzione in cron. L'esempio e` valido per la configurazione degli intervalli che viene proposta di default (backup ogni 4 ore), posto che non si scommenti la riga "monthly".
Per usare una configurazione con un backup giornaliero e conservazione mensile il cron andrebbe modificato come segue:
30 23 * * * root /usr/bin/rsnapshot daily || echo "testo della mail" | mail -s "Oggetto della mail" -- destinatario@domain.tld 0 23 * * 1 root /usr/bin/rsnapshot weekly 30 22 1 * * root /usr/bin/rsnapshot monthly
Notare che le righe che eseguono la "migrazione" delle copie vecchie verso l'intervallo di tempo maggiore (mese, settimana) sono eseguite PRIMA di quella che esegue il backup (o la migrazione verso l'intervallo di tempo minore). Questo perche` io voglio salvare l'ultima settimana nel primo mese prima di salvare l'ultimo giorno nella prima settimana, e questo prima di fare il backup di oggi.
Notare anche che se rsnapshot esce con un valore diverso da zero, viene mandata una mail per segnalare l'anomalia.
Configurazione per backup su dischi USB ruotati
Questa è una prima bozza di una configurazione per fare backup su dischi USB, compatibile con la rotazione dei suddetti dischi. Se si fa un backup su un solo disco, è possibile e semplice gestire uno schema giorno/settimana/mese senza problemi. Se si fa un backup su un set di dischi che vengono scambiati, e magari nemmeno necessariamente in modo assolutamente rigoroso (qualche volta ci si dimentica, per esempio) ecco che la gestione giorno/settimana/mese diventa un problema. Ci si potrebbe trovare a dover "ruotare" la copia settimanale su un disco che pero` oggi non e` quello collegato. È molto più facile tenere una gestione con un solo tipo di intervallo, tipicamente giornaliero.
file rsnapshot.conf
Questo è il file rsnapshot.conf che ho approntato (tolti tutti i commenti e ridotto ai soli comandi) per l'uso via USB con solo intervalli giornalieri.
config_version 1.2 # dove monto il disco usb (mnt) snapshot_root /mnt/rsnapshot/ # se il disco non è montato si suppone che la directory rsnapshot non esista. # questo comando fa si che riporti errore e non vada avanti se il disco non è montato. no_create_root 1 # i comandi che mi servono cmd_cp /bin/cp cmd_rm /bin/rm cmd_rsync /usr/bin/rsync cmd_logger /usr/bin/logger cmd_du /usr/bin/du cmd_rsnapshot_diff /usr/bin/rsnapshot-diff # tengo solo daily, e ne tengo 30 (per disco) retain daily 30 # logging verbose 3 loglevel 3 lockfile /var/run/rsnapshot.pid # non copiare i file system montati sotto il punto di sorgente one_fs 1 # parametro --link-dest supportato da rsync, usiamolo. link_dest 1 # definizione di cosa backuppo e relativi parametri backup /home/kurgan/ ghisa/ backup /etc/ ghisa/ backup /media/kurgan/ ghisa/ one_fs=0
Requisiti per farlo funzionare
- Occorre occuparsi di montare il disco USB prima di lanciare il comando di rsnapshot
- Occorre che in cron NON sia definito nulla per rsnapshot (il che e` il default, comunque controllare /etc/cron.d/rsnapshot)
- In cron andrà lanciato lo script che monta / lancia rsnasphot / smonta
- L'unico comando da usare è "rsnapshot daily", visto che è l'unico intervallo di tempo definito.