Datensicherung

Aus Mediawiki Ferdinand Gruber
Zur Navigation springen Zur Suche springen

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 über Schlüsselpaare erfolgen.
Siehe Artikel über SSH

Sicherung starten über cronjob

Nach Abmeldung des letzten Benutzers wird automatisch das Sicherungsskript 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 eigentliche Sicherungsskript ist.

bak.sh

Dieses Skript wird per per cronjob vom Skript bak_cron.sh aufgerufen, wenn die oben beschriebenen Bedingungen erfüllt sind.

Ruft man auf der Kommanozeile 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 festgelegt werden.

bak.conf

Excludes

Die vom Backup auszuschließenden Dateien bzw. Verzeichnisse stehen in folgender Datei:

/usr/local/bin/excludes_localhost.txt

Includes

In folgender Datei stehen Dateien, die gesichert werden, auch wenn sie sich in einem Verzeichnis befinden, das in der Exclude Datei steht.

/usr/local/bin/includes_localhost.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

Löschen der temporären Dateien per Cronjob:

# Autostart
@reboot rm /tmp/backup.lock &> /dev/null ; rm /tmp/bak.sh-status &> /dev/null

Dateien

Das Sicherungstool besteht aus den folgenden Dateien

bak.conf
bak_cron.sh
bak.sh
bak_update.sh
excludes_localhost.txt
includes_localhost.txt
bak.readme
mysql_bak.sh
rotation.sh

Download

Das Archiv am besten in /usr/local/bin entpacken

Mit dem Skript bak_update.sh kann man die jeweils aktuelle Version des Projektes downloaden.

Am besten das Skript bzw. einen Symlink in folgendem Verzeichnis speichern
cd /etc/cron.daily
ln -s /usr/local/bin/bak_update.sh

Dann erfolgt das Update automatisch.

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

Dateisystem auf der Ziel-Partition

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 muss ein Label haben, weil das Label in einer Variablen im Skript bak.sh verwendet wird.

  • Dateien auf dem Sicherungsmedium erzeugen mit folgenden Befehlen
# Sicherungsmedium /dev/sdb2
hdd=/dev/sdb2
mountpoint=/media/disk
host=$(hostname | cut -f 1 -d ".")
mkdir -p $mountpoint
mount $hdd $mountpoint
cd $mountpoint
mkdir $host
cd $host
touch testfile

Sehr wichtig:

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

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 -avH --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 -av --numeric-ids /media/disk/name_des_computers/backup.0/home/user_1 /home

Beispiel 2

Über SSH das Home-Verzeichnis eines Users vom Rechner remote_host wiederherstellen.

rsync  -avz --numeric-ids -e ssh remote_host:/media/disk/name_des_computers/backup.0/home/user_1 /home
  • Testlauf durchführen

Der Schalter --dry-run führt einen Testlauf durch.

rsync -avH --dry-run --delete /media/disk/name_des_computers/backup.0/home/user_1 /home

Beispiel 3

Ganzes System wiederherstellen

Einige Dateien sollten excludiert werden.
rsync -avH --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

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 wiederherzustellendem System gelöscht.

Auf jeden Fall zunächst die Option --dry-run verwenden und die Ausgabe von rsync genau überprüfen.

Abgleich von Datensicherungen über das Internet

Falls durch eine Katastrophe oder Diebstahl mein Rechner und auch die Sicherungsfestplatte nicht mehr vorhanden sind, gleiche ich den aktuellen Datenbestand der Sicherung täglich über Internet ab. Zu diesem Zweck habe ich eine Festplatte gleicher Kapazität bei einem Computer in einem anderen Haus über USB angeschlossen. Auch an diesem Computer werden die Sicherungen gemäß oben beschriebenem Konzept durchgeführt.

In jedem Backupverzeichnis befindet sich ein Verzeichnis backup.0. Nur dieses wird per Cron Job täglich über das Internet abgeglichen mit dem Skript

bak_sync.sh
# Beispiel: cronjob täglich um 2 Uhr 11:
11 2 * * * /usr/local/bin/bak_sync.sh "lokales_verz_1, lokales_verz_2, lokales_verz_3" "entferntes_verz_1, entferntes_verz_2"

Zuerst werden per rsync eines oder mehrere Backupverzeichnisse mit dem entferten Rechner synchronisiert, dann werden andere Backupverzeichnisse von diesem Rechner zum localhost kopiert (synchronisiert).

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