Backup incrementale completo su NAS con Rsync
Da MontelLUG WIKI.
Script per un backup incrementale con Rsync
Necessitavo di impostare un sistema di backup del mio portatile con un piccolo server di casa. Ho trovato il seguente semplice script che segue, che pubblico a favore di chi ne avesse bisogno e ... a mia futura memoria. Lo script, che ho adattato alle mie esigenze, utilizza fondamentalmente le caratteristiche di rsync, consente di fare backup completi di centinaia di Giga senza eccessivo uso della rete (una wifi casalinga nel mio caso) grazie all'uso degli hard link (a patto che sul server il filesystem sia ext3/ext4). E' facile da usare come script da avviare manualmente quando si può, oppure può esser dato in pasto al sistema cron per automatizzare i backup. Grazie a Syslac e Tony per l'assistenza che mi hanno dato per sistemare apici, virgolette e doppie virgolette. Benvenuto chiunque voglia migliorarlo.
#!/bin/bash # # A backup script based on Rsync that pushes backups onto a NAS # # Directories are rotated n times and rsync is called to # place a new backup in 0.backups_ago/ # # Fonte http://netcodger.wordpress.com 4/17/2012 # Personalizzazioni mie # # Edit these variables to suit your environment n=X #;Number of backups to retain NAS=192.168.1.XXXX #;IP address or resolvable hostname of NAS SrcDir=/home/ciccio #;Directory to be backed up DestDir=/shares/ciccio #;Backup destination on NAS # End of edits clear echo echo ========================================================================= echo Avvio del programma di backup; date; echo # Delete the n’th backup. echo echo ========================================================================= echo Rimozione del più vecchio backup e rinomina di tutti i successivi; date; echo ssh nome@$NAS "[ -d $DestDir/$n.backups_ago ] && rm -rf $DestDir/$n.backups_ago " # Rename backup directories to free up the 0.backups_ago directory ssh nome@$NAS "for i in {$n..1}; \ do [[ -d $DestDir/"'$(($i-1))'".backups_ago ]] && \ /bin/mv $DestDir/"'$(($i-1))'".backups_ago $DestDir/"'${i}'".backups_ago; done" # Run the Rsync command. Nice is used to prevent Rysnc from hogging the CPU. # –link-dest creates hard links so that each backup run appears as a full # backup even though they only copy changed blocks since 1.backups_ago echo echo ========================================================================= echo Avvio del backup; date; echo nice rsync -av --stats --progress \ --partial --partial-dir=$DestDir/.rsync-partial \ --link-dest=$DestDir/1.backups_ago \ --delete-after --delete-excluded \ --exclude=Trash* \ --log-file=$SrcDir/backup.log \ $SrcDir nome@$NAS:$DestDir/0.backups_ago/ # altre opzioni utili --compress (equivalente -z) --list-only echo echo ========================================================================= echo Completed running backup.sh; date; echo echo exit
Per evitare l'inserimento della password utente ad chiamata del programma è consigliabile generare una chiave privata ed effettuare lo scambio.
# ssh-keygen -t rsa (non inserire password) # ssh utente@NAS mkdir -p .ssh # cat .ssh/id_rsa.pub | ssh utente@NAS "cat >> .ssh/authorized_keys" # ssh utente@NAS # nas:~# chmod -R go-rwx .ssh # nas:~# exit#
Dopo aver messo in opera lo script mi sono accorto che in certe occasioni avevo bisogno di interrompere il backup prima del termine, per poi riprenderlo in seguito. Ho aggiunto allora una domanda che mi chiede se voglio riprendere/rifare il backup o farne uno nuovo.
#!/bin/bash # Edit these variables to suit your environment n=X #;Number of backups to retain NAS=192.168.1.XXXX #;IP address or resolvable hostname of NAS SrcDir=/home/ciccio #;Directory to be backed up DestDir=/shares/ciccio #;Backup destination on NAS # End of edits function domanda { clear echo echo ========================================================================= echo "Intendi completare backup interrotto in precedenza?"; echo "Scrivi:"; echo "- si per completare o rifare l'ultimo backup" echo "- no per eseguire un backup normale" echo "- qualsiasi altra cosa per uscire senza fare nulla" echo read Choice # -t 20 date; echo if [ $Choice = si ] ; then echo echo ========================================================================= echo "Hai scelto di rifare/completare l'ultimo backup"; echo date; echo backup else if [ $Choice = no ] ; then rotate_dir backup else echo echo ========================================================================= echo "Scelta errata: lo script termina ora."; echo date; echo fi fi } function rotate_dir { clear echo echo ========================================================================= echo "Avvio del programma di backup"; date; echo # Delete the n’th backup. echo echo ========================================================================= echo "Rimozione del più vecchio backup e rinomina di tutti i successivi"; date; echo ssh utente@$NAS "[ -d $DestDir/$n.backups_ago ] && rm -rf $DestDir/$n.backups_ago " # Rename backup directories to free up the 0.backups_ago directory ssh utente@$NAS "for i in {$n..1}; \ do [[ -d $DestDir/"'$(($i-1))'".backups_ago ]] && \ /bin/mv $DestDir/"'$(($i-1))'".backups_ago $DestDir/"'${i}'".backups_ago; done" } function backup { # Run the Rsync command. Nice is used to prevent Rysnc from hogging the CPU. # –link-dest creates hard links so that each backup run appears as a full # backup even though they only copy changed blocks since 1.backups_ago echo echo ========================================================================= echo "Avvio del backup"; date; echo nice rsync -av --stats --progress \ --partial --partial-dir=$DestDir/.rsync-partial \ --link-dest=$DestDir/1.backups_ago \ --delete-after --delete-excluded \ --exclude=Trash* \ --log-file=backup.log \ $SrcDir utente@$NAS:$DestDir/0.backups_ago/ echo echo ========================================================================= echo "Completed running backup.sh"; date; echo echo } # Main program domanda exit