Mini How-To per creare uno script che consenta di fare backup Incrementali e veloci di molti file su Linux
Per i miei backup ho sempre usato rsync ( o rsnapshot ). Fino a quando non mi sono imbattuto in un server contenente centinaia di migliaia di files.
A quel punto mi sono scontrato con questo problema: imposto in cron.hourly un backup orario ma puntualmente alcuni dei backup saltano perche' i precedenti non han finito.
Allora passo ad un backup ogni 6 ore e ad un backup giornaliero .. ma puntualmente alcuni backup saltano perchè i precedenti non han finito.
Mi puo' stare bene perdere un backup orario .. non mi sta bene perdere quello giornaliero.
rsnapshot è uno strumento fantastico, nulla da dire. Ma non è sempre idoneo alle esigenze.
Passo quindi un paio di notti insonni nel tentativo di trovare una soluzione fino a che non mi imbatto in questa discussione
Backup directory con 1 milione di file
La scremo di tutte le scemenze geek da misurazione conoscenza empirica e mi tiro fuori un bel po' di spunti su eventuali programmi da provare.
- cpio
- star
- dar
- dd
- pax
- cp
- backula
- amanda
Scarto al volo dd perchè la premessa non mi piace: se fai una stupidaggine, ti sfondo il disco. No, grazie!.
Scarto amanda e backula perchè voglio qualcosa di decisamente leggero.
Scarto star perchè non è pacchettizzato per la distribuzione che uso e ci sono voci per cui alle volte fa casino sui backup di partizione montate. Non ho voglia di fare test.
Scarto cp perchè sarebbe carino visto che li copio poterli anche comprimere. Non ho un TB
mi rimangono in giorco dar, pax e cpio.
Parto da dar ..e mi fermo li' .. perchè è veloce, è facile da configurare e fa quello che mi serve.
Esiste qualcosa che lo fa meglio ? Ci sarà sempre qualcuno che risponderà di sì... quindi amen.
La prima cosa fare è installare dar. Sono su una Debian quindi
su
apt-get install dar.
Ora le cose cambiano un po' a seconda che siate in remoto o in locale. Suppongo per convenienza che siate in locale e che abbiate una qualche interfaccia grafica.
Se cosi' non fosse le alternative sono vi, nano o chi per essi.
dar ha un mare di opzioni. Una buona spiegazione, anzi ottima, la si puo' trovare qui:
dar mini how-to
che è di fatto il mio punto di partenza.
Dunque, aprire gedit e creare un file chiamandolo system_backup.sh ( nome arbitrario ).
Cominciamo da qualcosa di semplice quindi:
#!/bin/sh
cd /mnt/backup
dar -v -R /home/mia_home -c `date -I`_data -X "`date -I`_data.*.dar" -y -m 256 -Z "*.jpg"
Spiegazione:
cd /mnt/backup : mi sposto dove voglio che venga messo il backup.
-v : opzione verbose che scrive a video quello che succede. Molto utile in debug.
-R : imposto la radice. Tutti i successivi riferimenti a cartelle o file faranno riferimento a questa radice ( salvo l'opzione -X )
-c : imposta il nome da dare al file finale.
-X : dice a dar di non considerare in copia qualsiasi file di chiami con il nome riportato
-y : comprimi con bz2
-m 256 : non comprimere i file piu' piccoli di 256KB
-Z : non comprimere i file che concordano con quanto scritto dopo ( in questo caso, non comprimere i .jpg ).
Dò invio, aspetto un po' ( a seconda di quanta roba ho in home ) e poi ho fatto il mio primo backup con dar.
Supponiamo di avere una situazione un po' piu' complessa .. in cui devo fare il backup di un po' piu' roba .. tipo tutto il sistema
Non sto parlando di clonare il disco.. per quello ci sono altri strumenti ( g4l mi viene in mente ).
Sto parlando di fare un backup di tutta la roba che non posso assolutamente perdere, sparsa in giro per il mio disco.
Step 1: cosa copiare
La cosa è profondamente arbitraria. Non esiste una verità assoluta al riguardo. Diciamo che per quel che mi riguarda sono obbligatorie:
- var [ con eccezioni ]
- root
- home
- etc
- opt
- usr
Step 2: quanto spazio mi serve ?
Nella peggiore delle ipotesi, tanto spazio quanto ne occupano i dati originali.
Per averne un'idea precisa, du -sh var/ per sapere quanto pesa la cartella /var e via dicendo.
Poi si tratta di sommare.
Attenzione se avete link che puntano da altre parti, il risultato di du potrebbe essere sfalsato.
Step 3: dove metto la roba
Se copio 30GB di disco per backup, potrebbe risultare utile mettere il tutto su un disco apposito.
Se invece voglio fare dei DVD o dei CD, allora devo sapere che al massimo posso metterci dentro 600MB/4GB per volta.
Step 4: lo script
io vado a capo, voi no.
#!/bin/sh
cd /mnt/backup;
dar -v -y -R / -c `date -I`_data -X "`date -I`_data.*.dar"
-Z "*.mp3" -Z "*.avi" -Z "*.mpg" -Z "*.mpeg" -Z "*.divx" -Z "*.rm"
-Z "*.wmv" -Z "*.wma" -Z "*.asf" -Z "*.ra" -Z "*.gif" -Z "*.jpg"
-Z "*.jpeg" -Z "*.png" -Z "*.zip" -Z "*.tgz" -Z "*.gzip" -Z "*.bzip"
-Z "*.bzip2" -Z "*.rar" -Z "*.Z"
-P cdrom -P media -P initrd -P srv -P tmp -P dev -P initrd.img -P lost+found -P mnt -P proc -P vmlinuz -P var/cache/
-A `date --date='1 day ago' -I`_data;
Spiegazione: in questo caso l'opzione -X è fondamentale.
dar infatti riconosce che il punto in cui io andrò a fare il backup è contenuto nella radice di cui io faccio il backup.
Non sa a priori che io poi escluderò la directory interessata per cui mi avvisa dicendomi che potrebbe cominciare un loop in cui il dato copiato copia se stesso.
Per evitare di avere quell'avviso che impedirebbe l'esecuzione automatica, si usa -X dicendogli di ignorare il dato copiato nella copia.
Le opzioni -Z sono una valanaga... e sono opzionali.
Le opzioni -P sono quelle piu interessanti e dicono a dar di non copiare quelle cartelle o quel file.
L'opzione -A è quella che mi garantisce il backup incrementale.
N.B.: la si può usare solo dopo aver creato un primo backup completo.
Dettaglio su -A:
all'opzione -A bisogna indicare quale sia il file a cui fare riferimento.
Supponiamo che io stia facendo un backup giornaliero: ogni mio file dar avrà come nome: `date -I`_data ( perchè io lo imposto con l'opzione -c )
cioe': la data di oggi con un suffisso.
Il giorno seguente il backup dovrà fare riferimento a quello del giorno precedente per poter fare un incremento.
`date --date='1 day ago' mi restituisce esattamente la data di ieri.
Step 5: cron
OK, abbiamo lo script, abbiamo tutto, ma non voglio ricordarmi ogni giorno di lanciarlo. Ho altre cose per la testa.
apro la shell e divento root
root@Desktop:~$ cd /etc
root@Desktop:~$ nano crontab
Ottengo la lista dei processi che partono ogni ora, giorno, settimana, mese.
Se lo leggo capisco che ogni giorno crontab fa partire gli script che si trovano in cron.daily.
Allora ho il mio script system_backup.sh, voglio che parta ogni giorno e non devo fare altro che copiarlo dentro alla cartella system_backup.sh
Fatto e finito.
root@Desktop:~$ cp /root/scripts/system_backup.sh /etc/cron.daily/system_backup
Questo supponendo che il file si trovasse in /root/scripts.
Metto i permessi in modo che l'utente di cron possa eseguire lo script.. e ho fatto.