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 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 Script sind rsnapshot und dirvish. Im Gegensatz zu diesem Script 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 Quellpfade identische Kopien in dem Zielverzeichnis unterhalb des jeweiligen Tagesdatums (JJMMTT). Als Basis für das inkrementelle Sichern wird das letzte Backup automatisch ausgewählt. Bei mehrmaligen Ausführen am gleichen Tag wird der aktuelle Tagesordner wiederverwendet und nur die Änderungen überschrieben. Somit bleibt für einen Tag die letzte Sicherung bestehen. Das Backupscript nutzt Hardlinks, wodurch der Eindruck entsteht, dass in jedem Tagesordner sämtliche Dateien einer Vollsicherung abgelegt sind. Jedoch wird bei unveränderten Dateien lediglich ein weiterer Link auf die Datei angelegt, wodurch das Übertragen der Datei und der Speicherplatz im Backupmedium gespart werden. Beliebige Tagesbackups können so z.B. per TAR auf externen Medien gesichert werden.

Pakete

Vom Script benötigt:[4]

  • rsync

Folgende Pakete sollten bei Bedarf installiert werden:

  • openssh-server

  • mutt

Überprüfen des Mountpoints

Über den Parameter "MOUNTPOINT" kann zur Laufzeit des Scripts 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. Wird kein Mountpoint ausgewählt so wird auf jeden Fall ein Backup durchgeführt.

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 Script 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.

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.

Das Script

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!/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
    echo "dpkg --get-selections | awk '!/deinstall|purge|hold/ {print $1}' > $PACKAGES " >> $LOGFILE 2>> $LOGFILE
    dpkg --get-selections | awk '!/deinstall|purge|hold/ {print $1}' > $PACKAGES 2>> $LOGFILE
    echo -e "/bin/mv $PACKAGES $TARGET$TODAY \n" >> $LOGFILE 2>> $LOGFILE
    /bin/mv $PACKAGES $TARGET$TODAY 2>> $LOGFILE
  fi

  /bin/date >> $LOGFILE
  /bin/cp $LOGFILE $TARGET$TODAY/backup-$(/bin/date +%T).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 Script benötigt Ausführrechte. Diese mit chmod vergeben und das Script starten.

sudo chmod 755 /root/backup.sh
sudo /root/backup.sh 

Das Script 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. Eine zusätzliche Kopie mit Zeitstempel wird in den Tages-Backupordner abgelegt. 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, hilft für das obige Beispiel:

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.

--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) 

Soll das Script automatisiert innerhalb bestimmter Zeitintervalle laufen, kann es z.B. in Cron-Abläufe eingebunden werden.

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. Fehlerhafte Angaben können das System zerstören, da die Aktionen als "root" ausgeführt werden.

Einschränkungen

Das Script 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 unterstuetzen 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 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.

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 7. Juli 2010 16:21 von moonloop erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Backup, Sicherheit, Shell