Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.
Neben der üblichen, meist sehr aufwendigen und vor allem viel zu selten durchgeführten manuellen Sicherung auf externen Medien bietet sich eine automatische Lösung mit rsync an. Die Daten können etwa auf eine lokale Festplatte im gleichen Rechner, aber auch auf extern angeschlossene Festplatten (USB) oder per SSH über das Netzwerk gesichert werden. Das hier vorgestellte Backup-Skript ist automatisierbar und benötigt nur wenig Ausführungszeit, da es nur Änderungen neu sichert.
Eine Alternative zu diesem Skript sind rsnapshot und dirvish. Im Gegensatz zu diesem Skript verfügen die genannten Programme über eine Vielzahl von weiteren Konfigurationsmöglichkeiten. Der Vorteil von diesem Backup-Skript ist jedoch die Einfachheit und Übersichtlichkeit sowie der Verzicht auf weitere Paketinstallationen.
Version des Skriptes: 20.10.2011.
Das Backup-Skript erstellt für die angegebenen Quellenverzeichnisse identische Kopien in einem Datumsordner im Zielverzeichnis. Als Basis für das inkrementelle Sichern wird das letzte Backup automatisch ausgewählt. Bei mehrmaligen Ausführen am gleichen Tag wird das Tagesbackup aktualisiert. Somit bleibt für einen Tag die letzte Sicherung bestehen. Beliebige Tagesbackups können anschließend z.B. per TAR auf externen Medien gesichert werden.
Zu den technischen Details: Das Programm 'rsync' nutzt Hardlinks, wodurch der Eindruck entsteht, dass in jedem Tagesordner sämtliche Dateien abgelegt sind. Jedoch wird bei unveränderten Dateien nichts übertragen und auch nichts kopiert. Es wird einfach nur ein weiterer Hardlink auf die bereits gesicherte Datei angelegt. Das ganze wird über die --link-dest-Option von rsync gesteuert.
Vom Skript benötigt wird das Paket[4]
rsync
Folgendes Paket kann bei Bedarf installiert werden:
openssh-server (optional, für das Sichern von einer Quelle über SSH)
Außerdem kann ggf. ein E-Mail-Programm (für die Benachrichtigung über E-Mail) installiert werden.
Über den Parameter MOUNTPOINT kann zur Laufzeit des Skripts geprüft werden ob der Backup-Zielordner, z.b. eine USB-Platte oder ein NFS-Mount, eingebunden ist. Sollte es nicht eingebunden sein, so wird kein Backup durchgeführt. Diese Überprüfung kann durch das Weglassen der Option übersprungen werden.
Zur Minimierung der archivierten Datenmenge ist mit dem Parameter MONTHROTATE ein Rotieren von Backups möglich. Hierbei werden im Folgemonat alte Versionen ersetzt.
Das Skript ermöglicht auch das Sichern von Daten von einem entfernten System (FROMSSH) bzw. zu einem entfernten Rechner (TOSSH) per SSH. Zur automatischen Sicherung ist der Austausch von SSH-Keys notwendig, da mehrmals SSH-Verbindungen aufgebaut werden.
Damit das Skript am Ende eine E-Mail mit angehängter Logdatei versendet, kann der Parameter MAILREC mit entsprechender E-Mail-Adresse verwendet werden. Dafür muss ein Mailprogramm installiert sein. Der E-Mail-Versand kann durch Weglassen der Option ausgeschaltet werden. Sollte bei der Erstellung ein Fehler aufgetreten sein, so wird im E-Mail-Betreff der Begriff "Error" aufgeführt.
Die Liste der aktuell installierten Pakete wird durch das Setzen der Option PACKAGES der Logdatei und auch der E-Mail vorangestellt. Es wird empfohlen den Ordner mit der Logdatei (z.B. /root) in das Backup mit aufzunehmen. Bei der Option FROMSSH wird keine Paketliste erzeugt.
Das Backup-Skript
herunterladen und speichern.
Man kann auch einen Texteditor [2] öffnen und folgenden Text hinein kopieren:
#!/bin/bash
# Simple backup with rsync
# local-mode, tossh-mode, fromssh-mode
SOURCES=(/root /etc /home /boot )
TARGET="/media/backup"
# edit or comment with "#"
#LISTPACKAGES=listdebianpackages # local-mode and tossh-mode
MONTHROTATE=monthrotate # use DD instead of YYMMDD
RSYNCCONF=(--delete)
#MOUNTPOINT="/media/daten" # check local mountpoint
#MAILREC="user@domain"
#SSHUSER="sshuser"
#FROMSSH="fromssh-server"
#TOSSH="tossh-server"
SSHPORT=22
### do not edit ###
MOUNT="/bin/mount"; FGREP="/bin/fgrep"; SSH="/usr/bin/ssh"
LN="/bin/ln"; ECHO="/bin/echo"; DATE="/bin/date"; RM="/bin/rm"
DPKG="/usr/bin/dpkg"; AWK="/usr/bin/awk"; MAIL="/usr/bin/mail"
CUT="/usr/bin/cut"; TR="/usr/bin/tr"; RSYNC="/usr/bin/rsync"
LAST="last"; INC="--link-dest=../$LAST"
LOG=$0.log
$DATE > $LOG
if [ "${TARGET:${#TARGET}-1:1}" != "/" ]; then
TARGET=$TARGET/
fi
if [ "$LISTPACKAGES" ] && [ -z "$FROMSSH" ]; then
$ECHO "$DPKG --get-selections | $AWK '!/deinstall|purge|hold/'|$CUT -f1 | $TR '\n' ' '" >> $LOG
$DPKG --get-selections | $AWK '!/deinstall|purge|hold/'|$CUT -f1 |$TR '\n' ' ' >> $LOG 2>&1
fi
if [ "$MOUNTPOINT" ]; then
MOUNTED=$($MOUNT | $FGREP "$MOUNTPOINT");
fi
if [ -z "$MOUNTPOINT" ] || [ "$MOUNTED" ]; then
if [ -z "$MONTHROTATE" ]; then
TODAY=$($DATE +%y%m%d)
else
TODAY=$($DATE +%d)
fi
if [ "$SSHUSER" ] && [ "$SSHPORT" ]; then
S="$SSH -p $SSHPORT -l $SSHUSER";
fi
for SOURCE in "${SOURCES[@]}"
do
if [ "$S" ] && [ "$FROMSSH" ] && [ -z "$TOSSH" ]; then
$ECHO "$RSYNC -e \"$S\" -avR \"$FROMSSH:$SOURCE\" ${RSYNCCONF[@]} $TARGET$TODAY $INC" >> $LOG
$RSYNC -e "$S" -avR "$FROMSSH:\"$SOURCE\"" "${RSYNCCONF[@]}" "$TARGET"$TODAY $INC >> $LOG 2>&1
if [ $? -ne 0 ]; then
ERROR=1
fi
fi
if [ "$S" ] && [ "$TOSSH" ] && [ -z "$FROMSSH" ]; then
$ECHO "$RSYNC -e \"$S\" -avR \"$SOURCE\" ${RSYNCCONF[@]} \"$TOSSH:$TARGET$TODAY\" $INC " >> $LOG
$RSYNC -e "$S" -avR "$SOURCE" "${RSYNCCONF[@]}" "$TOSSH:\"$TARGET\"$TODAY" $INC >> $LOG 2>&1
if [ $? -ne 0 ]; then
ERROR=1
fi
fi
if [ -z "$S" ]; then
$ECHO "$RSYNC -avR \"$SOURCE\" ${RSYNCCONF[@]} $TARGET$TODAY $INC" >> $LOG
$RSYNC -avR "$SOURCE" "${RSYNCCONF[@]}" "$TARGET"$TODAY $INC >> $LOG 2>&1
if [ $? -ne 0 ]; then
ERROR=1
fi
fi
done
if [ "$S" ] && [ "$TOSSH" ] && [ -z "$FROMSSH" ]; then
$ECHO "$SSH -p $SSHPORT -l $SSHUSER $TOSSH $LN -nsf $TARGET$TODAY $TARGET$LAST" >> $LOG
$SSH -p $SSHPORT -l $SSHUSER $TOSSH "$LN -nsf \"$TARGET\"$TODAY \"$TARGET\"$LAST" >> $LOG 2>&1
if [ $? -ne 0 ]; then
ERROR=1
fi
fi
if ( [ "$S" ] && [ "$FROMSSH" ] && [ -z "$TOSSH" ] ) || ( [ -z "$S" ] ); then
$ECHO "$LN -nsf $TARGET$TODAY $TARGET$LAST" >> $LOG
$LN -nsf "$TARGET"$TODAY "$TARGET"$LAST >> $LOG 2>&1
if [ $? -ne 0 ]; then
ERROR=1
fi
fi
else
$ECHO "$MOUNTPOINT not mounted" >> $LOG
ERROR=1
fi
$DATE >> $LOG
if [ -n "$MAILREC" ]; then
if [ $ERROR ];then
$MAIL -s "Error Backup $LOG" $MAILREC < $LOG
else
$MAIL -s "Backup $LOG" $MAILREC < $LOG
fi
fi
Die Datei wird z.B. unter dem Namen /root/backup.sh gesichert. Da die Logdatei unter dem Namen mit selben Anhang und dem Anhang .log (z.B. /root/backup.sh.log) gesichert wird empfiehlt es sich, eine sprechende Bezeichnung als Programmnamen zu vergeben.
Sichern auf USB-Festplatte mit Überprüfung des Mountpoints,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | SOURCES=(/root /etc /home /boot ) TARGET="/media/usb/zielverzeichnis" # edit or comment with "#" #LISTPACKAGES=listdebianpackages # local-mode and tossh-mode MONTHROTATE=monthrotate # use DD instead of YYMMDD RSYNCCONF=(--delete) #MOUNTPOINT="/media/daten" # check local mountpoint #MAILREC="user@domain" #SSHUSER="sshuser" #FROMSSH="fromssh-server" #TOSSH="tossh-server" SSHPORT=22 |
Sichern zu SSH-Server und E-Mail-Benachrichtigung.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | SOURCES=(/root /etc /home /boot ) TARGET="/pfad/auf/ssh-zielserver" # edit or comment with "#" LISTPACKAGES=listdebianpackages # local-mode and tossh-mode MONTHROTATE=monthrotate # use DD instead of YYMMDD RSYNCCONF=(--delete) #MOUNTPOINT="/media/daten" # check local mountpoint #MAILREC="user@domain" SSHUSER="root" #FROMSSH="fromssh-server" TOSSH="192.168.1.100" SSHPORT=22 |
Das Skript muss ausführbar[3] gemacht werden.
Das Skript erwartet genau einen Eintrag für das Backup-Ziel TARGET und einen bzw. mehrere Einträge für die Backup-Quellen SOURCES.
RSYNCCONF -Optionen:
Das Backup-Skript nutzt rsync für die Synchronisation der Verzeichnisse und Daten. Über die Variable RSYNCONF kann die Sicherung z.B. eingeschränkt werden.
--delete gelöschte Dateien werden auch in der Sicherung gelöscht
(hat nur Auswirkungen bei mehreren Sicherungsläufen pro Tag)
--exclude=.* sämtliche Punkt-Dateien und Punkt-Verzeichnisse werden nicht gesichert
--exclude=.mozilla Anwendungsdaten von Mozilla/Firefox werden nicht gesichert (z.B. Browser-Cache) In SOURCES TARGET und RSYNCCONF können Pfadangaben mit Leerzeichen genutzt werden. Hierfür sind bei SOURCES und RSYNCCONF die Pfade mit Anführungszeichen zu umschließen.
PACKAGES verwenden, um eine Liste aller installierten Pakete zu sichern. Die Liste kann benutzt werden, wenn man das System neu aufsetzen muss und den alten Zustand wiederherstellen will. Die Paketliste wird der E-Mail-Benachrichtung angehangen. Eine separate Speicherung findet nicht statt.
MAILREC verwenden, um das Logfile an eine E-Mail-Adresse zu versenden. Dafür muss ein E-Mail-Programm installiert sein. Wie bei MOUNTPOINT kann die Option kann durch Weggelassen ausgeschaltet werden.
Soll das Skript automatisiert innerhalb bestimmter Zeitintervalle laufen, kann es z.B. in Cron-Abläufe eingebunden werden.
Das Skript überprüft nicht, ob im Zielverzeichnis genügend freier Speicher vorhanden ist. Fehler bei den Eingabeparametern fängt das Skript nicht ab. Fehlerhafte Angaben können das System zerstören, da die Aktionen als root ausgeführt werden.
Das Skript wurde nur für unten gelisteten Dateisysteme getestet. Ein Einsatz von NTFS oder FAT als Zieldateisystem ist nur eingeschränkt möglich.
| Getestete Dateisysteme | ||
| FS | inkrementell | Hinweise |
| ext2 | Ja | Praktisch alle UNIX-artigen Dateisysteme unterstützen Hardlinks. Im Zweifel hilft eine kurze Suche nach dem Dateisystem und dem Stichwort "hardlinks". Je nach der Implementation der Hardlinks verbrauchen einige Dateisysteme u.U. mehr Speicherplatz als andere. |
| ext3 | Ja | |
| ext4 | Ja | |
| xfs | Ja | |
| vzfs/unionfs | Ja | |
| HFS+ | Ja | Bei extern angeschlossenen Festplatten deaktiviert OS X standardmäßig die Benutzerrechteverwaltung, was inkrementelle Backups unmöglich macht. Diese kann man allerdings von Hand wieder aktivieren. |
| FAT32 | Nein | Backups sind mit diesem Skript auch auf FAT32-Ziele möglich, jedoch nicht inkrementell. |
| NTFS (ntfs-3g) | Ja | NTFS unterstützt seit Windows 2000 Hardlinks und stellt die entspr. Funktionen per API zur Verfügung. Der ntfs-3g-Treiber unterstützt dies seit Jaunty. Startet man das Skript unter Windows aus Cygwin heraus, sind inkrementelle Backups ebenfalls möglich. |
| NTFS (Windows) | Ja | |
Für ein Backup auf einem externen Medium mit einem abweichenden Dateisystem kann ein beliebiges Tagesarchiv z.B. mit TAR leicht gesichert werden.
tar cvzf /media/extern/080122.tar.gz /media/backup/080122
Dabei ist aber zu beachten, dass FAT-Dateisysteme nur Dateien bis zu einer Größe von 4 GB erlauben. Ansonsten müssen mehrere TARs erstellt, oder ein einzelnes gesplittet werden.
Die Daten können einfach mit Betriebssystemmitteln (cp, rsync) bei Bedarf zurück kopiert werden.
Bei monatlichen Rotieren ist das Ermitteln von alten Sicherungen evtl. schwieriger, da als Datum nur der Tag und nicht JJMMTT gewählt wird. Mit dem unten stehenden Befehl erhält man eine Zuordnung des Sicherungsordners (TT) zum wirklichen Sicherungsdatum (JJ-MM-TT). Bitte entsprechend auf das Backup anwenden. Gesucht wird nach dem jeweiligen Namen des Logfiles, hier "backup.sh.log". Der Rechenaufwand ist hierbei relativ hoch.
1 | find . -name "backup.sh.log" |xargs -i ls -l --time-style=full-iso {} |cut -d" " -f6,9 |sort
|
Um alle Pakete zu installieren sind aus dem Logfile bzw. der E-Mail die Pakete zu extrahieren und zu installieren.
Diese Revision wurde am 20. Oktober 2011 14:47 von uname erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen:
Backup, Sicherheit, Shell
2004 – 2012 ubuntuusers.de • Einige Rechte vorbehalten