Archive

Archive for Dezember 2011

Automatische Sicherung von Windows Verzeichnissen

2011/12/06 Kommentare aus

Es existieren mehrere Lösungen um die Sicherung von Daten über das Netzwerk mehr oder weniger automatisiert durchzuführen, unter anderem die Open-Source Programme Bacula und Amanda. Oft ist die Komplexität dieser Programme aber zu hoch, ein von Hand erstelltes Shellskript bei weitem ausreichend.

Alleine durch die Verwendung der UNIX-Standardwerkzeuge cp, rsync sowie crontab und der Verwendung von Windows-Standardfreigaben ist jedoch  bereits ein sehr gutes und leichtgewichtiges Konzept zur automatisierten Sicherung von Benutzerdaten realisierbar:

  • Keine Änderungen an den Client-Rechnern notwendig
  • minimale Netzwerklast bei Übertragung der zu sichernden Daten
  • Erstellung von Snapshots der gesicherten Daten möglich
  • minimaler Speicherbedarf auf dem Backup-Server
  • einfache Zeitplanung der Sicherung durch Eintrag in crontab

Windows Standardfreigaben

Microsoft Windows stellt per Default für jedes lokale Laufwerk eine Standardfreigabe bereit. Diese wird über das Netzwerk einfach mit dem entsprechendem Laufwerksbuchstaben und einem darauf folgenden Dollarzeichen angesprochen, also z.B. \\CLIENT\C$ für Laufwerk C:. Windows-Freigaben die mit einem Dollarzeichen enden sind in der Netzwerkübersicht generell nicht sichtbar, können aber bei Kenntnis des genauen Freigabenamens problemlos angezeigt werden. Zu beachten ist dabei aber, dass die automatisch erstellten Standardfreigaben nur für Benutzer mit Administrator-Rechten verwendbar sind.

rsync

rsync ist ein Programm zur Synchronisation von Daten. Die Synchronisation läuft bei rsync nur in eine Richtung, also von einem Quellverzeichnis zu einem Zielverzeichnis, ab. Ein wichtiges Merkmal von rsync ist, dass es nicht nur ganze Dateien kopieren kann, sondern auch Teile von Dateien. Wurde auf dem Quell-Datenträger eine Datei verändert, werden nur die geänderten Teile der Datei auf das Zielsystem übertragen. Die Folge ist eine minimale Netzwerklast (mit einem geringem Overhead).

Hardlinks

Durch Erstellung von Hardlinks kann eine beliebige Anzahl von Snapshots der gesicherten Daten erstellt werden, ein Zugriff auf den Zustand der gesicherten Daten beispielsweise von vor einem Monat oder auch von vor nur einer Stunde ist problemlos möglich. Eine sehr wichtige Funktionalität bei unbeabsichtigten Änderungen oder eventuellem Virenbefall. Was ist eigentlich ein Hardlink? Unter Linux ist ein Hardlink nichts anderes als ein weiterer Name für eine bereits bestehende Datei. Falls die Originaldatei gelöscht wird können die darin enthaltenen Daten immer noch über den erstellten Hardlink angesprochen werden. Ein Hardlink verbraucht außer einem Inode keinen weiteren Platz auf dem Dateisystem. Dadurch lassen sich mehrere Versionen der gesicherten Daten bei minimalem Speicherbedarf vorhalten.

crontab

Durch Eintrag eine cronjobs ist die wiederkehrende Sicherung automatisch und ohne manuelle Interaktion des Administrators möglich.

Konfiguration der zu sichernden Daten

/root/shares.txt

benutzer1://WORK1/D$/foo/bar
benutzer2://WORK2/C$/MeinVerzeichnis
benutzer3://WORK3/C$/Daten/benutzer3/Back_Me_Up
benutzer4://WORK4/C$/Verzeichnis/Nutzerdaten

Die zu sichernden Daten sind zentral in einer einfachen Textdatei konfiguriert. Angegeben wird hier durch Doppelpunkt getrennt der Benutzername und das zu sichernde Verzeichnis im UNC Format (Vorsicht bei Leer- oder Metazeichen). Es ist empfehlenswert die angeführten Benutzer vorher auch im System anzulegen – die gesicherten Daten können dem Benutzer dann beispielsweise als Netzwerkfreigabe seines Heimatverzeichnisses read-only bereitgestellt werden.

Shellskript zur Sicherung der konfigurierten Verzeichnisse

/root/backup.sh

#!/bin/bash
for line in `cat /root/shares.txt`; do
 USERNAME=`echo $line | cut -d: -f1`
 SHARE=`echo $line | cut -d: -f2`
 DIRECTORY=`basename "$SHARE"`
echo "$USERNAME $SHARE $DIRECTORY"

 /bin/mount -t cifs -o ro,credentials=/etc/samba/.smbcredentials $SHARE /mnt/tmp
 if [ $? -eq 0 ]; then
 trap "/bin/umount -l /mnt/tmp; exit" INT TERM EXIT
 /usr/bin/rsync -a --delete /mnt/tmp/ /home/$USERNAME/$DIRECTORY
 /bin/umount /mnt/tmp
 trap - INT TERM EXIT
 fi
done

Für jede Zeile in shares.txt wird der Benutzername, die Netzwerkfreigabe sowie das darauf zu sichernde Verzeichnis in entsprechende Variablen gespeichert und daraufhin durch den echo-Befehl auf der Konsole ausgegeben. Danach wird versucht, die angegebene Freigabe in das Dateisystem einzubinden. Besonders anzumerken bei diesem mount-Befehl ist die Verwendung des credentials-Parameters – Zugangsdaten werden dabei in einer externen Datei (hier: /etc/samba/.smbcredentials) abgelegt anstatt im Shellskript angeführt zu sein. Der Aufbau dieser Datei ist recht einfach:

username=Administrator
password=Pa$$w0rd
domain=ARBEITSGRUPPE

Falls der mount-Befehl erfolgreich war werden die zu sichernden Daten via rsync in das lokale Verzeichnis /home/<Benutzername> übertragen und die Netzwerkfreigabe danach wieder aus dem Dateisystem ausgehängt. Die Verwendung des trap-Befehls stellt hier sicher, dass die Netzwerkfreigabe auf jeden Fall aus dem Dateisystem ausgehängt wird, also auch bei Abbruch des Shellskripts.

Shellskript zur Erstellung von Snapshots

/root/snapshot_backup.sh

#!/bin/bash
for line in `cat /root/shares.txt`; do
 USERNAME=`echo $line | cut -d: -f1`
 SHARE=`echo $line | cut -d: -f2`
 DIRECTORY=`basename "$SHARE"`

 echo "removing oldest snapshot: 4"
 rm -rf /home/$USERNAME/snapshot4_${DIRECTORY}
 echo "moving snapshots: 3 -> 4, 2 -> 3, 1 -> 2"
 mv /home/$USERNAME/snapshot3_${DIRECTORY} /home/$USERNAME/snapshot4_${DIRECTORY}
 mv /home/$USERNAME/snapshot2_${DIRECTORY} /home/$USERNAME/snapshot3_${DIRECTORY}
 mv /home/$USERNAME/snapshot1_${DIRECTORY} /home/$USERNAME/snapshot2_${DIRECTORY}
echo "creating snapshot 1"
 echo "cp -al /home/$USERNAME/$DIRECTORY /home/$USERNAME/snapshot1_${DIRECTORY}"
 cp -al /home/$USERNAME/$DIRECTORY /home/$USERNAME/snapshot1_${DIRECTORY}
done

Dieses Shellskript ist ähnlich aufgebaut wie das vorige. Nach Auslesen der in shares.txt definierten Verzeichnisse wird der älteste existierende Snapshot (in diesem Fall Nummer 4) gelöscht, Snapshot Nummer Drei wird umbenannt zu Snapshot Nummer Vier, Zwei zu Drei und Eins zu Zwei. Danach wird ein Snapshot des aktuellen Datenbestands unter mit der Bezeichnung snapshot1 angelegt. Wir erinnern uns, durch die Erstellung von hardlinks wird fast kein zusätzlicher Platz auf der Festplatte beansprucht, die Erstellung der Snapshots sollte sehr schnell vonstatten gehen.

Zeitsteuerung durch Eintrag in crontab

Die Skripte können durch Erstellung eines cronjobs sehr einfach automatisiert ausgeführt werden. Der crontab lässt sich durch Aufruf des Befehls crontab -e bearbeiten.

00 12 * * * /root/backup.sh
00 14 * * 5 /root/snapshot_backup.sh

In diesem Fall wird die Sicherung der Nutzerdaten täglich um 12:00 Uhr ausgeführt sowie jeweils Freitags ein Snapshot des aktuellen Zustands der gesicherten Daten angelegt.