Automatisches Backup (RSYNC) mit Hot Plug SATA bzw USB Festplatten als Sicherungsmedium

in #linux6 years ago (edited)

Automatisches Backup (RSYNC) mit Hot Plug SATA bzw USB Festplatten als Sicherungsmedium

Festplatten und sonstige Speicher werden schnell immer größer und damit wird es auch immer schwieriger regelmässig eine gute , schnelle und vollsständige Datensicherung aller wichtigen Daten anzufertigen. Magnetband, CD und DVDs sind inzw. oft schon wie zu klein, zu teuer und zu unpraktisch um damit die heutigen gigantischen Datenmengen zu sichern. Da hilft oft nur noch eine Backup-to-Disk Datensicherung.

Da ich bislang auf Linux noch keine fertige, kostenlose open source Sicherungslösung für "Backup-2-Disk" Sicherungen kenne und ich es mir für meine Situation sehr bequem machen wollte und es mir wichtig ist, das meine Datensicherung einfach nur eine 1:1 Kopie meiner wichtigsten Platte bzw Verzeichnis ist, habe ich mir einfach eine einfache und sehr bequeme Sicherungslösung selbst geschrieben.

Folgende Features waren mir dabei wichtig:

  • Meine wichtigstem Daten sollten unkomprimiert 1:1 auf ein Sicherungsmedium kopiert werden (vollsicherung)
  • Bei der Wiederholung bzw dem Update einer Sicherung sollen nur noch die Änderungen und nicht mehr alles übertragen werden (rsync mit löschfunktion)
  • Hot-Plug bzw USB Festplatten sollen nach dem einstecken/anhängen als Sicherungsdatenträger automatisch erkannt werden und die Sicherung soll umgehend automatisch starten (binnen weniger Minuten)
  • Sicherungsdatenträger sollen stets "offline" sein, wenn keine Sicherung läuft (unmounted).
  • Sicherung darf nur bei bestimmten eingesteckten/angesteckten Sicherungsdatenträgern anspringen (Filesystem Label BACKUP1 und BACKUP2. d.h. Sicherungsdatenträger müssen vorab entsprechend präpariert werden.)
  • Die Sicherung darf von alleine nur max 1 mal binnen 24h starten.
  • Die Installation der Sicherungslösung muss super schnell und einfach sein und auf allen Linux Versionen laufen.
  • Bei einer Störung bzw einem Fehler soll mir (root) automatisch eine EMail geschickt werden.

Installation

  1. Automatischer Scriptaufruf alle 5 Minuten einrichten ( /etc/crontab ):
    .
    .
    .
    
    */5 * * * * root /usr/local/sbin/autoBackupToUSB.sh > /tmp/autoBackupToUSB.log 2>&1 || cat /tmp/autoBackupToUSB.log | mail -s "Fehler bei cronjob autoBackupToUSB.sh auf $HOSTNAME" root
    
    
  2. Script File nur für ROOT zugänglich ablegen (/usr/local/sbin/autoBackupToUSB.sh):
    #!/bin/bash
    ########################################################
    # autoBackupToUSB.sh  - Version 1.1 (2018-01-22)
    # by Axel Werner [[email protected]]
    # free to use for personal use. NO COMMERCIAL USE ALLOWED!
    # Patches and Improvements are welcome.
    # 
    # this is a cronjob script for install at /etc/crontab 
    # and to be run as root. Its intension is to autodetect
    # one or more hot plugable backup hard-disks (e.g. USB block devices)
    # with a specific given Filesystem Label. e.g. BACKUP1 or
    # BACKUP2. If a backup drive has been detected the drive
    # will be automatically mounted under /mnt with the
    # name of the Label and a rsync will be started to backup 
    # all Data from $sourceDir to the given backup drive.
    # 
    # WARNING:
    # It is asumed that the backup drives are used as
    # whole and do not contain any other data than just the 
    # data to be backed up. the backup drives are supposed to 
    # act like a 1:1 mirror of the sourceDir. Any additional
    # files on the backup drives WILL BE DELETED when this 
    # script is started. 
    # 
    # Use at your own risk.
    #
    ########################################################
    set -e 
    
    
    validBackupDrives="/dev/disk/by-label/BACKUP2 /dev/disk/by-label/BACKUP1"
    lockFile="/var/run/autoBackupToUSB.sh.lock"
    debug=true
    sourceDir="/mnt/yourImportantDataFiles/"
    scriptName=$(basename $0)
    
    function unmount {
        if umount "$mountPoint" ; then
            echo "unmounting successfull."
            echo "removing mountpoint $mountPoint ..."
            rmdir "$mountPoint"
            echo "removing lock file $lockFile ..."
            rm "$lockFile"   
        else
            echo "ERROR: Failed to unmount '$mountPoint'. Aborting."
            $(mount | grep /mnt)
            echo "ERROR: Leaving lock file behind to prevent another rerun."
            exit 1
        fi
    }
    
    
    echo "Checking if $scriptName is already running..."
    if test -f "$lockFile" ; then 
        echo "Seems $scriptName is already running. Exiting."
        ls -la "$lockFile"
        exit
    else
        echo "creating lockFile '$lockFile' ..."
        echo $$ > "$lockFile"
    fi
    
    echo "Checking if a valid backup drive is connected ..."
    if test -v debug ; then 
        echo "DEBUG: \$validBackupDrives = $validBackupDrives"
    fi
    for drive in $validBackupDrives ; do
        if test -v debug ; then 
            echo "DEBUG: drive to test = $drive"
        fi
        if test -b "$drive" ; then
            echo "Valid Backup Drive \"$(basename $drive)\"found."
            backupDrive="$drive"
        fi
    done
    
    if test -z "$backupDrive" ; then
        echo "NO Backup Drive found. Aborting."
        echo "removing lock file $lockFile ..."
        rm "$lockFile"   
        exit
    fi
    
    mountPoint=/mnt/"$(basename $backupDrive)"
    mkdir -p "$mountPoint"
    
    if ! mount "$backupDrive" "$mountPoint" ; then
        echo "ERROR: mounting the backup drive '$backupDrive' on mountpoint '$mountPoint' failed."
        exit 1
    fi
    
    if test -v debug ; then 
        echo "DEBUG: recent mount table:"
        mount | grep /mnt
    fi
    
    todaysDate=$(date +%F)
    echo "Checking for min. age of backup ..."
    if test -e "$mountPoint/$scriptName-dateOfBackup-$todaysDate" ; then
        echo "Seems the Backup already run today. Aborting until tomorrow."
        if test -v debug ; then 
            echo "DEBUG: ls -la $mountPoint"
            ls -la "$mountPoint"
        fi
        unmount
        exit   
    fi
    
    if test -f "$mountPoint/$scriptName-dateOfBackup-*" ; then
        rm "$mountPoint/$scriptName-dateOfBackup-*"
    fi
    
    echo "rsyncing source to destination..."
    
    rsync_param="-av --delete-before --delete-excluded --exclude='.Trash-1000/'"
    rsync $rsync_param "$sourceDir" "$mountPoint" | \
        pv -lep -s $(rsync $rsync_param -n  \
        "$sourceDir" "$mountPoint" | awk 'NF' | wc -l)
    
    touch "$mountPoint/$scriptName-dateOfBackup-$todaysDate"
    if test -v debug ; then 
        echo "DEBUG: ls -la $mountPoint"
        ls -la "$mountPoint"
    fi
    
    
    unmount
    
    
  3. Script File anpassen!! Schliesslich hat nicht Jeder seine wichtigen Daten immer an der gleichen Stelle liegen.
  4. Sicherungsdatenträger/Sicherungsmedien vorbereiten. Siehe nächster Abschnitt.

Sicherungsdatenträger anlegen

Das Script akzeptiert zur Sicherung nur angehängte Block-Devices welche bereits partitioniert und formatiert wurden und zudem über ein Volume Label "BACKUP1" oder "BACKUP2" verfügen. Um sich einen gültigen Sicherungsdatenträger anzufertigen können Sie wie folgt vorgehen:

  1. Hot Plug / USB Festplatte anhängen
  2. mit ''lsblk'' kontrollieren ob und welche Festplatte im System erkannt wurde
  3. Festplatte mit ''cfdisk /dev/sdx'' oder ''parted /dev/sdx'' partitionieren
  4. Partition mit ''mkfs.ext4 -L BACKUP1 /dev/sdx1'' formatieren (Dateisystem aufbringen)
  5. Der Datenträger ist nun fertig eingerichttet und die erste Sicherung darauf wird binnen der nächsten 5 Minuten automatisch beginnen.

Handhabung

Die Handhabung selbst ist nun denkbar einfach.

  1. Einfach Sicherungsdatenträger am System anhängen bzw einstecken und bis zu 5 Minuten warten.
  2. Das System erkennt die Platte automatisch als Sicherungsdatenträger und beginnt dann sofort mit der Sicherung, sofern die letzte Sicherung (auf diesen Datenträger) mind. 24h zurück liegt.
  3. Nach der erfolgreichen Sicherung wird der Sicherungsdatenträger automatisch unmounted und kann dann durch den Admin wieder entnommen bzw abgezogen werden.
  4. Beim auftreten von Fehlern wird verhindert, das die Sicherung noch ein mal automatisch läuft und eine Email mit dem Log File wird automatisch an den ROOT User geschickt. In diesem Fall muss der Admin eingreifen und das Problem lösen (und das Lockfile löschen).

Falls Ihnen dieser Artikel bzw Lösung gefällt, Sie Anmerkungen, Patches oder Verbesserungsvorschläge haben, hinterlassen Sie mir doch einfach eine Email.

Viele Grüße
Axel Werner