Azioni

Differenze tra le versioni di "Backup incrementale completo su NAS con Rsync"

Da MontelLUG WIKI.

(Creata pagina con '= Script per un backup incrementale con Rsync = <pre> #!/bin/bash # # A backup script based on Rsync that pushes backups onto a NAS # # Directories are rotated n times and ...')
 
m (pagina categorizzata)
 
(2 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
 
= Script per un backup incrementale con Rsync =
 
= 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.
  
 
+
<syntaxhighlight lang="bash" line highlight=1-100>
 
 
<pre>
 
 
#!/bin/bash
 
#!/bin/bash
 
#
 
#
Riga 66: Riga 68:
 
exit
 
exit
  
# Per evitare l'inserimento della password di nome ad ogni avvio del programma  
+
</syntaxhighlight>
# e ogni volta che viene lanciato ssh dallo script è consigliabile generare  
+
 
# una chiave privata ed effettuare lo scambio.
+
Per evitare l'inserimento della password utente ad chiamata del programma è consigliabile generare una chiave privata ed effettuare lo scambio.
#
+
 
 +
<syntaxhighlight lang="bash" line highlight=1-100>
 
# ssh-keygen -t rsa  (non inserire password)  
 
# ssh-keygen -t rsa  (non inserire password)  
# ssh nome@MyBookLive mkdir -p .ssh
+
# ssh utente@NAS mkdir -p .ssh
# cat .ssh/id_rsa.pub | ssh nome@192.168.1.XXX "cat >> .ssh/authorized_keys"
+
# cat .ssh/id_rsa.pub | ssh utente@NAS "cat >> .ssh/authorized_keys"
# ssh nome@MyBookLive
+
# ssh utente@NAS
 
# nas:~# chmod -R go-rwx .ssh
 
# nas:~# chmod -R go-rwx .ssh
 
# nas:~# exit#
 
# nas:~# exit#
</pre>
+
</syntaxhighlight>
 +
 
 +
 
 +
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.
 +
 
 +
<syntaxhighlight lang="bash" line highlight=1-100>
 +
#!/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
 +
</syntaxhighlight>
 +
 
 +
 
 +
[[Category:Backup]]

Versione attuale delle 16:12, 27 ott 2021

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.

 1 #!/bin/bash
 2 #
 3 # A backup script based on Rsync that pushes backups onto a NAS
 4 #
 5 # Directories are rotated n times and rsync is called to
 6 # place a new backup in 0.backups_ago/
 7 #
 8 # Fonte http://netcodger.wordpress.com 4/17/2012
 9 # Personalizzazioni mie
10 # 
11 # Edit these variables to suit your environment
12 n=X					#;Number of backups to retain
13 NAS=192.168.1.XXXX			#;IP address or resolvable hostname of NAS
14 SrcDir=/home/ciccio			#;Directory to be backed up
15 DestDir=/shares/ciccio			#;Backup destination on NAS
16 # End of edits
17 
18 clear
19 echo
20 echo =========================================================================
21 echo Avvio del programma di backup;
22 date;
23 echo
24 
25 # Delete the n’th backup.
26 echo
27 echo =========================================================================
28 echo Rimozione del più vecchio backup e rinomina di tutti i successivi;
29 date;
30 echo
31 ssh nome@$NAS "[ -d $DestDir/$n.backups_ago ] && rm -rf $DestDir/$n.backups_ago "
32 
33 # Rename backup directories to free up the 0.backups_ago directory
34 ssh nome@$NAS "for i in {$n..1}; \
35 do [[ -d $DestDir/"'$(($i-1))'".backups_ago ]] && \
36 /bin/mv $DestDir/"'$(($i-1))'".backups_ago $DestDir/"'${i}'".backups_ago; done"
37 
38 # Run the Rsync command. Nice is used to prevent Rysnc from hogging the CPU.
39 # –link-dest creates hard links so that each backup run appears as a full
40 # backup even though they only copy changed blocks since 1.backups_ago
41 echo
42 echo =========================================================================
43 echo Avvio del backup;
44 date;
45 echo
46 nice rsync -av --stats --progress \
47 --partial --partial-dir=$DestDir/.rsync-partial \
48 --link-dest=$DestDir/1.backups_ago \
49 --delete-after --delete-excluded \
50 --exclude=Trash* \
51 --log-file=$SrcDir/backup.log \
52 $SrcDir nome@$NAS:$DestDir/0.backups_ago/
53 # altre opzioni utili --compress (equivalente -z) --list-only
54 
55 echo
56 echo =========================================================================
57 echo Completed running backup.sh;
58 date;
59 echo
60 echo
61 exit

Per evitare l'inserimento della password utente ad chiamata del programma è consigliabile generare una chiave privata ed effettuare lo scambio.

1 # ssh-keygen -t rsa  (non inserire password) 
2 # ssh utente@NAS mkdir -p .ssh
3 # cat .ssh/id_rsa.pub | ssh utente@NAS "cat >> .ssh/authorized_keys"
4 # ssh utente@NAS
5 # nas:~# chmod -R go-rwx .ssh
6 # 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.

 1 #!/bin/bash
 2 # Edit these variables to suit your environment
 3 n=X					#;Number of backups to retain
 4 NAS=192.168.1.XXXX			#;IP address or resolvable hostname of NAS
 5 SrcDir=/home/ciccio			#;Directory to be backed up
 6 DestDir=/shares/ciccio			#;Backup destination on NAS
 7 # End of edits
 8 
 9 function domanda {
10 clear
11 echo
12 echo =========================================================================
13 echo "Intendi completare backup interrotto in precedenza?";
14 echo "Scrivi:";
15 echo "- si per completare o rifare l'ultimo backup"
16 echo "- no per eseguire un backup normale"
17 echo "- qualsiasi altra cosa per uscire senza fare nulla"
18 echo
19 read Choice # -t 20
20 date;
21 echo
22 if [ $Choice = si ] ; then
23   echo
24   echo =========================================================================
25   echo "Hai scelto di rifare/completare l'ultimo backup";
26   echo
27   date;
28   echo 
29   backup
30 else
31   if [ $Choice = no ] ; then
32     rotate_dir
33     backup
34   else
35     echo
36     echo =========================================================================
37     echo "Scelta errata: lo script termina ora.";
38     echo
39     date;
40     echo
41   fi
42 fi
43 }
44 
45 function rotate_dir {
46 clear
47 echo
48 echo =========================================================================
49 echo "Avvio del programma di backup";
50 date;
51 echo
52 # Delete the n’th backup.
53 echo
54 echo =========================================================================
55 echo "Rimozione del più vecchio backup e rinomina di tutti i successivi";
56 date;
57 echo
58 ssh utente@$NAS "[ -d $DestDir/$n.backups_ago ] && rm -rf $DestDir/$n.backups_ago "
59 # Rename backup directories to free up the 0.backups_ago directory
60 ssh utente@$NAS "for i in {$n..1}; \
61 do [[ -d $DestDir/"'$(($i-1))'".backups_ago ]] && \
62 /bin/mv $DestDir/"'$(($i-1))'".backups_ago $DestDir/"'${i}'".backups_ago; done"
63 }
64 
65 function backup {
66 # Run the Rsync command. Nice is used to prevent Rysnc from hogging the CPU.
67 # –link-dest creates hard links so that each backup run appears as a full
68 # backup even though they only copy changed blocks since 1.backups_ago
69 echo
70 echo =========================================================================
71 echo "Avvio del backup";
72 date;
73 echo
74 nice rsync -av --stats --progress \
75 --partial --partial-dir=$DestDir/.rsync-partial \
76 --link-dest=$DestDir/1.backups_ago \
77 --delete-after --delete-excluded \
78 --exclude=Trash* \
79 --log-file=backup.log \
80 $SrcDir utente@$NAS:$DestDir/0.backups_ago/
81 echo
82 echo =========================================================================
83 echo "Completed running backup.sh";
84 date;
85 echo
86 echo
87 }
88 
89 # Main program
90 domanda
91 exit