Wichtige Themen bei der Datenhaltung sind Datensicherheit und Datensicherung.

Eine Datensicherung sollte man je nach Datenaufkommen täglich oder wöchentlich machen. Im Privatbereich kommen neue Daten in Form von Texten, Bildern, Videos, Listen etc nicht so häufig vor. Deshalb sollte hier eine wöchentliche Sicherung genügen.

Zu diesem Zweck habe ich mir ein Skript geschrieben, das darin gelistete Ordner (Verzeichnisse, Freigaben, auch entfernte Rechner) auf eine angeschlossene USB-Platte speichert.

Das Skript nennt sich dobak.sh und macht im Groben folgendes:

  • Festlegung von Konstanten (das kann sich jeder dann noch selbst anpassen) :
    • tosave : Liste der zu sichernenden Verzeichnisse, Platten, Freigaben, ..
    • maxbackupversion : wieviele Generationen angelegt werden, Im Normalfall reichen 3, kommt auch auf die Größe der USB-Platte und der Daten an
    • Optionen für rsync : ich benutze hier rsync weil es wesentlich schneller als dd oder einfaches Kopieren mit cp ist
    • usb : welches die USB. Dies kann auch von außen als Parameter dem Skript beim Aufruf mitgegeben werden.
  • Überprüfung USB-Platte : ob sie angeschlossen und gemounted ist
  • Nummer der neuen Generation bestimmen : dazu wird ein Zähler in der Datei lastbackupversion gehalten. Jede Generation bekommt dann auf der USB-Platte ein eigenes Verzeichnis namens backup+Nummer der Generation.
  • Eigentliche Sicherung :  alle Einträge in der o.g. Liste werden abgearbeitet. Spalte 1 der Liste ist die Quelle zB. /home/user/, die 2. Spalte das Ziel auf der USB-Platte, z.B. /home/mein. Zeilen können durch das Zeichen '#' auskommentiert werden, z.B. wenn ein Sicherungspunkt nur 1x gemacht werden braucht, da sich vielleicht nichts mehr ändert.

Bitte folgenden Hinweis beachten: Die Benutzung des Skriptes geschieht auf eigene Verantwortung und Gefahr. Insbesondere die Variable usb kann bei falscher Einstellung sehr gefährlich sein, im schlimmsten Fall dazu führen, dass man sich sein System zerschießt. Zu diesem Zweck wird noch eine Überprüfung eingebaut, ob 'usb' auch wirklich eine USB-Platte ist.

Und hier das komplette Skript:

#!/bin/bash
 
# -----------------------------------------------------
# Definition der Konstanten und Belegung der Variablen
# -----------------------------------------------------
 
# definiere, was wohin zu sichern ist, Quelle und Ziel mit tab getrennt
# hier nur als Beispiel folgende Einträge; durch das zeichen '#' können Zeilen auskommentiert werden
tosave="
/home/$USER/                        /home/mein/
/media/$USER/data/Bilder/       /data/Bilder/
/media/$USER/data/e-books/    /data/e-books/
/media/fritz.nas/                    /fritz.nas/
"
 
# Anzahl der Generationen der Sicherungen
maxbackupversion=3
# hier 3, d.h. es gibt dann die Verzeichnisse backup1..backup3
 
# Optionen für rsync
options='-r -t -v -h --progress --delete --modify-window=1'
 
# Bestimmung der Backup-Platte, meist eine USB-Disk
usb=/dev/sdc1
# oder auch :
# usb=6B51-2151    = UUID der Platte
# usb=TOSHIBA_EXT
 
# kann auch als Parameter an das Skript übergeben werden
if [ $# -gt 0 ] ; then
    usb=$1
fi

# Test, ob die Platte auch USB ist
drive=`echo $usb | cut -d'/' -f3`
isusb=`ls /dev/disk/by-path/ -l | grep $drive | grep usb`
if [ "$isusb" == "" ] ; then
    echo "Device $usb ist keine USB-Platte"
    exit
fi

# übersetzen in den Mountpunkt
mnt=`mount | grep $usb | cut -d' ' -f3`/
echo "eingehängte Backup-Platte ist $mnt"
 
# Test, ob die USB-Platte angeschlossen ist
if [ "$mnt" == "" -o ! -x $mnt/. ] ; then
    echo "Es ist keine USB-Platte angeschlossen !"
    exit 1
fi
 
cd $mnt
 
#nächste Version=Generation ermitteln
if [ ! -e lastbackupversion ] ; then
    version=0
else
    version=`cat lastbackupversion`
fi
version=`expr $version + 1`
if [ $version -gt $maxbackupversion ] ; then
    version=1
fi
   
echo $version>lastbackupversion
 
backupdir="backup"$version/
echo "Sicherungsverzeichnis ist "$backupdir
 
# Sicherungsverzeichnis evtl anlegen
if [ ! -d $backupdir ] ; then
    mkdir $backupdir
fi
 
# und hier beginnt die Sicherung
echo "$tosave" | while read line ; do
    # leere Zeile am Anfang und Ende ignorieren
    if [ ! "$line" == "" ] ; then
    # Zeile mit Hash am Anfang = Kommentar ignorieren
    if [[ ! $line == \#* ]] ; then
        echo "*********************************************"
        # Quelle bestimmen
        source=`echo "$line" | cut -f 1`
        # Ziel bestimmen auf USB-Platte
        d=""
        p=2
        # wegen Formatierung der Liste : mehrere tabs vor Zielverz. ignorieren
        while [ "$d" == "" ] ; do
            d=`echo "$line" | cut -f $p`
            p=`expr $p + 1`
        done
        # Schräger entfernen falls vorhanden
        if [[ $d == /* ]] ; then
            d=`echo "$d" | tail -c +2`
        fi
        # vollständiger Verzeichnisnamen auf USB-Platte
        dest=$mnt$backupdir$d
        echo "sichere $source"
        echo "nach $dest"
        # Verzeichnis anlegen falls es nicht existiert
        if [ ! -d $dest ] ; then
            mkdir $dest
        fi
        rsync $options $source $dest
        echo "*********************************************"
    fi fi
done
 
echo "fertsch"

Download des Skriptes

 

   
© by HM-Soft