[[Vorlage(Getestet, general)]] {{{#!vorlage Wissen [:Terminal: Ein Terminal öffnen] [:Editor: Einen Editor öffnen] [:Rechte: Rechte für Dateien und Ordner ändern] [:Paketinstallation_DEB: Ein Paket installieren] [:Programme starten: Ein Programm ohne Menüeintrag starten] [:sudo: Root-Rechte] }}} [[Inhaltsverzeichnis()]] [[Bild(http://media.ubuntuusers.de/wiki/attachments/37/28/backup.png, 80, left)]] 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. {{{#!vorlage Hinweis Version des Skriptes: 30.11. 2010. }}} = Funktion = 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 [:ln#Hardlinks: Hardlink] auf die bereits gesicherte Datei angelegt. Das ganze wird über die `--link-dest`-Option von rsync gesteuert. == Pakete == Vom Skript benötigt wird das Paket[4] {{{#!vorlage Paketinstallation rsync }}} Folgendes Paket kann bei Bedarf installiert werden: {{{#!vorlage Paketinstallation openssh-server, optional, für das Sichern von einer Quelle über [:SSH:] }}} Außer dem ggf. ein [:Internetanwendungen#E-Mail: E-Mail-Programm] (für die Benachrichtigung über E-Mail) == Überprüfen des Mountpoints == Über den Parameter `MOUNTPOINT` kann zur Laufzeit des Skripts geprüft werden ob der Backup-Zielordner, z.b. eine USB-Platte oder ein [:NFS: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. == Löschen alter Backups == Zur Minimierung der archivierten Datenmenge ist mit dem Parameter `MONTHROTATE` ein Rotieren von Backups möglich. Hierbei werden im Folgemonat alte Version ersetzt. == Log-Datei per E-Mail versenden == 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. == Aktuelle Paketliste erzeugen und sichern == Die Liste der aktuell installierten Pakete kann über die Option `PACKAGES` der E-Mail angehangen werden. Eine Speicherung der Liste selbst findet nicht statt. Wenn die Log-Datei an eine lokale E-Mail verschickt wird (user@localhost), so ist das Verzeichnis /var/mail in die Sicherung aufzunehmen, da die Information sonst verloren gehen kann. Zudem findet eine Sicherung der Paketliste damit nur um einen Tag zeitversetzt statt. == Sichern über SSH == 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#Authentifizierung-ueber-Public-Keys: SSH-Keys] notwendig, da mehrmals SSH-Verbindungen aufgebaut werden. = Das Skript = Das [attachment:Skripte/Backup_mit_RSYNC/backup.sh:Backup-Skript] {dl} herunterladen und speichern. Man kann auch einen Texteditor [2] öffnen und folgenden Text hinein kopieren: {{{#!code bash #!/bin/bash # Simple backup with rsync # local-mode, tossh-mode, fromssh-mode SOURCES="/root/ /etc/ /home/ /root/" TARGET="/usr/local/backup/" RSYNCCONF="--delete" #MOUNTPOINT="/daten" #PACKAGES=1 #MONTHROTATE=1 #MAILREC="user@localhost" #SSHUSER="root" #SSHPORT=22 #FROMSSH="clientsystem" #TOSSH="backupserver" ### do not edit ### LOG=$0.log MAILSUBJECT="Backup $LOG" MOUNT="/bin/mount" FGREP="/bin/fgrep" SSH="/usr/bin/ssh" RSYNC="/usr/bin/rsync" LN="/bin/ln" ECHO="/bin/echo" DATE="/bin/date" RM="/bin/rm" DPKG="/usr/bin/dpkg" AWK="/usr/bin/awk" MAIL="/usr/bin/mail" LAST="last" INC="--link-dest=../$LAST" $DATE > $LOG MOUNTED=$($MOUNT | $FGREP "$MOUNTPOINT"); if [ -z "$MOUNTPOINT" ] || [ -n "$MOUNTED" ]; then if [ $MONTHROTATE ]; then TODAY=$($DATE +%d) else TODAY=$($DATE +%y%m%d) fi if [ "$SSHUSER" ] && [ "$SSHPORT" ]; then S="$SSH -p $SSHPORT -l $SSHUSER"; fi for SOURCE in $($ECHO $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>> $LOG 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>> $LOG fi if [ -z "$S" ]; then $ECHO "$RSYNC -avR $SOURCE $RSYNCCONF $INC $TARGET$TODAY" >> $LOG 2>> $LOG; $RSYNC -avR $SOURCE $RSYNCCONF $INC $TARGET$TODAY >> $LOG 2>> $LOG 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>> $LOG if [ -n "$PACKAGES" ]; then $ECHO "$DPKG --get-selections | $AWK '!/deinstall|purge|hold/'" >> $LOG $DPKG --get-selections | $AWK '!/deinstall|purge|hold/' >> $LOG 2>> $LOG 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>> $LOG if [ -n "$PACKAGES" ]; then $ECHO "$DPKG --get-selections | $AWK '!/deinstall|purge|hold/'" >> $LOG $DPKG --get-selections | $AWK '!/deinstall|purge|hold/' >> $LOG 2>> $LOG fi fi $DATE >> $LOG else $ECHO "$MOUNTPOINT not mounted" >> $LOG fi if [ -n "$MAILREC" ];then $MAIL -s "$MAILSUBJECT" $MAILREC < $LOG 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. == Beispiel tousbplatte.sh == Sichern auf USB-Festplatte mit Überprüfung des Mountpoints, {{{#!code bash SOURCES="/root/ /etc/ /home/ /root/" TARGET="/media/usb/zielverzeichnis/" RSYNCCONF="--delete" MOUNTPOINT="/media/usb" #PACKAGES=1 #MONTHROTATE=1 #MAILREC="user@localhost" #SSHUSER="root" #SSHPORT=22 #FROMSSH="clientsystem" #TOSSH="backupuserver" }}} == Beispiel tossh.sh == Sichern zu SSH-Server und E-Mail-Benachrichtigung. {{{#!code bash SOURCES="/root/ /etc/ /home/ /root/" TARGET="/pfad/auf/ssh-zielserver/" RSYNCCONF="--delete" #MOUNTPOINT="/daten" PACKAGES=1 #MONTHROTATE=1 MAILREC="user@localhost" SSHUSER="root" SSHPORT=22 #FROMSSH="clientsystem" TOSSH="192.168.1.100" }}} = Installation und Ausführung = Das Skript muss ausführbar[3] gemacht werden. == Optionen und Parameter == Das Skript erwartet genau einen Eintrag für das Backup-Ziel `TARGET` und einen bzw. mehrere Einträge für die Backup-Quellen `SOURCES`. Die Pfadangaben sind mit "/" zu beenden. `MOUNTPOINT` darf __kein__ abschließendes "/" enthalten. Falls keine Überprüfung stattfinden soll, kann `MOUNTPOINT` leer gelassen oder mit "#" auskommentiert werden. `RSYNC` -Optionen: Das Backup-Skript nutzt [:rsync:] für die Synchronisation der Verzeichnisse und Daten. Über die Variable `RSYNC` kann die Sicherung z.B. eingeschränkt werden. {{{#!vorlage Befehl --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) }}} `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. {{{#!vorlage Hinweis 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. }}} = Einschränkungen = Das Skript wurde nur für unten gelisteten Dateisysteme getestet. Ein Einsatz von NTFS oder FAT als Zieldateisystem ist nur eingeschränkt möglich. ||<-3 rowclass="titel"> Getestete Dateisysteme || || FS || inkrementell || Hinweise || || ext2 || Ja ||<|5> Praktisch alle UNIX-artigen Dateisysteme unterstützen [wikipedia:Hardlink: 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 ||<|2> 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 [wikipedia:Cygwin:] heraus, sind inkrementelle Backups ebenfalls möglich. || || NTFS (Windows) || Ja || = Externes Backup bei FAT-Partitionen = Für ein Backup auf einem externen Medium mit einem abweichenden Dateisystem kann ein beliebiges Tagesarchiv z.B. mit TAR leicht gesichert werden. {{{#!vorlage Befehl 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. = Daten zurücksichern = Die Daten können einfach mit Betriebssystemmitteln ([:Shell/cp:cp], [:rsync:]) bei Bedarf zurück kopiert werden. Um alle Pakete zu installieren, die in der Liste der installierten Pakete gesichert wurden, folgenden Befehl verwenden (Root-Rechte benötigt)[6]: {{{#!vorlage Befehl cat packages.list | dpkg --set-selections }}} = Links = * [:Datensicherung:] - Übersicht; wichtige Verzeichnisse ---- # tag: Shell, Sicherheit, Backup