Backup Simple/Scripte
Zur Navigation springen
Zur Suche springen
Du bist hier : | {{#youAreHere:Backup Simple/Scripte}} |
Skript: syncAll.sh
Das Skript sichert eine Liste aller installierten Pakete nach /etc/apt/packageslist/packages.list und eine Liste von Ordnern, die in unterschiedlichen Basisordnern liegen können.
Dieses Skript verwendet rsync. Es kopiert nur die Änderungen und ist daher auch bei sehr großen Datenmengen schnell.
Achtung: neues Script am 13.09.2011 eingestellt.
- Änderungen:
- - Zielfolderstruktur ist jetzt identisch mit der Quellfolderstruktur
- - Logging wurde verbessert
- - besser kommentiert
- - Änderung 26.12.11: Prüfung auf Existenz, des Targetfolders hinzugefügt,
- in if [ ! -d $BACKUP_TO ], in funktion do_sourcefolder()
- wenn nicht vorhanden, dann wird dieser angelegt
#! /bin/bash # File 'syncAll.sh' # Autor: rleofield # www.rleofield.de # Sept. 2011 # exclude Beispiele #.adobe/Flash_Player #.macromedia #.gnupg/log-socket #.gqview/.command #.gvfs #.cache #.config #.local/share/gvfs-metadata #.local/share/Trash #.thumbnails #.dbus #.local/share/tracker/data # 'bash' erlaubt keine Multiline Kommentare. # Multilinekommentare sind als 'here docs' gestaltet. # http://tldp.org/LDP/abs/html/here-docs.html # http://www.wiredrevolution.com/bash-programming/multiple-line-comments-in-bash : << '--COMMENT--' Dieses Script verwendet 'rsync', um ein Backup wichtiger Folder auf einer externen Festplatte anzufertigen. Die Folder werden relativ zu einem/mehreren 'Sourcefolder'n angegeben. Die Folderstruktur im Backup bleibt erhalten. Nach dem Backup gelöschte Files werden im nachfolgenden Backup in den Folder 'backupbackup' verschoben. Es wird im Backup nichts automatisch gelöscht. Ein automatischer Restore ist nicht vorgesehen. Nach einem HD Ausfall kann man mit der Programmliste (s.u.) schnell ein neues System aufsetzen und die Daten wieder selektiv mit 'cp -av' oder 'rsync -avS' zurückholen. Die Backupfolder BACKUPHD=/media/elements/hd500 BACKUPDIR=$BACKUPHD/backup BACKUPBACKUPDIR=$BACKUPHD/backupbackup müssen existieren und für 'root' schreibbar sein. Der Logfolder (LOGFILE) muss existieren. z.B. '/var/log/backup' . Der Folder für die Liste der installierten Programme muss vorhanden sein. (s.u., mit 'dpkg --get-selections') Das Script benötigt root-Rechte. Ist DRY_RUN gesetzt, gibt 'rsync' alle Operationen aus , kopiert aber nichts. Ausblenden von Foldern und Files im Backup: mit Exclude Files 'exclude_*' (für '*' den jeweiligen Sourcefolder einsetzen, s.u.) -- Beispiel für Zeilen im 'exclude_user1' File: .local/share/gvfs-metadata .compiz .local/share/gvfs-metadata .local/share/Trash .strigi/socket .thumbnails .mozilla/firefox/toh3tf4y.default/Cache --COMMENT-- # mit Kommenarzeichen die nötigen Zeilen für DRY_RUN ein-/ausblenden # Test mit Kontrollausgabe, es wird nichts kopiert (siehe 'man rsync') #DRY_RUN=--dry-run # kein Test, Daten werden kopiert DRY_RUN= # Test auf root # root wird benötigt, um auch Files von anderen Nutzern und die Systemfiles zu kopieren [[ `id -u` == 0 ]] || { echo 'Um ein Backup anzufertigen, benötigt man root Rechte (sudo -s)' exit } # setze das heutige Datum und die Uhrzeit TODAY=`date +%Y%m%d-%H%M` # Logfile im vorher angelegten Logfolder LOGFILE=/var/log/backup/bb_$TODAY.log echo "Logfile: $LOGFILE" # setze die Folder für das Backup (müssen auf der externen HD vorhanden sein) BACKUPHD=/media/hd500 BACKUPDIR=$BACKUPHD/backup BACKUPBACKUPDIR=$BACKUPHD/backupbackup # hier die Exclude-Files ablegen EXCLUDEFILEDIR=/home/richard/bin/backup line="-------------------------" echo "Backup externe HD: $BACKUPHD" echo "Backup Verzeichnis: $BACKUPDIR" echo "Backup Backup Verzeichnis: $BACKUPBACKUPDIR" # test, ob der Backup Folder vorhanden ist if [ ! -d $BACKUPDIR ] then echo "Backup Folder '$BACKUPDIR' ist nicht vorhanden." | tee -a $LOGFILE echo "Ist die externe HD gemountet?" exit fi # test, ob der Backupbackup Folder vorhanden ist if [ ! -d $BACKUPBACKUPDIR ] then echo "Backup Backup Folder '$BACKUPBACKUPDIR' ist nicht vorhanden." | tee -a $LOGFILE echo "Ist die externe HD gemountet?" exit fi # schreibe Liste aller installierten Pakete auf die HD, wird danach vom Backup mit erfasst echo "sichere Packageslist -> /etc/apt/packageslist/packages.list" | tee -a $LOGFILE dpkg --get-selections | awk '!/deinstall|purge|hold/ {print $1}' > /etc/apt/packageslist/packages.list echo "Packageslist gesichert" | tee -a $LOGFILE # Funktion, die 'rsync' aufruft function do_sourcefolder(){ _sourcebase=$1 _sourcefolder=$2 # Test, ob 'exlude_*' existiert EXCLUDEFILE=$EXCLUDEFILEDIR/exclude_$_sourcefolder EXCLUDE= if [ -f $EXCLUDEFILE ] then EXCLUDE=$EXCLUDEFILE echo "Exclude-File: $EXCLUDE" | tee -a $LOGFILE fi slash=/ FROM=$_sourcebase # wenn 'sourcebase' im Root liegt, dann darf 'sourcebase' nicht 'sourcefolder' voran gestellt werden if [ $FROM = $slash ] then echo "FROM ist /" FROM=/$_sourcefolder else FROM=$_sourcebase/$_sourcefolder fi BACKUP_TO=$BACKUPDIR$FROM BACKUP_BACKUP=$BACKUPBACKUPDIR$FROM if [ ! -d $BACKUP_TO ] then echo "mkdir -p $BACKUP_TO" | tee -a $LOGFILE mkdir -p $BACKUP_TO fi if [ ! -d $BACKUP_BACKUP ] then echo "mkdir -p $BACKUP_BACKUP" | tee -a $LOGFILE mkdir -p $BACKUP_BACKUP fi echo "Backup-From $FROM" | tee -a $LOGFILE echo "Backup-To $BACKUP_TO" | tee -a $LOGFILE echo "Backup-Backup $BACKUP_BACKUP" | tee -a $LOGFILE OPTIONS=-rlptvgoSAXH # siehe 'man rsync' # -r, --recursive recurse into directories # -l, --links copy symlinks as symlinks # -p, --perms preserve permissions # -t, --times preserve modification times # -v, --verbose increase verbosity # -g, --group preserve group # -o, --owner preserve owner (super-user only) # -X, --xattrs preserve extended attributes # -A, --acls preserve ACLs (implies -p) # -S, --sparse handle sparse files efficiently # -H, --hard-links preserve hard links echo "rsync $DRY_RUN $OPTIONS --delete --exclude-from=$EXCLUDE --backup --backup-dir=$BACKUP_BACKUP $FROM/ $BACKUP_TO/" | tee -a $LOGFILE rsync $DRY_RUN $OPTIONS --delete --exclude-from=$EXCLUDE --backup --backup-dir=$BACKUP_BACKUP $FROM/ $BACKUP_TO/ | tee -a $LOGFILE echo "Backup $FROM To $BACKUP_TO ok" | tee -a $LOGFILE } # Funktion, die die Liste der Sourcefolder abarbeitet und 'do_sourcefolder()' aufruft function do_sourcefolders(){ _sourcebase=$1 _sourcefolders=$2 echo $line | tee -a $LOGFILE cd $_sourcebase pwd echo "pwd `pwd`" | tee -a $LOGFILE echo $line | tee -a $LOGFILE #echo "Sourcebase $_sourcebase" | tee -a $LOGFILE #echo "Backup-To $BACKUP_TO" | tee -a $LOGFILE for _sourcefolder in $_sourcefolders do echo "Sourcebase $_sourcebase" | tee -a $LOGFILE echo "Sourcefolder $_sourcefolder" | tee -a $LOGFILE do_sourcefolder $_sourcebase $_sourcefolder echo $line | tee -a $LOGFILE done } # Hier geht es los : << '--COMMENT--' # Beispiel: folgende Verzeichnisse in / sollen gesichert werden: (Ausgabe von ls -l / | grep '^d' | awk '{print $8}' ) Beispiel: bin boot cdrom dev - nicht etc home - nicht, wird weiter unten extra kopiert initrd lib lib32 lib64 - nicht, ist ein Link nach lib media - nicht, hier sind externe HDs mnt - nicht nonexistent - nicht, gehoert zu memcache opt proc - nicht, virtueller Folder root sbin selinux srv sys - nicht, ist dynamisch tmp - nicht, ist tmp usr var --COMMENT-- # root Folder Backup SOURCEDIR=/ # anderer Vorschlag, ohne /home: do_sourcefolders $SOURCEDIR "bin boot etc initrd lib lib32 lib64 opt root sbin selinux srv usr var" # und noch der /home Folder: (Ausgabe von ls -l /home | grep '^d' | awk '{print $8}' ) #Beispiel: #user1 #user2 #user3 #user4 SOURCEDIR=/home do_sourcefolders $SOURCEDIR "user1 user2 user3 user4" # usw. # siehe: http://www.halfgaar.net/backing-up-unix sync sleep 2 echo $line | tee -a $LOGFILE echo "Backup beendet" echo $line | tee -a $LOGFILE