Benutzer-Werkzeuge

Webseiten-Werkzeuge


run_rsnapshot.sh

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)
run_rsnapshot.sh.txt · Zuletzt geändert: 2020/04/23 14:00 von dwadmin