Datensicherung
Alle Informationen hier erheben keinen Anspruch auf Richtigkeit oder Vollständigkeit. Das Skript ist als work in progress eines Hobbyprogrammierers zu verstehen, entstanden aus der Praxis. Anpassungen an die eigene Umgebung sind wahrscheinlich notwendig.
Sicherungsvorgang
Es geht um die Sicherung des lokalen Rechners unter einem Linux Betriebssystem. Das Ziel der Sicherung kann eine USB Festplatte, ein Rechner im LAN oder im Internet sein, in diesem Fall erfolgt die Sicherung über SSH.
- Ich verwende derzeit eine USB Festplatte, die an einem Minicomputer Raspberry Pi angeschlossen ist.
- Falls die Sicherung über SSH durchgeführt werden soll, sollte die SSH-Authentifizierung nicht durch ein Passwort sondern über Schlüsselpaare erfolgen. Dies ist besonders wichtig, wenn die Sicherung automatisiert über einen Cronjob durchgeführt werden soll, weil man da kein Passwort eingeben kann.
Siehe Artikel über SSH
Sicherung starten über cronjob
Nach Abmeldung des letzten Benutzers wird automatisch das Script bak.sh gestartet. Das Skript startet nur dann, wenn kein User mehr eingeloggt ist, auch nicht über SSH
# Backup */10 * * * * /usr/local/bin/bak_cron.sh mysqldump rotation shutdown
Obwohl der cronjob alle 10 Minuten startet, wird die Sicherung frühestens nach 20 Minuten gestartet, da im Skript mindestens 2 Leerläufe programmiert sind. Wenn die Sicherung einmal begonnen hat, wird jeder weitere Sicherungsvorgang blockiert, bis zum Neustart des Rechners.
Das Script bak.sh wird per per cronjob vom Skript bak_cron.sh aufgerufen, wenn die oben beschriebenen Bedingungen erfüllt sind.
Ruft man auf der Kommandozeile bak.sh
Skript ohne Parameter auf, erscheint ein Hilfetext, der die möglichen Parameter beschreibt.
Rotation
Nach der Sicherung wird eine Rotation der schon vorhandenen Sicherungen durchgeführt.
- Zuerst wird das älteste Verzeichnis, z.B backup.7 gelöscht. Dann wird der Inhalt von backup.6 nach backup.7 kopiert. Der Inhalt von backup.5 wird nach backup.6 kopiert, usw.. Zuletzt wird das aktuelle Backupverzeichnis backup.0 nach backup.1 kopiert. Der Kopiervorgang erfolgt über sog. Hardlinks, das heißt, es werden für nicht geänderte Dateien nur Verknüpfungen angelegt, die kaum Speicherplatz belegen. Nur geänderte Dateien werden tatsächlich kopiert. Es stehen somit jederzeit 7 Komplettsicherungen zur Verfügung.
Die Anzahl der Rotationen kann in der Konfigurationsdatei bak.conf festgelegt werden.
Dateien ausschließen vom Backup
Die vom Backup auszuschließenden Dateien bzw. Verzeichnisse stehen in folgender Datei:
/usr/local/bin/excludes.txt
In folgender Datei stehen Dateien, die gesichert werden, auch wenn sie sich in einem Verzeichnis befinden, das in der Datei excludes.txt steht.
/usr/local/bin/includes.txt
Temporäre Dateien
Folgende temporäre Dateien werden vom Skript erzeugt und normalerweise am Ende des Programms automatisch gelöscht.
/tmp/bak.sh-status /tmp/backup.lock
Zur Sicherheit sollte man aber diese temporären Dateien per Cronjob löschen:
# Autostart @reboot rm /tmp/backup.lock &> /dev/null ; rm /tmp/bak.sh-status &> /dev/null
Eine alternative Möglichkeit ist, diesen Befehl in ein Script zu schreiben, was man in /etc/cron.daily ablegt.
Dateien
Das Sicherungstool besteht aus den folgenden Dateien
bak.conf bak_cron.sh bak.sh bak_update.sh excludes.txt includes.txt bak.readme mysql_bak.sh rotation.sh
Das Archiv am besten in /usr/local/bin
entpacken oder in einem Unterordner >/usr/local/bin/bak.
Mit dem Skript bak_update.sh
kann man die jeweils aktuelle Version des Projektes downloaden.
- Am besten das Skript bzw. einen Symlink im Verzeichnis /etc/cron.daily anlegen:
cd /etc/cron.daily ln -s /usr/local/bin/bak_update.sh
Dann erfolgt das Update automatisch. Das Script bak_update.sh überschreibt eine bereits vorhandene Datei bak.conf nicht. Das gleiche gilt für eventuell vorhandene exclude- bzw. include-Dateien (*.txt).
Ziel-Partition
- Wo befindet sich die Ziel-Partition?
Sie kann im lokalen Rechner sein, auf einem USB Datenträger oder auf einem Rechner im LAN bzw. Internet.
- Linux Partition anlegen
Mit dem Kommando fdisk eine neue Partition auf einem Laufwerk anlegen
# Beispiel fdisk /dev/sdx
Als Dateisystem ext4 wählen und die Partition formatieren - bitte Vorsicht!
# Beispiel mkfs -t ext4 /dev/sdx2
- Eine eventuell vorhandene FAT oder NTFS Partition verkleinern oder löschen.
Ziel-Partition vorbereiten
Für die folgenden Schritte wird angenommen, dass die Ziel-Partition /dev/sdb2 ist
- Label für Backup Partition
tune2fs -L "LinuxBackup" /dev/sdb2
Die Backup Partition sollte ein Label haben, weil das Label in einer Variablen im Skript bak.sh
verwendet wird. Jedenfalls dann, wenn die Sicherung über USB erfolgt.
- Mit der folgenden Befehlsfolge wird die Zielpartition eingerichtet, sodass sie für die Datensicherung verwendet werden kann.
# Sicherungsmedium /dev/sdb2 PARTITION=/dev/sdb2 # Beispiel MOUNTPOINT=/media/disk HOST=$(hostname | cut -f 1 -d ".") mkdir -p $MOUNTPOINT mount $PARTITION $MOUNTPOINT cd $MOUNTPOINT mkdir $HOST cd $HOST touch testfile
Wichtiger Hinweis zur Datei testfile:
- Die Datei
testfile
ermöglicht dem Skript eine Überprüfung, ob die Ziel-Festplatte gemountet ist. Wenn diese Datei nicht existiert, dann ist die HDD nicht gemountet und die Sicherung wird abgebrochen.
- Backupskript testen
bak.sh testlauf
- Backup durchführen
bak.sh rotation
Konfiguration der Datensicherung
Die Konfiguration befindet sich in bak.conf
for option in $@ ; do case $option in auto) ROTATION="true" ;; esac done CounterRotation=20 QUELL_Host="localhost" QUELL_Pfad="/" MOUNTPOINT="/media/disk" diskLabel="LinuxBackup" # Hostname oder IP ZIEL_Host="10.0.0.111" PORT="22" mysqlPassword="xxxxxxxx" # Passwort festlegen, falls in bak.sh ein mysqldump erfolgt # EXTRAOPT+="--bwlimit=256"
Falls die Sicherungsfestplatte über USB an den Rechner angeschlossen ist, so wird sie automatisch über das Label erkannt. Die Sicherung wird dann über USB durchgeführt, auch wenn in der bak.conf ein ZIEL_Host angegeben ist.
Da die USB Festplatte über das Label identifiziert wird, muss dieses Label in der bak.conf als disLabelstehen.
Wie man einer Festplattenpartition ein Label zuweist, ist hier im Wiki beschrieben:
Wiederherstellung - Restore
Ganzes System wiederherstellen
Das folgende Beispiel klont zwei Rechner dateiweise
- Wichtige Verzeichnisse sichern, z.B.
cp -R /etc /etc.original cp -R /boot /boot.original
- Rsync über LAN
Wenn Systemdaten wiederhergestellt werden sollen, dann sollte das besser nicht im laufenden System erfolgen, daher den Computer mit einem Live System, z.B. Knoppix von CD oder USB Stick starten.
- Im folgenden Beispiel sind einige Verzeichnisse excludiert. Bitte nach Bedarf ändern.
- Die Option
--dry-run
bedeutet, dass der Kopiervorgang nur simuliert wird.
rsync -avzH --numeric-ids --dry-run -e ssh \ --exclude /home --exclude /root --exclude /local --exclude /var --exclude /srv \ --exclude /tmp --exclude /lost+found \ --exclude-from /usr/local/bin/excludes_localhost.txt \ 10.0.0.80:/* /
Wiederherstellung aus einem Backup Datenträger
Beispiel 1
Das Verzeichnis /home/user_1
soll wiederhergestellt werden.
- Die Sicherung ist lokal gemountet unter
/media/disk/name_des_computers/backup.0
- Das wieder herzustellende Verzeichnis ist in
/home
rsync -avH --numeric-ids /media/disk/<hostname>/backup.0/home/user_1 /home
- Die Option -H bewirkt, dass Hardlinks nicht als Dateien übertragen werden, sondern Hardlinks bleiben.
Beispiel 2
Über SSH das Home-Verzeichnis eines Users vom Rechner remote_host
wiederherstellen.
rsync -avzH --numeric-ids -e ssh remote_host:/media/disk/<hostname>/backup.0/home/user_1 /home
- Testlauf durchführen
--dry-run
führt einen Testlauf durch.
rsync -avH --dry-run --delete /media/disk/<hostname>/backup.0/home/user_1 /home
Beispiel 3
Ganzes System wiederherstellen
- Einige Dateien sollten excludiert werden.
rsync -avzH --numeric-ids --dry-run \ --exclude={/etc/fstab,/etc/default/grub,/boot/grub2/grub.cfg,/home,/root,/var,/srv,/media,/usr/local} \ -e ssh 10.0.0.111:/media/disk/suseVirtualbox/backup.0 /mnt/tmp
Beispiel 4
Ganzes System von einem anderen Rechner über ein beschädigtes System kopieren
- Das Verzeichnis /etc sollte eventuell excludiert werden. Nach dem Klonen kann man dann nach und nach die Konfigurationsdateien manuell bearbeiten bzw., wenn nötig, vom Quellsystem einzeln kopieren.
rsync -avzH --numeric-ids --dry-run \ --exclude={/etc,/boot/grub2/grub.cfg,/home,/root,/var,/srv,/media,/usr/local,/var/lib/mysql,/var/spool} \ -e ssh 10.0.0.111:/media/disk/suseVirtualbox/backup.0 /mnt/tmp
Wahrscheinlich könnte man noch weitere Dateien excludieren. Die exclude-Liste im obigen Beispiel hat sich bei mir aus der Praxis ergeben und erhebt keinen Anspruch auf Vollständigkeit.
Troubles bei der Wiederherstellung
Die Option --delete
ist mit Vorsicht zu verwenden.
Da bei der Sicherung Dateien excluded worden sind (z.B /dev/* /var/* etc.) , werden diese auf Grund der Option --delete
vom wiederherzustellenden System gelöscht.
- Auf jeden Fall zunächst die Option
--dry-run
verwenden und die Ausgabe von rsync genau überprüfen.
Troubles
- Illegal option -s
Dieser Fehler bezieht sich auf den in der Shell eingebauten Befehl: read
Im Skript wird der read Befehl mit Optionen aufgerufen, die nur in der bash vorhanden sind.
- Wenn dieser Fehler auftritt, dann das Skript dezidiert mit bash als Shell starten:
bash /usr/local/bin/bak.sh
Wahrscheinlich aber sollte es ausreichen, wenn die erste Zeile in jedem verwendeten Script folgenden Shebang enthält:
#!/bin/bash