## page was renamed from Baustelle/Backup mit RSYNC [[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(2)]] [[Bild(http://media.ubuntuusers.de/wiki/attachments/37/28/backup.png)]] 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 Backupscript 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 Backupscript ist jedoch die Einfachheit und Übersichtlichkeit sowie der Verzicht auf weitere Paketinstallationen. = Funktion = Das Backupscript 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 Tool '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:'''[4] * rsync Folgende Pakete sollten '''bei Bedarf''' installiert werden: * openssh-server (für das Sichern von einer Quelle über SSH) * mutt (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. Die Überprüfung kann durch weglassen der Option ausgeschaltet werde. == Löschen alter Backups == Zur Minimierung der archivierten Datenmenge ist eine automatisierte Löschung alter Backups möglich. "EXPIREDAYS" gibt hierbei in Tagen an, wann ein Backup als veraltet gilt. Aufgrund der inkrementellen Sicherung betrifft die Löschung dann tatsächlich nur die Dateien, die vor mehr Tagen geändert oder gelöscht wurden. Bei der Angabe "0" findet keine Löschung statt. Die automatische Löschung ist vor allem dann ein Risiko wenn z.B. aufgrund von Systemfehlern über einen längeren Zeitraum keine Sicherung stattgefunden hat und somit alle Sicherungen (auch die letzte) als veraltet gelöscht wird. == 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 '''mutt''' installiert sein. Der E-Mail-Versand kann durch weglassen der Option ausgeschaltet werden. == Sichern über SSH == Das Skript ermöglicht auch das Sichern von Daten von einem entfernten Rechner per [:SSH:]. Hierfür sind neben den korrekten Angaben für Quelle und Ziel nur Benutzername und Rechnername erforderlich. Zur automatischen Sicherung ist der Austausch von [:SSH#Authentifizierung-ueber-Public-Keys: SSH-Keys] notwendig. Auf dem zu sichernden Rechner muss ein SSH-Server laufen und der Benutzer benötigt ausreichende Rechte auf dem Zielsystem. Das Skript arbeitet hierbei nur in eine Richtung, um auch für externe Sicherungen inkrementell arbeiten zu können. = Das Skript = Das [attachment:Skripte/Backup_mit_RSYNC/backup.sh:verlinkte Backupscript] herunterladen und speichern. Man kann auch einen Texteditor [2] öffnen und folgenden Text hinein kopieren: {{{#!code bash #!/bin/bash # Simple backup with rsync # sources and target MUST end WITH slash SOURCES="/root/ /etc/ /home/ /boot/" TARGET="/media/server/backup/" # mountpoint must end WITHOUT slash #MOUNTPOINT="/media/server" LOGFILE="/root/backup.log" EXPIREDAYS=0 RSYNC="--delete" #PACKAGES="/tmp/packages.list" #MAILREC="root@localhost" #SSHUSER="" #SSHHOST="" #SSHPORT=22 ### do not edit ### /bin/date > $LOGFILE MOUNTED=$(/bin/mount | /bin/fgrep "$MOUNTPOINT"); if [ -z "$MOUNTPOINT" ] || [ -n "$MOUNTED" ]; then if [ -e $TARGET ]; then LASTBACKUP=$(/bin/ls -d $TARGET[[:digit:]]* 2>> $LOGFILE | /usr/bin/sort -r | /usr/bin/head -1) fi TODAY=$(/bin/date +%y%m%d) if [ $EXPIREDAYS -gt 0 ]; then EXPIRED=$(/usr/bin/find $TARGET[[:digit:]]* -maxdepth 0 -ctime +$EXPIREDAYS 2>> $LOGFILE) for EX in $(/bin/echo $EXPIRED) do /bin/echo "rm -rf $EX " >> $LOGFILE /bin/rm -rf $EX done fi for SOURCE in $(/bin/echo $SOURCES) do if [ "$LASTBACKUP" ]; then INC="--link-dest=$LASTBACKUP$SOURCE" fi if [ "$SSHUSER" ] && [ "$SSHHOST" ] && [ "$SSHPORT" ]; then SSH="ssh -p $SSHPORT -l $SSHUSER"; SOURCEDIR="$SSHHOST:$SOURCE"; else SOURCEDIR=$SOURCE; fi /bin/mkdir -p $TARGET$TODAY$SOURCE >> $LOGFILE 2>> $LOGFILE; echo "/usr/bin/rsync -e \"$SSH\" -av $SOURCEDIR $RSYNC $INC $TARGET$TODAY$SOURCE " >> $LOGFILE 2>> $LOGFILE; /usr/bin/rsync -e "$SSH" -av $SOURCEDIR $RSYNC $INC $TARGET$TODAY$SOURCE >> $LOGFILE 2>> $LOGFILE; done if [ -n "$PACKAGES" ]; then if [ -z "$SSHUSER" ] || [ -z "$SSHHOST" ] || [ -z "$SSHPORT" ] ; then echo "dpkg --get-selections | awk '!/deinstall|purge|hold/' > $PACKAGES" >> $LOGFILE 2>> $LOGFILE dpkg --get-selections | awk '!/deinstall|purge|hold/' > $PACKAGES 2>> $LOGFILE echo -e "/bin/mv $PACKAGES $TARGET$TODAY \n" >> $LOGFILE 2>> $LOGFILE /bin/mv $PACKAGES $TARGET$TODAY 2>> $LOGFILE fi fi /bin/date >> $LOGFILE /bin/cp $LOGFILE $TARGET$TODAY/backup-$(/bin/date +%H%M%S).log 2>> $LOGFILE else /bin/echo "$MOUNTPOINT not mounted" >> $LOGFILE fi if [ -n "$MAILREC" ];then /bin/echo -e 'Backup is finished!\n'$(/bin/date) | /usr/bin/mutt -s "Backup" -a $LOGFILE -- $MAILREC /bin/rm $LOGFILE fi }}} Die Datei wird z.B. unter dem Namen '''/root/backup.sh''' gesichert. = Installation und Ausführung = Das Skript benötigt Ausführrechte[3]. Diese mit chmod vergeben und das Skript starten[5][6]. {{{#!vorlage Befehl sudo chmod 755 /root/backup.sh sudo /root/backup.sh }}} == 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. '''"LOGFILE"''' wird zur Protokollierung der Aktionen und deren Rückgabewerte benötigt. Hier bitte einen Pfad angeben, an dem das Logfile temporär gespeichert wird, z.B. /root/backup.log oder /tmp/backup.log. Am Ende wird Logfile mit Zeitstempel in den Tages-Backupordner abgelegt. So kann man bei mehreren Backups an einem Tag nachvollziehen, zu welcher Zeit was gesichert wurde. Während der Ausführung werden keine Meldungen in der Shell ausgegeben. Will man schon während der Laufzeit einen Blick in die Logdatei werfen, muss man die temporäre Logfile ausgeben. Für LOGFILE="/root/backup.log" kann man folgenden Befehl benutzen: {{{#!vorlage Befehl tail -f /root/backup.log }}} '''"EXPIREDAYS"''' wird benötigt, um ältere Backups automatisch zu löschen. Eine 14 würde alle Backups, die älter als 2 Wochen sind automatisch löschen. Damit niemals automatisch gelöscht wird, "EXPIREDAYS=0" setzen. '''"RSYNC"''' -Optionen: Das Backupscript 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. Z.B. PACKAGES="/tmp/packages.list" als temporären Speicherort für die Liste wählen. Letztendlich wird die Datei in den Tages-Backupordner verschoben. Bei mehreren Läufen an einem Tag wird jeweils die alte Version überschrieben. '''"MAILREC"''' verwenden, um die Logfile an eine E-Mail-Adresse zu versenden. Dafür muss '''mutt''' 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 unterstuetzen [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 inkr. 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ückkopiert werden. Um alle Pakete zu installieren, die in der Liste der installierten Pakete gesichert wurden, folgenden Befehl verwenden (Root-Rechte benötigt)[6]: {{{ cat packages.list | dpkg --set-selections }}} # tag: Shell, Sicherheit, Backup