Datensicherung: Unterschied zwischen den Versionen

Aus Mediawiki Ferdinand Gruber
Zur Navigation springen Zur Suche springen
 
(53 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 3: Zeile 3:
 
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.
 
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.
 
: 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.
+
: 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]]
+
 
 +
Siehe Artikel über [[SSH]]
 
=== Sicherung starten über cronjob ===
 
=== Sicherung starten über cronjob ===
Nach Abmeldung des letzten Benutzers wird automatisch das Sicherungsskript gestartet.
+
Nach Abmeldung des letzten Benutzers wird automatisch das Script <tt>bak.sh</tt> gestartet.
 
Das Skript startet nur dann, wenn kein User mehr eingeloggt ist, auch nicht über SSH
 
Das Skript startet nur dann, wenn kein User mehr eingeloggt ist, auch nicht über SSH
 
  # Backup
 
  # Backup
Zeile 12: Zeile 13:
 
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.
 
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.
+
Das Script <tt>bak.sh</tt> wird per per cronjob vom Skript <tt>bak_cron.sh</tt> aufgerufen, wenn die oben beschriebenen Bedingungen erfüllt sind.
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 <code>bak.sh</code> Skript ohne Parameter auf, erscheint ein Hilfetext, der die möglichen Parameter beschreibt.
+
Ruft man auf der Kommandozeile <code>bak.sh</code> Skript ohne Parameter auf, erscheint ein Hilfetext, der die möglichen Parameter beschreibt.
  
 
=== Rotation ===
 
=== Rotation ===
Zeile 22: Zeile 21:
 
: 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.
 
: 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.
+
Die Anzahl der Rotationen kann in der Konfigurationsdatei <tt>bak.conf</tt> festgelegt werden.
bak.conf
 
  
=== Excludes ===
+
=== Dateien ausschließen vom Backup ===
 
Die vom Backup auszuschließenden Dateien bzw. Verzeichnisse stehen in folgender Datei:
 
Die vom Backup auszuschließenden Dateien bzw. Verzeichnisse stehen in folgender Datei:
  /usr/local/bin/excludes_localhost.txt
+
  /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 <tt>excludes.txt</tt> steht.
 +
/usr/local/bin/includes.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 ===
 
=== Temporäre Dateien ===
 
Folgende temporäre Dateien werden vom Skript erzeugt und normalerweise am Ende des Programms automatisch gelöscht.
 
Folgende temporäre Dateien werden vom Skript erzeugt und normalerweise am Ende des Programms automatisch gelöscht.
 
  /tmp/bak.sh-status
 
  /tmp/bak.sh-status
 
  /tmp/backup.lock
 
  /tmp/backup.lock
Löschen der temporären Dateien per Cronjob:
+
Zur Sicherheit sollte man aber diese temporären Dateien per Cronjob löschen:
 
  # Autostart
 
  # Autostart
 
  @reboot rm /tmp/backup.lock &> /dev/null ; rm /tmp/bak.sh-status &> /dev/null
 
  @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 <tt>/etc/cron.daily</tt> ablegt.
  
 
== Dateien ==
 
== Dateien ==
Zeile 46: Zeile 45:
 
  bak.sh
 
  bak.sh
 
  bak_update.sh
 
  bak_update.sh
  excludes_localhost.txt
+
  excludes.txt
  includes_localhost.txt
+
  includes.txt
 
  bak.readme
 
  bak.readme
 
  mysql_bak.sh
 
  mysql_bak.sh
Zeile 53: Zeile 52:
 
[https://t2792.greatnet.de/download/bak.tar Download]
 
[https://t2792.greatnet.de/download/bak.tar Download]
  
Das Archiv am besten in <code>/usr/local/bin</code> entpacken
+
Das Archiv am besten in <code>/usr/local/bin</code> entpacken oder in einem Unterordner <tt>/usr/local/bin/bak</tt>.
  
 
Mit dem Skript <code>bak_update.sh</code> kann man die jeweils aktuelle Version des Projektes downloaden.
 
Mit dem Skript <code>bak_update.sh</code> kann man die jeweils aktuelle Version des Projektes downloaden.
: Am besten das Skript bzw. einen Symlink in folgendem Verzeichnis speichern
+
: Am besten das Skript bzw. einen Symlink im Verzeichnis <tt>/etc/cron.daily</tt> anlegen:
 
  cd /etc/cron.daily
 
  cd /etc/cron.daily
 
  ln -s /usr/local/bin/bak_update.sh
 
  ln -s /usr/local/bin/bak_update.sh
Dann erfolgt das Update automatisch.
+
Dann erfolgt das Update automatisch. Das Script <tt>bak_update.sh</tt> überschreibt eine bereits vorhandene Datei <tt>bak.conf</tt> nicht. Das gleiche gilt für eventuell vorhandene exclude- bzw. include-Dateien (*.txt).
  
 
== Ziel-Partition ==
 
== Ziel-Partition ==
Zeile 65: Zeile 64:
 
Sie kann im lokalen Rechner sein, auf einem USB Datenträger oder auf einem Rechner im LAN bzw. Internet.
 
Sie kann im lokalen Rechner sein, auf einem USB Datenträger oder auf einem Rechner im LAN bzw. Internet.
 
* Linux Partition anlegen
 
* Linux Partition anlegen
Mit dem Konsolenprogramm fdisk eine neue Partition auf einem Laufwerk anlegen
+
Mit dem Kommando <tt>fdisk</tt> eine neue Partition auf einem Laufwerk anlegen
 
  # Beispiel
 
  # Beispiel
 
  fdisk /dev/sdx
 
  fdisk /dev/sdx
Zeile 73: Zeile 72:
 
: Eine eventuell vorhandene FAT oder NTFS Partition verkleinern oder löschen.
 
: Eine eventuell vorhandene FAT oder NTFS Partition verkleinern oder löschen.
  
=== Dateisystem auf der Ziel-Partition ===
+
=== Ziel-Partition vorbereiten ===
 
Für die folgenden Schritte wird angenommen, dass die Ziel-Partition '''/dev/sdb2''' ist
 
Für die folgenden Schritte wird angenommen, dass die Ziel-Partition '''/dev/sdb2''' ist
 
* Label für Backup Partition
 
* Label für Backup Partition
 
  tune2fs -L "LinuxBackup" /dev/sdb2
 
  tune2fs -L "LinuxBackup" /dev/sdb2
Die Backup Partition muss ein Label haben, weil das Label in einer Variablen im Skript <code>bak.sh</code> verwendet wird.
+
Die Backup Partition sollte ein Label haben, weil das Label in einer Variablen im Skript <code>bak.sh</code> verwendet wird. Jedenfalls dann, wenn die Sicherung über USB erfolgt.
* Dateien auf dem Sicherungsmedium erzeugen mit folgenden Befehlen
+
: Mit der folgenden Befehlsfolge wird die Zielpartition eingerichtet, sodass sie für die Datensicherung verwendet werden kann.
  # Sicherungsmedium /dev/sdb2
+
  # Sicherungsmedium /dev/sdb2  
  hdd=/dev/sdb2
+
  PARTITION=/dev/sdb2 # Beispiel
 
+
  MOUNTPOINT=/media/disk
  mountpoint=/media/disk
+
  HOST=$(hostname | cut -f 1 -d ".")
  host=$(hostname | cut -f 1 -d ".")
+
  mkdir -p $MOUNTPOINT
  mkdir -p $mountpoint
+
  mount $PARTITION $MOUNTPOINT
  mount $hdd $mountpoint
+
  cd $MOUNTPOINT
  cd $mountpoint
+
  mkdir $HOST
  mkdir $host
+
  cd $HOST
  cd $host
 
 
  touch testfile
 
  touch testfile
Sehr wichtig:  
+
<span style="color:red">Wichtiger Hinweis zur Datei <tt>testfile</tt>:</span>
 
: Die Datei <code>testfile</code> 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.
 
: Die Datei <code>testfile</code> 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
 
* Backupskript testen
Zeile 96: Zeile 94:
 
* Backup durchführen
 
* Backup durchführen
 
  bak.sh rotation
 
  bak.sh rotation
 +
 +
== Konfiguration der Datensicherung ==
 +
Die Konfiguration befindet sich in <tt>bak.conf</tt>
 +
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 erkannt. Die Sicherung wird dann über USB durchgeführt, auch wenn in der <tt>bak.conf</tt> ein <tt>ZIEL_Host</tt> angegeben ist.
 +
 +
Da die USB Festplatte über das Label identifiziert wird, muss dieses Label in der <tt>bak.conf</tt> als <tt>diskLabel</tt> stehen.
 +
 +
Wie man einer Festplattenpartition ein Label zuweist, ist [[Partitionen_und_Dateisysteme#Label| hier in diesem Wiki]] beschrieben:
  
 
== Wiederherstellung - Restore ==
 
== Wiederherstellung - Restore ==
Zeile 107: Zeile 131:
 
: Im folgenden Beispiel sind einige Verzeichnisse excludiert. Bitte nach Bedarf ändern.
 
: Im folgenden Beispiel sind einige Verzeichnisse excludiert. Bitte nach Bedarf ändern.
 
: Die Option <code>--dry-run</code> bedeutet, dass der Kopiervorgang nur simuliert wird.
 
: Die Option <code>--dry-run</code> bedeutet, dass der Kopiervorgang nur simuliert wird.
  rsync -avH --numeric-ids --dry-run -e ssh \
+
  rsync -avzH --numeric-ids --dry-run -e ssh \
 
     --exclude /home --exclude /root --exclude /local --exclude /var --exclude /srv \
 
     --exclude /home --exclude /root --exclude /local --exclude /var --exclude /srv \
 
     --exclude /tmp --exclude /lost+found \
 
     --exclude /tmp --exclude /lost+found \
Zeile 113: Zeile 137:
 
     10.0.0.80:/* /
 
     10.0.0.80:/* /
  
=== Wiederherstellung aus einem Backup Datenträger ===
+
=== Wiederherstellung aus einem Backup ===
==== Beispiel 1 ====
+
Die Option <tt>-H</tt> bewirkt, dass Hardlinks nicht als Dateien übertragen werden, sondern Hardlinks bleiben.
Das Verzeichnis <code>/home/user_1 </code> soll wiederhergestellt werden.
 
: Die Sicherung ist lokal gemountet unter <code> /media/disk/name_des_computers/backup.0 </code>
 
: Das wieder herzustellende Verzeichnis ist in <code> /home </code>
 
rsync -avH --numeric-ids /media/disk/name_des_computers/backup.0/home/user_1 /home
 
: Die Option <tt>-H</tt> bewirkt, dass Hardlinks nicht als Dateien übertragen werden, sondern Hardlinks bleiben.
 
  
 +
==== Beispiel 1 ====
 +
Über SSH das Home-Verzeichnis eines Users wiederherstellen.
 +
rsync  -avzH --dry-run --delete --numeric-ids -e ssh remote_host:/media/disk/<hostname>/backup.0/home/user_1 /home
 
==== Beispiel 2 ====
 
==== Beispiel 2 ====
Über SSH das Home-Verzeichnis eines Users vom Rechner <code>remote_host</code> wiederherstellen.
 
rsync  -avzH --numeric-ids -e ssh remote_host:/media/disk/name_des_computers/backup.0/home/user_1 /home
 
* Testlauf durchführen
 
: <code>--dry-run</code> 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
 
Ganzes System wiederherstellen
: Einige Dateien sollten excludiert werden.
 
 
  rsync -avzH --numeric-ids --dry-run \  
 
  rsync -avzH --numeric-ids --dry-run \  
 
     --exclude={/etc/fstab,/etc/default/grub,/boot/grub2/grub.cfg,/home,/root,/var,/srv,/media,/usr/local} \
 
     --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
 
   -e ssh 10.0.0.111:/media/disk/suseVirtualbox/backup.0 /mnt/tmp
  
=== Troubles bei der Wiederherstellung ===
+
==== Beispiel 3 ====
Die Option <code> --delete </code> ist mit Vorsicht zu verwenden.
+
SUSE nach Systemupgrade auf alte Version zurücksetzen.
Da bei der Sicherung Dateien excluded worden sind (z.B /dev/* /var/* etc.) , werden diese auf Grund der Option <code> --delete </code> vom wiederherzustellendem System gelöscht.
+
rsync -avzH --numeric-ids --dry-run \
: Auf jeden Fall zunächst die Option <code>--dry-run</code> verwenden und die Ausgabe von '''rsync''' genau überprüfen.
+
    --exclude={/home,/root,/srv,/media,/usr/local,/var/lib/mysql,/var/spool} \
 
+
  -e ssh 10.0.0.111:/media/disk/suseVirtualbox/backup.0 /mnt/tm
== 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 <code>backup.0</code>. 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 ==
 
== Troubles ==
* Illegal option -s
+
=== Illegal option -s ===
 
Dieser Fehler bezieht sich auf den in der Shell eingebauten Befehl: '''read'''
 
Dieser Fehler bezieht sich auf den in der Shell eingebauten Befehl: '''read'''
  
Zeile 159: Zeile 161:
 
: Wenn dieser Fehler auftritt, dann das Skript dezidiert mit bash als Shell starten:
 
: Wenn dieser Fehler auftritt, dann das Skript dezidiert mit bash als Shell starten:
 
  bash /usr/local/bin/bak.sh
 
  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
 +
=== Verschiedene Versionen ===
 +
Auf Quell- und Zielrechner sollten die gleichen Versionen von <tt>Rsync</tt> installiert sein, da es sonst zu Fehlermeldungen kommen kann.
 +
==== Download und Installation ====
 +
# Version rsync-3.1.3
 +
wget https://download.samba.org/pub/rsync/src/rsync-3.1.3.tar.gz
 +
tar -xvzf rsync-3.1.3.tar.gz
 +
cd rsync-3.1.3
 +
./configure
 +
Möglicherweise kommt am Ende von <tt>./configure</tt> die Aufforderung, gewisse Module zu deaktivieren. Man muss dann das Programm noch einmal aufrufen mit den entsprechenden Parametern, z.B.:
 +
./configure --disable-xxhash --disable-zstd --disable-lz4
 +
Anschließend wird die Binärdatei erzeugt und installiert
 +
make
 +
make install
 +
 +
Nun kann man überprüfen, ob die Version installiert wurde
 +
rsync --version

Aktuelle Version vom 5. August 2024, 20:25 Uhr

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

Download

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 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 diskLabel stehen.

Wie man einer Festplattenpartition ein Label zuweist, ist hier in diesem 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

Die Option -H bewirkt, dass Hardlinks nicht als Dateien übertragen werden, sondern Hardlinks bleiben.

Beispiel 1

Über SSH das Home-Verzeichnis eines Users wiederherstellen.

rsync  -avzH --dry-run --delete --numeric-ids -e ssh remote_host:/media/disk/<hostname>/backup.0/home/user_1 /home

Beispiel 2

Ganzes System wiederherstellen

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 3

SUSE nach Systemupgrade auf alte Version zurücksetzen.

rsync -avzH --numeric-ids --dry-run \ 
   --exclude={/home,/root,/srv,/media,/usr/local,/var/lib/mysql,/var/spool} \
  -e ssh 10.0.0.111:/media/disk/suseVirtualbox/backup.0 /mnt/tm

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

Verschiedene Versionen

Auf Quell- und Zielrechner sollten die gleichen Versionen von Rsync installiert sein, da es sonst zu Fehlermeldungen kommen kann.

Download und Installation

# Version rsync-3.1.3 
wget https://download.samba.org/pub/rsync/src/rsync-3.1.3.tar.gz
tar -xvzf rsync-3.1.3.tar.gz 
cd rsync-3.1.3
./configure

Möglicherweise kommt am Ende von ./configure die Aufforderung, gewisse Module zu deaktivieren. Man muss dann das Programm noch einmal aufrufen mit den entsprechenden Parametern, z.B.:

./configure --disable-xxhash --disable-zstd --disable-lz4

Anschließend wird die Binärdatei erzeugt und installiert

make
make install

Nun kann man überprüfen, ob die Version installiert wurde

rsync --version