Inhaltsverzeichnis
Aufrufbeispiele
Tagessicherung daily
starten des Hostes neonlight (Option -n <hostname>) auf einem USB Backmedium, das direkt im Dateisystem gemountet ist(Option -o usb).
/usr/local/scripts/run_rsnapshot.sh -o usb -n neonlight -b daily
Tagessicherung daily
starten des Hostes neonlight (Option -n <hostname>) auf ein per NFS angebundenes NAS-System.
/usr/local/scripts/run_rsnapshot.sh -o nfs -n neonlight -b daily
Einträge für die root Crontab
# Dateisicherung via rsnapshot 20 17 1 * * /usr/local/scripts/run_rsnapshot.sh -o usb -n neonlight -b monthly 40 18 * * 7 /usr/local/scripts/run_rsnapshot.sh -o usb -n neonlight -b weekly 30 19 * * * /usr/local/scripts/run_rsnapshot.sh -o usb -n neonlight -b daily
Optionsparameter
Ausgabe der Hilfe (Option -h) für das Shellscript.
root:~# ./run_rsnapshot.sh -h Syntax: ./run_rsnapshot.sh [-h | -o <backup_media> | -n <hostname> | -b <hourly|daily|weekly|monthly>| -f <hourly|daily|weekly|monthly>| -m <empfaenger>] -h diese Hilfeseite anzeigen -o nfs|usb Backmedium NFS (NAS) oder USB (externe Disk) -n name Hostname des zu sichernden Systems -b intervall Backup durchfuehren mit Laufcheck (Standard) -f intervall Backup zwingend durchfuehren (forced) -m user Mailempfaenger (durch Kommatas getrennt) Die zu sichernden Hosts muessen in der Konfigurationsdatei /etc/backup_hosts.conf eingetragen sein (pro Zeile ein Hostname)
Codelisting
In diese Konfigurationsdatei werden alle Hostnamen eingetragen, die vom aktuellen System erreichbar sind und gesichert werden sollen, Es wird über einen Remotezugriff vom Host, der das Script run_rsnashot.sh ausführt, die Sicherung per rsnashot angestoßen und auf ein lokales Backupmedium (hier eine externe USB-Disk) gesichert.
- /etc/backup_hosts.conf
dagobert micky tick trick track
- run_rsnapshot.sh
########## Variablendefinition ########## # Standardbelegung der Variablen BACKUP_HOSTS="/etc/backup_hosts.conf" MISSINGPROGRAM="$0: Programoption -b oder -f muss angegeben werden" ERRORMESSAGE="$0: -$OPTION ist nicht erlaubt und wird ignoriert" PROGRAM="/usr/bin/rsnapshot" TIMESTAMP3=`date '+%Y-%m-%d'` MAILRECIPIENT="michael@localhost" SSH_CONFIG_FILE_RS="/root/.ssh/config.rsnapshot" SSH_CONFIG_FILE="/root/.ssh/config" CALL_PARAM=`echo $0 $*` SMTPCONF="/usr/local/scripts/smtpmail.conf" SMTPMAILER=`which sendemail` ########## Funktionen ########## usage() { echo "Syntax: $0 [-h | -o <backup_media> | -n <hostname> | -b <hourly|daily|weekly|monthly>| -f <hourly|daily|weekly|monthly>| -m <empfaenger>]" echo "" echo " -h diese Hilfeseite anzeigen" echo " -o nfs|usb Backmedium NFS (NAS) oder USB (externe Disk)" echo " -n name Hostname des zu sichernden Systems" echo " -b intervall Backup durchfuehren mit Laufcheck (Standard)" echo " -f intervall Backup zwingend durchfuehren (forced)" echo " -m user Mailempfaenger (durch Kommatas getrennt)" echo "" echo " Die zu sichernden Hosts muessen in der Konfigurationsdatei $BACKUP_HOSTS eingetragen sein (pro Zeile ein Hostname)" echo "" exit 1 } # Umsetzung der Monatsnamen von englisch in deutsch change_month() { MONTH=`date '+%m'` case $MONTH in 01|02|03|04|05|06|07|08|09|10|11|12) # Alter Timestamp: [03/Feb/2016:19:42:04] # Neuer Timestamp: [2016-03-02T11:26:56] TIMESTAMP1="`date '+\[%Y-'$MONTH'-%dT'`" ;; *) TIMESTAMP1=`date '+\[%d/%b/%Y'` ;; esac } availability_backupmedia() { wakeup_nas BACKUP_MOUNTDIR_CHECK=`mount | egrep -w "$BACKUP_MOUNTDIR type nfs" | cut -d" " -f3 | head -1` if [ "$BACKUP_MOUNTDIR_CHECK" = "$BACKUP_MOUNTDIR" ] then RC=0 else wakeup_nas mount $BACKUP_MOUNTDIR if [ $? = "0" ] then RC=0 else RC=1 fi fi } do_availability_usbstation() { RC="" BACKUP_MOUNTDIR_CHECK=`mount | grep -o "$BACKUP_MOUNTDIR type ext4 " | cut -d" " -f1` if [ "$BACKUP_MOUNTDIR_CHECK" = "$BACKUP_MOUNTDIR" ] then RC=0 else mount $BACKUP_MOUNTDIR if [ $? = "0" ] then RC=0 else RC=1 echo " --> No backup media (USB-Station) available" fi fi } do_set_enviroment() { if [ "$BACKUP_MEDIA_TYPE" = "nfs" ] then CONFIGFILE="/etc/rsnapshot_"$MASCHINENAME".conf" BACKUP_MOUNTDIR="/mnt/import/rsnapshot" BACKUP_ROOTDIR="/mnt/import/rsnapshot/$MASCHINENAME" elif [ "$BACKUP_MEDIA_TYPE" = "usb" ] then CONFIGFILE="/etc/rsnapshot_"$MASCHINENAME"_usb.conf" BACKUP_MOUNTDIR="/mnt/share/usbstation" BACKUP_ROOTDIR="/mnt/share/usbstation/rsnapshot/$MASCHINENAME" else echo "Wrong backup media type $BACKUP_MEDIA_TYPE (nfs|usb)" exit 4 fi } wakeup_nas() { ping -c5 -q diskstation > /dev/null 2>&1 mount $BACKUP_MOUNTDIR > /dev/null 2>&1 } # Mailtext aus den Auszuegn der Logdatei erzeugen get_logextract() { OPTION=$1 change_month egrep "(^$TIMESTAMP1.*$OPTION:)" $RS_LOGFILE >> $RS_LOGFILE_EXTRACT } # Versende Statusmail send_mail() { if [ -e $RS_LOGFILE_EXTRACT -a $# -eq 1 ] then SUBJECT=$1 if [ "$SMTPMAILER" ] then . "$SMTPCONF" sendemail -q -f $SMTP_SENDER -t $SMTP_RECIPIENT -u "$SUBJECT" -s $SMTP_SERVER -xu $SMTP_RECIPIENT -xp $SMTP_MAIL_PWD < $RS_LOGFILE_EXTRACT else mailx -s "$SUBJECT" $MAILRECIPIENT < $RS_LOGFILE_EXTRACT fi rm $RS_LOGFILE_EXTRACT elif [ -e $RS_LOGFILE_EXTRACT -a $# -eq 2 ] then SUBJECT=$1 MAILBODY=$2 cat $RS_LOGFILE_EXTRACT > $BODYFILE cat >> $BODYFILE <<EOF $MAILBODY EOF if [ "$SMTPMAILER" ] then . "$SMTPCONF" sendemail -q -f $SMTP_SENDER -t $SMTP_RECIPIENT -u "$SUBJECT" -s $SMTP_SERVER -xu $SMTP_RECIPIENT -xp $SMTP_MAIL_PWD < $BODYFILE else mailx -s "$SUBJECT" $MAILRECIPIENT < $BODYFILE fi rm $BODYFILE fi } # Backuplauf starten run_backup() { INTERVAL=$1 $PROGRAM -c $CONFIGFILE $INTERVAL } # Verfuegbarkeit der Clients feststellen availability_client() { # definierten ssh-Schluesseltyp in Datei SSH_CONFIG_FILE_RS von DSA auf RSA umgestellt, da DSA ab SSH V7 deprecated ist. CONNECT_TRIAL=`ssh -F $SSH_CONFIG_FILE_RS -o ConnectTimeout=5 $MASCHINENAME 1>/dev/null 2>&1 hostname; echo $?` if [ "$CONNECT_TRIAL" != "0" ] then RC=1 elif [ "$CONNECT_TRIAL" = "0" ] then RC=0 fi return $RC } # Ueberpruefung ob bereits eine Sicherung des aktuellen Tages vorhanden ist check_backup() { # 0=ja, Backup vorh. 1=nein, kein Backup vorh. if [ "$OPTARG" = "hourly" ] then CHK="1" else BACKUP_INTERVAL=$OPTARG.0 BACKUP_DATE_CHECK=`test -e $BACKUP_ROOTDIR/$BACKUP_INTERVAL && stat $BACKUP_ROOTDIR/$BACKUP_INTERVAL | grep ^Modifiziert | cut -d" " -f2` BACKUP_LIST=`ls -ld $BACKUP_ROOTDIR/*` if [ "$TIMESTAMP3" = "$BACKUP_DATE_CHECK" ] then CHK="0" else CHK="1" fi fi return $CHK } print_startup_parameter() { echo "Startup Parameters:" > $RS_LOGFILE_EXTRACT echo $CALL_PARAM >> $RS_LOGFILE_EXTRACT echo "" >> $RS_LOGFILE_EXTRACT } # Hilfeseite ausgeben if [ $# -eq 0 ] then usage fi if [ ! -s $BACKUP_HOSTS ] then usage fi ########## Hauptprogramm ########## while getopts ho:n:b:f:m: OPTION; do case $OPTION in h) usage ;; o) BACKUP_MEDIA_TYPE=$OPTARG do_set_enviroment ;; n) MASCHINENAME=$OPTARG do_set_enviroment while read ROW do HOST_TO_BACKUP=`grep -w $MASCHINENAME $BACKUP_HOSTS` if [ "$HOST_TO_BACKUP" ] then RC=0 break else RC=1 fi done < $BACKUP_HOSTS if [ "$RC" = "1" ] then echo "Fehler: >>$MASCHINENAME<< ist ein unbekannter Host, bitte ggf. die Konfiguartionsdatei $BACKUP_HOSTS anpassen" exit 90 fi RS_LOGFILE_EXTRACT="/tmp/extractfile_$MASCHINENAME.txt" BODYFILE="/tmp/bodyfile_$MASCHINENAME.txt" RS_LOGFILE="/var/log/rsnapshot_$MASCHINENAME" print_startup_parameter ;; b) print_startup_parameter if [ "$OPTARG" = "hourly" -o "$OPTARG" = "daily" -o "$OPTARG" = "weekly" -o "$OPTARG" = "monthly" ] then availability_client if [ "$RC" != "0" ] then send_mail "[BATCH: BACKUP FILES] $MASCHINENAME: $OPTARG Dateisicherung nicht durchfuehrbar" "Achtung Host $MASCHINENAME ist nicht erreichbar!" exit 99 fi if [ "$BACKUP_MEDIA_TYPE" = "usb" ] then do_availability_usbstation elif [ "$BACKUP_MEDIA_TYPE" = "nfs" ] then availability_backupmedia fi if [ "$RC" != "0" ] then send_mail "[BATCH: BACKUP FILES] $MASCHINENAME: $OPTARG Dateisicherung nicht durchfuehrbar" "Achtung Diskstation ist fuer Host $MASCHINENAME nicht erreichbar!" exit 98 fi check_backup if [ "$CHK" = "0" ] then send_mail "[BATCH: BACKUP FILES] $MASCHINENAME: $OPTARG Dateisicherung bereits vorhanden" "$BACKUP_LIST" elif [ "$CHK" = "1" ] then run_backup $OPTARG get_logextract $OPTARG send_mail "[BATCH: BACKUP FILES] $MASCHINENAME: $OPTARG Dateisicherung durchgefuehrt" fi else send_mail "[BATCH: BACKUP FILES] $MASCHINENAME: $OPTARG Dateisicherung nicht durchfuehrbar" "Unbekanntes Intervall (Option) angegeben: -$OPTION $OPTARG" exit 97 fi ;; f) print_startup_parameter if [ "$OPTARG" = "hourly" -o "$OPTARG" = "daily" -o "$OPTARG" = "weekly" -o "$OPTARG" = "monthly" ] then availability_client if [ "$RC" != "0" ] then send_mail "[BATCH: BACKUP FILES] $MASCHINENAME: $OPTARG Dateisicherung nicht durchfuehrbar" "Achtung Host $MASCHINENAME ist nicht erreichbar!" exit 96 fi if [ "$BACKUP_MEDIA_TYPE" = "usb" ] then do_availability_usbstation elif [ "$BACKUP_MEDIA_TYPE" = "nfs" ] then availability_backupmedia fi if [ "$RC" != "0" ] then send_mail "[BATCH: BACKUP FILES] $MASCHINENAME: $OPTARG Dateisicherung nicht durchfuehrbar" "Achtung Diskstation ist fuer Host $MASCHINENAME nicht erreichbar!" exit 95 fi run_backup $OPTARG get_logextract $OPTARG send_mail "[BATCH: BACKUP FILES] $MASCHINENAME: $OPTARG Dateisicherung durchgefuehrt" else send_mail "[BATCH: BACKUP FILES]: $MASCHINENAME: $OPTARG Dateisicherung nicht durchfuehrbar" "Unbekanntes Intervall (Option) angegeben: -$OPTION $OPTARG" exit 94 fi ;; m) MAILRECIPIENT=$OPTARG echo $MISSINGPROGRAM ;; \?) echo $ERRORMESSAGE exit 3 ;; esac done shift `expr $OPTIND - 1` exit 0 #EOF
Konfigurationsdateien
Für den Sicherungshost
Man muss unterscheiden zwischen der Konfigurationsdatei für die Remote zu sichernden Systeme und dem Sicherungshost selbst.
Auf dem Sicherungshost muss rsnapshot mit Hilfe eines passwortlosen SSH-Keys von root sich auf den Clients remote einloggen könnnen. Dies bewerkstelligt man mit einem eigenen SSH-Key (Private- und Public-Key) und einer SSH-Configdatei speziell für den root User für das Tool rsnapshot.
- /root/.ssh/config.rsnapshot
# fuer Backup mit rsnapshot IdentityFile /root/.ssh/rsnapshot-id_rsa
Den SSH-Key erzeugt man mit dem Befehl ssh-keygen -t rsa -f /root/.ssh/rsnapshot-id_rsa.
# ls -ld rsnapshot-id_rsa -rw------- 1 root root 1675 Mär 6 2016 rsnapshot-id_rsa -rw-r----- 1 root root 394 Mär 6 2016 rsnapshot-id_rsa.pub
Konfiguration (Sicherungshost selbst) für ein Backup auf eine externe USB-Disk
Einziges Unterscheidungsmerkmal der beiden Konfigurationsdateine ist die Zeile mit dem Eintrag snapshot_root
.
- /etc/rsnapshot_neonlight_usb.conf
config_version 1.2 snapshot_root /mnt/share/usbstation/rsnapshot/neonlight/ no_create_root 1 cmd_rsync /usr/bin/rsync cmd_ssh /usr/bin/ssh cmd_logger /usr/bin/logger interval daily 7 interval weekly 4 interval monthly 24 verbose 2 loglevel 3 logfile /var/log/rsnapshot_neonlight lockfile /var/run/rsnapshot_neonlight.pid ssh_args -F/root/.ssh/config.rsnapshot use_lazy_deletes 0 backup /home/ neonlight/ exclude=/home/michael/vm_*/*,exclude=/home/michael/ISOimage/*,exclude=/home/*/.cache/*,exclude=/home/*/.mozilla/firefox/*.default/Cache/*,exclude=/home/*/Dataexchange/*,exclude=/home/*/Misc/*,exclude=/home/*/Music/*,exclude=/home/*/Photo/*,exclude=/home/*/.thumbnails/* backup /boot/ neonlight/ backup /etc/ neonlight/ backup /root/ neonlight/ backup /mnt/vm/normal/ neonlight/ backup /mnt/vm/fast/ neonlight/ exclude=/mnt/vm/fast/unsaved_img/* backup /mnt/share/ neonlight/ exclude=/mnt/share/usbstation/*,exclude=/mnt/share/misc/ISOimage/*,exclude=/mnt/share/music/sembly/Bearbeiten/* backup /opt/ neonlight/ backup /var/log/ neonlight/ backup /var/spool/cron/crontabs/ neonlight/ backup /var/tmp/ neonlight/ exclude=/var/tmp/kdecache-*/* backup /usr/lib/systemd/ neonlight/ backup /usr/local/scripts/ neonlight/ backup /usr/share/kservices5/ServiceMenus/ neonlight/ backup /usr/share/sddm/faces/ neonlight/ backup /usr/share/sddm/themes/ neonlight/
Konfiguration (Sicherungshost selbst) für ein Backup auf ein NAS-System per NFS angebunden
- /etc/rsnapshot_neonlight.conf
config_version 1.2 snapshot_root /mnt/import/rsnapshot/neonlight/ no_create_root 1 cmd_rsync /usr/bin/rsync cmd_ssh /usr/bin/ssh cmd_logger /usr/bin/logger interval daily 7 interval weekly 4 interval monthly 24 verbose 2 loglevel 3 logfile /var/log/rsnapshot_neonlight lockfile /var/run/rsnapshot_neonlight.pid ssh_args -F/root/.ssh/config.rsnapshot use_lazy_deletes 0 backup /home/ neonlight/ exclude=/home/michael/vm_*/*,exclude=/home/michael/ISOimage/*,exclude=/home/*/.cache/*,exclude=/home/*/.mozilla/firefox/*.default/Cache/*,exclude=/home/*/Dataexchange/*,exclude=/home/*/Misc/*,exclude=/home/*/Music/*,exclude=/home/*/Photo/*,exclude=/home/*/.thumbnails/* backup /boot/ neonlight/ backup /etc/ neonlight/ backup /root/ neonlight/ backup /mnt/vm/normal/ neonlight/ backup /mnt/vm/fast/ neonlight/ exclude=/mnt/vm/fast/unsaved_img/* backup /mnt/share/ neonlight/ exclude=/mnt/share/usbstation/*,exclude=/mnt/share/misc/ISOimage/*,exclude=/mnt/share/music/sembly/Bearbeiten/* backup /opt/ neonlight/ backup /var/log/ neonlight/ backup /var/spool/cron/crontabs/ neonlight/ backup /var/tmp/ neonlight/ exclude=/var/tmp/kdecache-*/* backup /usr/lib/systemd/ neonlight/ backup /usr/local/scripts/ neonlight/ backup /usr/share/kservices5/ServiceMenus/ neonlight/ backup /usr/share/sddm/faces/ neonlight/ backup /usr/share/sddm/themes/ neonlight/
Zu sichernde Remote-Systeme
Einziges Unterscheidungsmerkmal der beiden Konfigurationsdateien ist die Zeile mit dem Eintrag des Schlüsselwortes snapshot_root.
Konfiguration (hier ein Laptop) für ein Backup auf eine externe USB-Disk
Die externe USB-Disk ist nicht am Laptop angeschlossen sondern am Desktop-PC (NFS-Server) und wird per NFS-Freigabe im Verzeichnisbaum des Laptops (NFS-Client) eingebunden.
- /etc/rsnapshot_greenline_usb.conf
config_version 1.2 snapshot_root /mnt/share/usbstation/rsnapshot/greenline/ no_create_root 1 cmd_rm /bin/rm cmd_rsync /usr/bin/rsync cmd_ssh /usr/bin/ssh cmd_logger /usr/bin/logger interval daily 7 interval weekly 4 interval monthly 12 verbose 2 loglevel 3 logfile /var/log/rsnapshot_greenline lockfile /var/run/rsnapshot_greenline.pid ssh_args -F/root/.ssh/config.rsnapshot backup root@greenline:/boot/ greenline/ backup root@greenline:/etc/ greenline/ backup root@greenline:/home/ greenline/ exclude=/home/*/.cache/*,exclude=/home/*/.thumbnails/*, exclude=/home/*/ISOimage/*, exclude=/home/*/vm_* backup root@greenline:/opt/ greenline/ backup root@greenline:/root/ greenline/ backup root@greenline:/usr/local/scripts/ greenline/ backup root@greenline:/usr/share/sddm/ greenline/ backup root@greenline:/var/lib/sddm/ greenline/ backup root@greenline:/var/log/ greenline/ backup root@greenline:/var/spool/cron/crontabs/ greenline/ backup root@greenline:/usr/share/kservices5/ServiceMenus/ greenline/
Konfiguration (hier ein Laptop) für ein Backup auf ein NAS-System per NFS angebunden
- /etc/rsnapshot_greenline_usb.conf
config_version 1.2 snapshot_root /mnt/import/rsnapshot/greenline/ no_create_root 1 cmd_rm /bin/rm cmd_rsync /usr/bin/rsync cmd_ssh /usr/bin/ssh cmd_logger /usr/bin/logger interval daily 7 interval weekly 4 interval monthly 12 verbose 2 loglevel 3 logfile /var/log/rsnapshot_greenline lockfile /var/run/rsnapshot_greenline.pid ssh_args -F/root/.ssh/config.rsnapshot backup root@greenline:/boot/ greenline/ backup root@greenline:/etc/ greenline/ backup root@greenline:/home/ greenline/ exclude=/home/*/.cache/*,exclude=/home/*/.thumbnails/*, exclude=/home/*/ISOimage/*, exclude=/home/*/vm_* backup root@greenline:/opt/ greenline/ backup root@greenline:/root/ greenline/ backup root@greenline:/usr/local/scripts/ greenline/ backup root@greenline:/usr/share/sddm/ greenline/ backup root@greenline:/var/lib/sddm/ greenline/ backup root@greenline:/var/log/ greenline/ backup root@greenline:/var/spool/cron/crontabs/ greenline/ backup root@greenline:/usr/share/kservices5/ServiceMenus/ greenline/
NFS Server Config
Am NFS-Server (hier bei mir der Desktop-PC) muss eine Freigabe in der Datei /etc/exports eingetragen werden damit alle Clients im lokalen Netzwerk auf die USB-Disk zugreifen können,
- /etc/exports
/mnt/share/usbstation 192.168.111.0/24(rw,sync,no_root_squash,no_subtree_check)