ubuntuusers.de

Du betrachtest eine alte Revision dieser Wikiseite.

Backup mit RSYNC

Neben der üblichen, meist sehr aufwendigen und vor allem viel zu selten durchgeführten Sicherung auf externen Medien bietet es sich an bei ausreichendem Speicherplatz auf der lokalen Partition, einer anderen Partition oder besser einer anderen Festplatte im gleichen Rechner ein 1:1-Backup von wichtigen Daten anzufertigen. Hiermit ist man leicht in der Lage Daten zurückzusichern, da sie direkt im Dateisystem vorliegen. Das hier vorgestellte Backupscript ist automatisierbar und benötigt nur wenige Sekunden Ausführungszeit, da es nur Änderungen neu sichert.

Eine Alternative zu diesem Script ist rsnapshot. Im Gegensatz zu diesem Script verfügt es ü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 Quellpfade identische Kopien in dem Zielverzeichnis unterhalb des jeweiligen Tagesdatums (JJMMTT). Es spielt hierbei keine Rolle ob wirklich für jeden einzelnen Tag ein Backup vorliegt. Als Basis für das inkrementelle Sichern wird das letzte Backup automatisch ausgewählt. Das Backupscript nutzt Hardlinks. Es entsteht der Eindruck, dass in jedem Tagesordner sämtliche Dateien einer Vollsicherung abgelegt sind. Beliebige Tagesbackups können so z.B. per TAR auf externen Medien gesichert werden.

Löschen alter Backups

Aufgrund der Überarbeitung des Programms im März 2009 können nun veraltete Versionen automatisiert gelöscht werden. 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 deine Löschung statt. Das Risiko der automatischen Löschung besteht vor allem darin, dass aufgrund von Systemfehlern das Tagesdatum plötzlich soweit in der Zukunft liegt, dass alle Backups gelöscht werden.

Einschränkungen

Das Script wurde nur für das EXT3- bzw. UNIX-artige Dateisystem getestet. Ein Einsatz von NFTS oder FAT als Zieldateisystem ist nicht möglich.

Sichern über SSH

Das Script 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-Keys notwendig. Auf dem zu sichernden Rechner muss ein SSH-Server laufen und der Benutzer benötigt ausreichende Rechte auf dem Zielsystem. Das Script arbeitet hierbei nur in eine Richtung, um auch für externe Sicherungen inkrementell arbeiten zu können.

zusätzliche Pakete

Folgende Pakete sollten bei Bedarf installiert werden [4]:

  • rsync

  • openssh-server

Das Script

Zuerst öffnet man einen Texteditor [2] und kopiert den folgenden Text hinein:

#!/bin/bash                                                                                                                                                                        
# Simple backup with rsync                                                                                                                                                         
                                                                                                                                                                                   
# SOURCES and TARGET must end with slash                                                                                                                                           
                                                                                                                                                                                   
SOURCES="/root/ /etc/ /home/ /boot/"                                                                                                                                               
TARGET="/usr/local/backup/"                                                                                                                                                        
LOGFILE="/root/backup.log"                                                                                                                                                         
EXPIREDAYS=0                                                                                                                                                                
RSYNC="--delete"                                                                                                                                                                   

                                                                                                                                                                                   
#SSHUSER="user"                                                                                                                                                                    
#SSHHOST="hostname"                                                                                                                                                                
                                                                                                                                                                                   
### do not edit ###                                                                                                                                                                
                                                                                                                                                                                   
`/bin/date > $LOGFILE`                                                                                                                                                             
                                                                                                                                                                                   
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" ]; then                                                                                                                                        
    SOURCEDIR="$SSHUSER@$SSHHOST:$SOURCE"                                                                                                                                          
  else                                                                                                                                                                             
    SOURCEDIR=$SOURCE                                                                                                                                                              
  fi                                                                                                                                                                               
  `/bin/mkdir -p $TARGET$TODAY$SOURCE` >> $LOGFILE                                                                                                                                 
  echo "/usr/bin/rsync -av $RSYNC $INC $SOURCEDIR $TARGET$TODAY$SOURCE"  >> $LOGFILE                                                                                               
  `/usr/bin/rsync -av $RSYNC $INC $SOURCEDIR $TARGET$TODAY$SOURCE >> $LOGFILE 2>> $LOGFILE`                                                                                        
done                                                                                                                                                                               
      

Die Datei wird z.B. unter dem Namen /root/backup.sh gesichert.

Installation

Das Script benötigt Ausführrechte

chmod 755 /root/backup.sh 

Das Script kann z.B. in CRON-Abläufe eingebunden werden, womit es automatisiert ausgeführt wird. Eine Protokollierung der Aktionen ist in der Datei /root/rsync.log vorgesehen. Die Logdatei wird bei jeder Sicherung überschrieben. Bei manueller Ausführung werden keine Meldungen ausgegeben. Um die Aktionen zur Laufzeit zu kontrollieren kann die Datei /root/rsync.log wie folgt angezeigt werden:

tail -f /root/rsync.log 

Erklärungen

Das Script erwartet genau einen Eintrag für das Ziel und einen bzw. mehrere Einträge für die Quellen. Sämtliche Pfade sind mit "/" zu beenden. Für das Sichern von entfernten Rechnern können optional ein SSH-Benutzer und ein SSH-Host angegeben werden. Der Kommentar "#" ist dann entsprechend zu entfernen.

RSYNC-Optionen

Das Backupscript nutzt rsync für die Synchronisation der Verzeichnisse. Über die Variable RSYNC 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) 

Hinweis:

Das Script überprüft nicht, ob im Zielverzeichnis genügend freier Speicher vorhanden ist. Fehler bei den Eingabeparametern fängt das Script nicht ab. Die Tagesordner werden aus Gründen der Sicherheit nicht automatisch gelöscht. Da jeweils nur geänderte Dateien gesichert werden hält sich die Datenmenge jedoch in Grenzen. Fehlerhafte Angaben können das System zerstören, da die Aktionen als "root" ausgeführt werden.

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.

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 (cp, rsync) bei Bedarf zurückkopiert werden.

Diese Revision wurde am 20. März 2009 11:14 von uname erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Backup, Sicherheit, Shell