Rotierende Backup Jobs

Status
Für weitere Antworten geschlossen.

Peak

Benutzer
Mitglied seit
25. Feb 2010
Beiträge
13
Punkte für Reaktionen
0
Punkte
0
Hallo Zusammen

Ich möchte folgendes Backupszenario mit einer DS209+II umsetzten und möchte nun von euch gerne Wissen, ob das so irgend wie möglich ist.

Eine DS 209+II
2 USB Platten auf die gesichert wird.

Nun soll es einen Job geben, der jede Woche einmal ausgeführt wird. Das ist so weit noch kein Problem und ganz einfach zu realisieren.
Woche 1 auf USB-Platte 1
Woche 2 auf USB-Platte 2
Woche 3 wieder auf USB Platte 1 usw.

Das Problem dabei ist, dass so Maximal auf einen Datenstand von zwei Wochen zugegriffen werden kann.

Was mir aufgefallen ist, dass der Backupjob einen neuen Ordner auf dem usbshare macht, wo dann das Backup drin abgespeichert wird.
Ideal wäre nun, wenn ich dem Job mitteilen könnte, dass er 5 mal einen neuen Ordner macht. Dann würde das Backup dann so aussehen.
Woche 1 auf USB-Platte 1 in Ordner 1
Woche 2 auf USB-Platte 2 in Ordner 2
Woche 3 auf USB-Platte 1 in Ordner 3
Woche 4 auf USB-Platte 2 in Ordner 4
Woche 5 auf USB-Platte 1 in Ordner 5
Woche 6 auf USB-Platte 2 in Ordner 1
Woche 7 auf USB-Platte 1 in Ordner 2
Woche 8 auf USB-Platte 2 in Ordner 3
Woche 9 auf USB-Platte 1 in Ordner 4
Woche 10 auf USB-Platte 2 in Ordner 5

Somit hätte man nun die Möglichkeit, auf einen Datenstamm von 10 Wochen zurück zu greiffen.

Jetzt hoffe ich, dass ich mich verständlich ausdrücken konnte und es eine Möglichkeit gibt, dies so umsetzen zu können.

Vielen Dank
Peak
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Leider geht das mit dem DS-Manager (GUI) nicht. Es gibt allerdings die Möglichkeit, das per rsync auf der Kommandozeile einzurichten und als cronjobs abzuwickeln.

Als ersten Schritt in diese Richtung (noch nicht mit cronjobs), kann man auch die rsync-Backup-Funktion in meinem AdminTool ansehen.

Als etwas komplexere, aber fertige Lösung kann man auch rsnapshot verwenden. Hierzu gibt es einen Wiki-Beitrag: http://www.synology-wiki.de/index.php/Rsnapshot

Itari
 

Peak

Benutzer
Mitglied seit
25. Feb 2010
Beiträge
13
Punkte für Reaktionen
0
Punkte
0
Hallo itari

Vielen Dank für die Hinweise. Welches AdminSkript meinst du? Das 3rd Party Package auf deiner Homepage mit dem Titel "System Administration"? Leider habe ich da bezüglich rsync nichts gefunden.

Ich werde mir aber sicherlich noch Rsnapshot anschauen.

Gruss,
Peak
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0

Peak

Benutzer
Mitglied seit
25. Feb 2010
Beiträge
13
Punkte für Reaktionen
0
Punkte
0
Vielen Dank itari

Das Tool ist supper. Ein kleines Problem habe ich noch.
Ich habe rsnapshot konfiguriert. Das ganze funktioniert auch, solange ich den Befehl über putty direkt auf der DS starte. Wenn ich aber nun einen cronjob mache, dann wird der snapshot leider nicht gemacht.

Kannst du mir da ein bischen weiter helfen?
hier der job
*/5 * * * * root /opt/bin/rsnapshot hourly

und hier noch das log von cron
USER root pid 18213 cmd /opt/bin/rsnapshot hourly
USER root pid 18234 cmd /opt/bin/rsnapshot hourly
USER root pid 18251 cmd /opt/bin/rsnapshot hourly
USER root pid 18268 cmd /opt/bin/rsnapshot hourly
USER root pid 18285 cmd /opt/bin/rsnapshot hourly

vielen dank,
peak
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0

Peak

Benutzer
Mitglied seit
25. Feb 2010
Beiträge
13
Punkte für Reaktionen
0
Punkte
0
Kein Problem

Nach dem ich jetzt alles noch einmal durchkonfiguriert habe, läuft es. wahrscheinlich war einfach irgend wo ein kleiner fehler drin.

Danke für deine Hilfe
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Kein Problem

Nach dem ich jetzt alles noch einmal durchkonfiguriert habe, läuft es. wahrscheinlich war einfach irgend wo ein kleiner fehler drin.

Danke für deine Hilfe
Du kannst mit rsnapshot verschiedene Tests machen
z.B. kannst du mit
Code:
rsnapshot configtest
die Konfig auf Schreibfehler prüfen
Dann kannst du mit
Code:
rsnapshot -t hourly
einen Problelauf machen, wo rsnapshot angibt was es tun würde.
Wie sieht denn dein cronjob aus?
 

Peak

Benutzer
Mitglied seit
25. Feb 2010
Beiträge
13
Punkte für Reaktionen
0
Punkte
0
OK

Grundsätlich funktioniert das ganze gut. und wenn man noch no_create_root 1 setzt, dann wird auch wirklich nur dann ein backup gemacht, wenn das usbdevice auch eingesteckt ist.
so weit so gut.

was jetzt noch ganz toll wäre, wenn man die files auch gleich in ein tar.gz packen könnte. aber das wäre ja auch nicht der sinn von rsnapshot. also müsste man das wahrscheinlich mit einem eigenen skript machen. richtig?
 

Beach

Benutzer
Mitglied seit
07. Sep 2009
Beiträge
57
Punkte für Reaktionen
1
Punkte
14
was jetzt noch ganz toll wäre, wenn man die files auch gleich in ein tar.gz packen könnte.

Moin Moin,

das wird wohl nicht gehen, da die Files über Harte Links verknüpft werden, das macht die Sache aber von sich schon sehr platzsparend.

Gruß Kay
 

Peak

Benutzer
Mitglied seit
25. Feb 2010
Beiträge
13
Punkte für Reaktionen
0
Punkte
0
Hallo zusammen

Das Problem besteht noch immer. In Zwischenzeit bin ich auch an einer Lösung dran. Danke Itari für dein Admin Tool. Damit lassen sich wunderbar Cron Jobs auslösen.

Im Anhang habe ich ein kleines Skript angehängt. Es ist noch nicht alles drin was drin sein muss. Aber das wird noch kommen. Mein grösstes Problem ist folgendes.

Rich (BBCode):
BACKUPDIR='backup'
BACKUPSOURCES='/volume1/test /volume1/test2'
TAROPTIONS='-cf'
COMPRESSBACKUP=1
FILENAME='test'

ROTATEFILES=1

runBackup(){
	echo "INFO: Starting backup"

	if [ $ROTATEFILES = 1 ] ; then
		tar $TAROPTIONS $MOUNTPATH$BACKUPDIR/$FILENAME-$CURRENTDATE.0.tar $BACKUPSOURCES
		if [ $COMPRESSBACKUP = 1 ] ; then
			echo "INFO: compressing backup file."
			gzip $MOUNTPATH$BACKUPDIR/$FILENAME-$CURRENTDATE.0.tar
		fi
	else
		tar $TAROPTIONS $MOUNTPATH$BACKUPDIR/$FILENAME-$CURRENTDATE.tar $BACKUPSOURCES
		if [ $COMPRESSBACKUP = 1 ] ; then
			echo "INFO: compressing backup file."
			gzip $MOUNTPATH$BACKUPDIR/$FILENAME-$CURRENTDATE.tar
		fi
	fi
}
Dies ist nur ein Aussschnitt aus dem ganzen Script.

Wenn BACKUPROTATE=0 ist, dann funktioniert das Skript einwandfrei. Sobald BACKUPROTATE=1 gesetzt ist, dann wird das Skript beim ersten Ausführen fehlerfrei abgearbeitet.
Beim zweiten aufruf kommt dann eine Fehlermeldung: tar cannot stat no such file or directory

Geändert wird aber nichts. Da hänge ich nun, und frage mich, wo der verdammte Fehler liegt.

Ich wäre euch sehr dankbar, wenn jemand das ganze Skript mal anschauen könnte und mir helfen könnte.

Ach ja. Wenn ich anstelle von
Rich (BBCode):
tar $TAROPTIONS $MOUNTPATH$BACKUPDIR/$FILENAME-$CURRENTDATE.0.tar $BACKUPSOURCES
das hier verwende,
Rich (BBCode):
tar $TAROPTIONS $MOUNTPATH$BACKUPDIR/$FILENAME-$CURRENTDATE.0.tar /volume1/test /volume1/test2
dann geht es.

Vielen Dank für eure Hilfe.

Gruss,
Peak

Hier das ganze Skript
Rich (BBCode):
#!/bin/sh
# TS-Management GmbH
# kontakt@ts-management.ch
#
# Synology DiskStation Backup Script
#
# TODO:
# -----
# - If rotate backup is enabled, only the first backup will be made
#   The other backups terminate with error "tar cannot stat: no such file or directory"
# - HOLDFILES has to be implemented for rotate backup
# - Write Infos into Synology Backup log file
# - Check if eSATA Backup works


##########
# This program is free software: you can redistribute t and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
# GNU General Public License for more details.
##########

***    ***
* Config *
***    ***
BACKUPDIR='backup'
BACKUPSOURCES='/volume1/test /volume1/test2'
TAROPTIONS='-cf'
COMPRESSBACKUP=1
FILENAME="test"

CHECKDISKSPACE=1
MINFREESPACE=20		# min free space in %

ROTATEFILES=1
HOLDFILES=5		# max 14 files

MOUNTTYPE='none'
BACKUPDIREXIST=0
CURRENTDATE=`date +%y%m%d-%H%M%S`
MAXUSEDSPACE=`expr 100 - $MINFREESPACE`

clear
echo -e "******************************************"
echo -e "*** Synology Diskstation Backup Script ***"
echo -e "***                                    ***"
echo -e "*** Autor:	TS-Management GmbH          ***"
echo -e "***        Stefan E. A. Müller         ***"
echo -e "***        kontakt@ts-management.ch    ***"
echo -e "***                                    ***"
echo -e "*** Version: 0.5                       ***"
echo -e "*** Change:  08.04.2010                ***"
echo -e "******************************************"
sleep 1

chkMounts(){
	# Check if USB is mounted. If not, check eSATA
	cat /proc/mounts | grep /volumeUSB1/usbshare > /dev/null
	if [ $? -eq 0 ] ; then
		echo "INFO: USB Mounted"
		MOUNTTYPE='USB'
	else
		echo "INFO: USB NOT Mounted. Checking now eSATA"
		cat /proc/mounts | grep /volumeSATA1/satashare > /dev/null
		if [ $? -eq 0 ] ; then
			echo "INFO: eSATA Mounted"
			MOUNTTYPE='eSATA'
		fi
	fi
}

chkBackupDir(){
	echo "INFO: Checking backup directory"
	if [ -d $MOUNTPATH$BACKUPDIR ] ; then
		BACKUPDIREXIST=1
	else
		BACKUPDIREXIST=0
		echo "ERROR: Backupdir does not exist!"
		exit
	fi
}

runBackup(){
	echo "INFO: Starting backup"

	if [ $ROTATEFILES = 1 ] ; then
		tar $TAROPTIONS $MOUNTPATH$BACKUPDIR/$FILENAME-$CURRENTDATE.0.tar $BACKUPSOURCES
		if [ $COMPRESSBACKUP = 1 ] ; then
			echo "INFO: compressing backup file."
			gzip $MOUNTPATH$BACKUPDIR/$FILENAME-$CURRENTDATE.0.tar
		fi
	else
		tar $TAROPTIONS $MOUNTPATH$BACKUPDIR/$FILENAME-$CURRENTDATE.tar $BACKUPSOURCES
		if [ $COMPRESSBACKUP = 1 ] ; then
			echo "INFO: compressing backup file."
			gzip $MOUNTPATH$BACKUPDIR/$FILENAME-$CURRENTDATE.tar
		fi
	fi
}

chkDiskSpace(){
	echo "INFO: Checking free disk space"
	if [ $MOUNTTYPE = 'USB' ] ; then
		USEDSPACE=`df -h | grep /volumeUSB1/usbshare | cut -c 41-42`
	elif [ $MOUNTTYPE = 'eSATA' ] ; then
		USEDSPACE=`df -h | grep /volumeSATA1/satashare | cut -c 41-42`
	fi
	
	if [ $USEDSPACE -ge $MAXUSEDSPACE ] ; then
		echo "ERROR: Not enough space"
		exit
	fi
}

rotateFiles(){

	echo "INFO: ROTATING FILES"
	cd $MOUNTPATH$BACKUPDIR	
	for OLD in 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ; do
		if [ -e $FILENAME-*.$OLD.tar.gz ] ; then
			echo "File exisitert $OLD"
			NEW=`expr $OLD + 1`
			if [ $COMPRESSBACKUP = 1 ] ; then
				touch .timestamp -r $FILENAME-*.$OLD.tar.gz
				ORIFILENAME=`ls $FILENAME-*.$OLD.tar.gz`
			else
				touch .timestamp -r $FILENAME-*.$OLD.tar
				ORIFILENAME=`ls $FILENAME-*.$OLD.tar`
			fi
			
			IFS="."
			set -- $ORIFILENAME
			
			if [ $COMPRESSBACKUP = 1 ] ; then
				NEWFILENAME=$1.$NEW.$3.$4
			else
				NEWFILENAME=$1.$NEW.$3
			fi
			
			IFS=""
			mv $ORIFILENAME $NEWFILENAME
			
			if [ $COMPRESSBACKUP = 1 ] ; then
				touch $FILENAME-*.$NEW.tar.gz -r .timestamp
			else
				touch $FILENAME-*.$NEW.tar -r .timestamp
			fi
		fi
		
		echo "-----"
		echo " "
	done
	sleep 5
}

chkMounts

if [ $MOUNTTYPE = 'USB' ] ; then
	#echo "*** USB MOUNTED!!! ***"
	MOUNTPATH='/volumeUSB1/usbshare/'
	
	if [ $ROTATEFILES = 1 ] ; then
		rotateFiles
	fi
	
	if [ $CHECKDISKSPACE = 1 ] ; then
		chkDiskSpace
		chkBackupDir
		runBackup
	else
		chkBackupDir
		runBackup
	fi
elif [ $MOUNTTYPE = 'eSATA' ] ; then
	#echo "*** eSATA MOUNTED!!! ***"
	MOUNTPATH='/volumeSATA1/satashare'
	
	if [ $ROTATEFILES = 1 ] ; then
		rotateFiles
	fi
	
	if [ $CHECKDISKSPACE = 1 ] ; then
		chkDiskSpace
		chkBackupDir
		runBackup
	else
		chkBackupDir
		runBackup
	fi
else
	echo "ERROR: No backup drives found!!!"
fi
 

Peak

Benutzer
Mitglied seit
25. Feb 2010
Beiträge
13
Punkte für Reaktionen
0
Punkte
0
Hallo zusammen

Nachdem das Skript nun einen knappen Monat im Einsatz war, haben sich ein paar Probleme mit dem tar und tar.gz gezeigt.

Daher werde ich das Skript so umbauen, dass keine Archive mehr gemacht werden, sondern Ordner gemacht weden wo die zu sichernden Ordner anschliessend hinkopiert werden.

Nun habe ich aber ein kleines Problem mit dem cp Befehl. In einem "grossen" Linkux kann dem cp Befehl --parents mitgegeben werden. Somit wird der gesamte Pfad im Backupverzeichnis nachgebaut.
Wenn also /volume1/test auf eine sata Platte gesichert werden soll, dann heisst der Pfad zur Datei dann so: /volumeSATA/satashare/backup/volume1/test
--parents gibt es in der BusyBox leider nicht. Wie kann ich das trotz dem so umsetzten, dass der gesamte Pfad im Backupordner nachgebaut wird?

Vielen dank für eure Hilfe

Gruss
Peak

PS: Selbst verständlich werde ich das fertige Skript dann hier wieder posten
 

goetz

Super-Moderator
Teammitglied
Sehr erfahren
Mitglied seit
18. Mrz 2009
Beiträge
14.024
Punkte für Reaktionen
275
Punkte
393
Hallo,
wenn Du per ipkg die coreutils installierts hast Du auch ein vollwertiges cp.

Gruß Götz
 

Peak

Benutzer
Mitglied seit
25. Feb 2010
Beiträge
13
Punkte für Reaktionen
0
Punkte
0
Hallo Götz

Vielen Dank für den Hinweis. Dem werde ich sicherlich nachgehen.

Gruss,
Peak
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat