Backup-Skript

Einleitung

Dieses Skripts erstellt fortlaufende inkrementelle hardlink-basierte Backups wichtiger persönlicher Daten auf einer oder mehreren externen Festplatten.

Neben zu den zu sichernden Daten werden noch folgende Systeminformationen gespeichert, um das Wiederherstellen des Systems zu erleichtern:

  • Modell und Seriennummern aller angeschlossenen Festplatten

  • die Partitionierung und aktuelle SMART-Attribute derselbigen

  • die Liste aller installierten Pakete

Am Ende des Backups zeigt das Skript die Unterschiede zwischen den aktuellen SMART-Attribute und vorherigen Stand, sofern dieser verfügbar ist. Dadurch läßt sich der Ausfall von Backup-Festplatten frühzeitig erkennen.

Durch die Nutzung von Hardlinks entsteht der Eindruck, daß in jeder Sicherung sämtliche Dateien enthalten sind. Dabei wird bei unveränderten Dateien lediglich ein neuer Hardlink auf das bereits existierende Original angelegt und somit werden dafür weder Daten kopiert noch Speicherplatz dedundant belegt.

Das Skript wurde für folgende Randbedingungen geschrieben:

  • es läuft als Nutzer root um das Verzeichnis /etc mit zu sichern

  • es wird nur ein Backup pro Kalendertag unterstützt

  • manuelles Einbinden und Lösen der Backup-Festplatte - die Festplatten sind nur für die Zeit des Backups mit dem Computer verbunden

  • manuelles Löschen alter nicht mehr benötigter Backups

  • manuelle Änderungen von Dateien im Backup betreffen wahrscheinlich mehrere Stände, da gleiche Dateien nur als Hardlinks auf ein Original verweisen

Warum noch ein Skript für Backups mit rsync?

Das Skript in der jetzigen Form entstand nach einem Unfall, bei dem ich den vorderen Bereich meiner Systemplatte überschreiben habe. Meine persönlichen Daten nicht direkt betroffen, denn sie befanden sich auf einer der hinteren Partitionen.

Aber wie war die Festplatte partitioniert und welche Pakete waren nun wirklich installiert?

Dieses Ereignis war der Anlaß das Skript um den jetzigen Funktionsumfang zu erweitern.

Installation

Das Skript benötigt keine Installation. Es empfiehlt sich sowohl Eigentümer und Gruppe auf root zu setzen, wie auch die Rechte restriktiv zu setzen, damit nur der Eigentümer das Skript lesen, ändern und ausführen kann.

Es bietet sich an das Skript entweder unter /root/bin oder unter /usr/local/sbin zu plazieren.

Installation nach /root/bin (sofern vorhanden):

# sudo install -p -m 700 -o root -g root backup.sh /root/bin

bzw. bei der Installation nach /usr/local/sbin:

# sudo install -p -m 700 -o root -g root backup.sh /usr/local/sbin

Konfiguration

Das Backup mit dem Skript backup.sh wird sowohl im Skript, als auch in den bei FILE_INCLUDE_PATTERN und FILE_EXCLUDE_PATTERN spezifizierten Dateien konfiguriert.

Die in den beiden Dateien FILE_INCLUDE_PATTERN und FILE_EXCLUDE_PATTERN verwendeten Filter sind in der Manpage von rsync ausführlich beschrieben.

Beispiel

Dieses Beispiel zeigt die Konfiguration zum Sichern von /etc, /root und /home. Das Backup-Skript beiden Dateien mit den Filtern zum Einbinden bzw. Weglessen von Dateien und Verzeichnissen liegen ebenfalls unter /root/bin.

Konfiguration im Skript:

# cat backup.sh
[...]
# Basisverzeichnis fuer alle Backupverzeichnisse
BASE_DIR="/media/disk"

# Listen mit Dateimustern, die ins Backup sollen oder auch nicht
FILE_EXCLUDE_PATTERN="/root/bin/backup.excl"
FILE_INCLUDE_PATTERN="/root/bin/backup.incl"

# Kommando um die Paketliste zu erzeugen
# für RPM-basierte Systeme: rpm -qa --last
# für ArchLinux:            pacman -Qqen
# für Debin:                dpkg --get-selections
CMD_PKG_LIST="pacman -Qqen"

# Backup-Partition komplett lesend pruefen
# Zum Deaktivieren den Wert einfach auskommentieren
#RUN_DD="ja"

# Zusaetzliche Optionen fuer rsync:
# --checksum - rsync jede Datei bitweise, das ist langsam, aber das Backup
#              ist danach 100% korrekt und lesbar
#RSYNC_OPTS="--checksum"

#
# ==== KEINE AENDERUNGEN UNTERHALT DIESER ZEILE ====
#
[...]

Zu sichernde Dateien und Verzeichnisse (FILE_INCLUDE_PATTERN):

# cat /root/bin/backup.incl
/home
/etc
/root

Nicht zu sichernde Dateien und Verzeichnisse (FILE_EXCLUDE_PATTERN):

# cat /root/bin/backup.excl
/etc/shadow
/home/*/.cache
/home/*/.java
/home/*/.xsession-errors
/home/*/.thumbnails
/home/*/.Trash

Erste Schritte

  1. Skript installieren und konfigurieren

  2. Backup-Festplatte einbinden

    # mount <Backup-Mount>
    
  3. Nur vor die erste Sicherung: ein leeres Verzeichnis anlegen

    # mkdir <Backup-Mount>/19700101
    
  4. Backup starten

    # ./backup.sh
    
    -= backup.sh - Version 1 =-
    (c) 2013-2016 Carsten Grohmann
    
    
    Sichere alle Aenderungen zwischen der letzten Sicherung in
    /media/disk/20160402 und jetzt.
    
    Die neue Sicherung erfolgt nach /media/disk/20160415
    
    Zu sicherende Dateien und Verzeichnisse:       /root/bin/backup.incl
    Nicht zu sicherende Dateien und Verzeichnisse: /root/bin/backup.excl
    
    Druecken Sie Enter zum Fortfahren oder Strg+C zum Abbrechen
    [...]
    
  5. Nur nach der ersten Sicherung: das leere Verzeichnis wieder löschen

    # rmdir <Backup-Mount>/19700101
    
  6. Einbindung der Backup-Festplatte wieder lösen

    # umount <Backup-Mount>
    

Struktur der Sicherung

Den Zeitpunkt des Backups sieht man am Zeitstempel des Backupverzeichnisses.

Sicherungsverzeichnis

# ll /media/disk/
insgesamt 0
drwxr-xr-x 6 root root 48  5. Jul 2010  20100705
drwxr-xr-x 6 root root 48  8. Jul 2010  20100708
drwxr-xr-x 6 root root 48 13. Sep 2010  20100913
[...]
drwxr-xr-x 6 root root 48 17. Jul 2015  20150717
drwxr-xr-x 6 root root 48 15. Dez 18:20 20151215
drwxr-xr-x 7 root root 61  3. Mär 21:23 20160303
drwxr-xr-x 7 root root 61 27. Mär 11:42 20160327
drwxr-xr-x 7 root root 61  2. Apr 19:06 20160402

Verzeichnisinhalt einer Sicherung

Jedes Backup enthält ein Unterverzeichnis status. Dieses enthält die oben erwähnten Systeminformationen.

# ll /media/disk/20160402/
insgesamt 20
drwxr-xr-x 88 root root 8192  2. Apr 17:16 etc
drwxr-xr-x  6 root root   56 23. Nov 2013  home
drwxr-x--- 11 root root 4096  2. Apr 19:01 root
drwxr-xr-x  2 root root 4096  2. Apr 19:06 status

# ll /media/disk/20160402/status/
insgesamt 44
-rw-r--r-- 1 root root 1078  2. Apr 19:06 block_devices
-rw-r--r-- 1 root root 3498  2. Apr 19:06 packages
-rw-r--r-- 1 root root  133  2. Apr 19:06 partition.SAMSUNG_SSD_830__S0VNEA428
-rw-r--r-- 1 root root  241  2. Apr 19:06 partition.ST1000DM003-1CH1_Z1D6X5RG
-rw-r--r-- 1 root root 1656  2. Apr 19:06 smart_attrs.SAMSUNG_SSD_830__S0VNEA428
-rw-r--r-- 1 root root 2622  2. Apr 19:06 smart_attrs.ST1000DM003-1CH1_Z1D6X5RG
-rw-r--r-- 1 root root  235  2. Apr 19:06 smart_error.SAMSUNG_SSD_830__S0VNEA428
-rw-r--r-- 1 root root  235  2. Apr 19:06 smart_error.ST1000DM003-1CH1_Z1D6X5RG

Wiederherstellen

  1. Backup-Festplatte einbinden

  2. Die Verzeichnisstruktur des durchstöbern und die Dateien zurück an den gewünschten Platz kopieren

  3. Einbindung der Backup-Festplatte wieder lösen

Download

Dateiname   backup.sh  [Signatur]
Größe   9 KByte
Version   3
Sprache   Shell (Bash)

Änderungsprotokoll

  • Version 3 - 2024-07-20

    • Hardlinks mit "rsync --link-dest" statt "cp -al" erzeugen

  • Version 2 - 2018-07-05

    • Erkennung umbenannter Dateien durch rsync --fuzzy

  • Version 1 - 2016-04-15

    • erste veröffentliche Version