[Bash-Skript] Backup mehrerer Clients

MrDeluxe

Enthusiast
Thread Starter
Mitglied seit
01.04.2006
Beiträge
1.466
Guten Tag,

ich denke hier sind einige gescheite Leute, die sich im Thema Backups sehr gut auskennen. Ich möchte demnächst einen Backup Server auf Linux-Basis (Debian 6.0) aufbauen. Welches Tool würdet ihr zum backuppen empfehlen? Ich würde einfach rsync nehmen wollen. Es handelt sich hierbei, um eine heterogene Umgebung.

Folgendes soll im Skript passieren:
--> Platte /dev/sdx über luksOpen mounten inkl. Passwortabfrage
--> Passwort falsch --> Nachricht --> abbrechen
--> Passwort ok --> prüfe ob Clients verfügbar sind (per ping oder nmap?)
--> Client A nicht verfügbar --> Nachricht ausgeben --> nächster Client
--> Client B verfügbar --> nfs mount von Client --> Daten per rsync+ssh rüberschaufeln
--> diese Überprüfung der Clients und anschließendes rsync soll parallel und nicht nacheinander passieren (würde sonst zu lange dauern sicherlich)
--> Image den ganzen Spaß verpacken per gunzip o.Ä.
--> logging-Einträge verfassen
--> wenn alles erfolgreich nochmal Nachricht ausgeben
--> Backupplatte umounten+luksClose


Ich hoffe ihr habt jetzt einen Überblick, wie ich mir das Backup-Skript vorstelle. Da ich sicherlich nich der einzige bin, der sowas auf die Beine stellen will, frag ich einfach mal ob jemand schon ein fertiges Skript dazu hat. Man muss ja nicht dauernd das Rad neu erfinden :)

Vielen Dank an euch!


Hier mal das wichtigste:

Code:
#!/bin/bash
# Quelle: http://mein.homelinux.com/wiki/backup-skripte
 
# SOURCES and TARGET must end with slash
 
SOURCES="/was/soll/gesichert/werden1?/ /was/soll/gesichert/werden2?/ (...)"
TARGET="/Ziel/der/Backups/(wo_sollen_die_Backups_hin?/"
MOUNTPOINT=""
LOGFILE="/wo_soll_die_Logadatei_hin?"
EXPIREDAYS=0
RSYNC="--delete"
 
#falls via ssh hier Benutzer, Hostname und Port eintragen
#SSHUSER="user"
#SSHHOST="hostname"
#SSHPORT=22
 
### do not edit ###
 
/bin/date > $LOGFILE
MOUNTED=$(/bin/mount | /bin/fgrep "$MOUNTPOINT");
 
if [ -z "$MOUNTPOINT" ] || [ -n "$MOUNTED" ]; then
 
  if [ -e $TARGET ]; then
   LASTBACKUP=$(/bin/ls -d $TARGET[[:digit:]]* 2>> $LOGFILE | /usr/bin/sort -r | /usr/bin/head -1) 
  fi
 
  TODAY=$(/bin/date +%y%m%d)
 
  if [ $EXPIREDAYS -gt 0  ]; then
    EXPIRED=$(/usr/bin/find $TARGET[[:digit:]]* -maxdepth 0 -ctime +$EXPIREDAYS  2>> $LOGFILE)
    for EX in $(/bin/echo $EXPIRED)
    do
      /bin/echo  "rm -rf $EX " >> $LOGFILE
      /bin/rm -rf $EX\\
    done
  fi
 
  for SOURCE in $(/bin/echo $SOURCES)
  do
    if [ "$LASTBACKUP" ]; then
      INC="--link-dest=$LASTBACKUP$SOURCE"
    fi                                                                                                            
    if [ "$SSHUSER" ] && [ "$SSHHOST" ] && [ "$SSHPORT" ]; then
      SSH="ssh -p $SSHPORT -l $SSHUSER";
      SOURCEDIR="$SSHHOST:$SOURCE";
    else
      SOURCEDIR=$SOURCE;
    fi
    /bin/mkdir -p $TARGET$TODAY$SOURCE >> $LOGFILE
    echo "/usr/bin/rsync -e \"$SSH\" -av $SOURCEDIR $RSYNC $INC $TARGET$TODAY$SOURCE "  >> $LOGFILE 2>> $LOGFILE;
    /usr/bin/rsync -e "$SSH" -av $SOURCEDIR $RSYNC $INC $TARGET$TODAY$SOURCE  >> $LOGFILE 2>> $LOGFILE;
  done
else
  /bin/echo "$MOUNTPOINT not mounted" >> $LOGFILE
fi

hier fehlt aber noch einiges... ist eigentlich nur das grobe Backupen von einem Client
 
Zuletzt bearbeitet:
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
bis auf die parallelisierung hab ich da eines. stellt sich die frage ob/warum mans parallelisieren will. wenns ueber die inetleitung rennt isses sinnlos.
ich verwende aber rdiff-backup dafuer.
 
Hallo ulukay,

ich wusste doch, dass du hier einen Beitrag verfassen würdest :)

Warum nutzt du rdiff-backup?

Nein, das ganze passiert nicht über die Inetleitung. Der Server steht bei mir auf dem Dachboden (über Wlan, ob das was wird, wird sich auch noch zeigen)

Was spricht denn dagegen, es parallel durchzuführen? Ich dachte mir, dass der Durchlauf des Skripts, dann schneller vonstatten gehen würde.
 
Zuletzt bearbeitet:
rdiff verwende ich weils von haus aus nur daten uebertraegt die sich wirklich geaendert haben
sprich wenn du eine 1gb thunderbird inbox datei hast und da kommt ein 10kb mail dazu uebertraegt er nur die aenderung. dazu werden die checksummen auf beiden seiten nicht jedesmal neu berechnet. waer ziemlich bloed wenn man 100e gb zu synchen hat.

ich weiss ja ned genau wie die daten dann abgelegt werden wenn du mehrere rsync parallel laufen laesst. angenommen du syncst grad ein verzeichnis mit riesigen files (z.b. ner 5gb .iso) und daneben ein verzeichnis mit vielen kleinen files, fragmentiert der dann die 5gb datei? usw ...
ebenso haettest du viel random io beim checksummen berechnen wenn die jobs parallel laufen.
 
Ok dann lassen wir wohl lieber den Teil der Parallelisierung. Hätte ja sein könn das es ein Vorteil gibt.
Das mit rdiff klingt sehr gut, dachte rsync bietet diese Option auch so an aber ich wurde eines besseren belehrt.

EDIT: Achja wäre sehr erfreut über das Skirpt von dir ;)
 
Zuletzt bearbeitet:
naja das ich hab da eher viele scripte und alles hardcoded :)

z.b. mein neues rdiff backup - ein wrapper script ruft es auf wenn der ssh host erreichbar ist und wertet die logfile aus

mit dem wrapper script starte ichs backup. das trag ich in der crontab ein, gibts keine fehler produzierts keinen output (ergo keine mail)
Code:
#!/bin/bash
line=`nmap -p 22 archfiler | grep -E '^22/tcp open  ssh$' | wc -l`
if [ "$line" -eq 1 ]
then
	/root/bin/backup_to_archfiler.sh 1>/crypted/backup_to_archfiler.log 2>&1
	lines=`cat /crypted/backup_to_archfiler.log | sed -n 's/^Errors\ 0//p'| wc -l`
	if [ $lines -eq 9 ]
	then
		echo "everything ok" 1>/dev/null
	else
		echo "error in backup - please check"
	fi
else
	echo "archfiler not reachable"
fi

so sieht dann z.b. das eigentliche backupscript aus
(insgesamt sinds 9 rdiffs, deshalb ueberpruefe ich im wrapper script das logfile auf genau 9 "Error 0" zeilen ;) )
Code:
#!/bin/bash
echo "rdiff mp3 backup"
rdiff-backup --print-statistics /daten/mp3/ backupuser@archfiler::/backup/mp3/
echo "#####"
echo ""
echo "rdiff username .thunderbird"
rdiff-backup --print-statistics /crypted/home/username/.thunderbird backupuser@archfiler::/backup/other/username/.thunderbird
echo "#####"
echo ""
echo "rdiff username .mozilla"
rdiff-backup --print-statistics /crypted/home/username/.mozilla backupuser@archfiler::/backup/other/username/.mozilla
echo "#####"

damit das ganze auch inkrementell wird benutz ich snapshots von btrfs am backupserver

1x taeglich im crontab (das ganze natuerlich dann auch noch fuer weekly und monthly snapshots)
Code:
#!/bin/bash
echo "starting daily snapshots"
date +%Y-%m-%d_%H:%M:%S
btrfs subvolume delete /backup/.mp3_7days
mv /backup/.mp3_6days /backup/.mp3_7days
mv /backup/.mp3_5days /backup/.mp3_6days
mv /backup/.mp3_4days /backup/.mp3_5days
mv /backup/.mp3_3days /backup/.mp3_4days
mv /backup/.mp3_2days /backup/.mp3_3days
mv /backup/.mp3_yesterday /backup/.mp3_2days
btrfs subvolume snapshot /backup/mp3 /backup/.mp3_yesterday
touch /backup/.mp3_yesterday

btrfs subvolume delete /backup/.other_7days
mv /backup/.other_6days /backup/.other_7days
mv /backup/.other_5days /backup/.other_6days
mv /backup/.other_4days /backup/.other_5days
mv /backup/.other_3days /backup/.other_4days
mv /backup/.other_2days /backup/.other_3days
mv /backup/.other_yesterday /backup/.other_2days
btrfs subvolume snapshot /backup/other /backup/.other_yesterday
touch /backup/.other_yesterday
touch /backup/mp3
touch /backup/other

aus nem anderen codeschnipsel - wie ich ueberpruefe ob etwas richtig gemountet wurde
ich erstell einfach eine datei (touch mounted)
und jedesmal wenn ich mounte ueberpruefe ich ob ich auf /mnt/blah/mounted zugreifen kann. damit faengt man auch zugriffsprobleme ab. (-w waer writeable)

Code:
if [ -r /nfs/share/mounted ]
then
        echo "mounted"
else
        echo "not mounted"
        exit 1
fi

was mir noch eingefallen ist, was fuers backup von kleinen verzeichnissen vielleicht ganz intressant ist. ist ein tar durch ssh gepiped :)
Code:
tar -cf - /etc | ssh backupuser@backupsrv 'gzip >/backups/etc.tar.gz'
 
Zuletzt bearbeitet:
Erstmal großen Dank, das du diese Skripts zur Verfügung stellst. Jedoch funktioniert das ganze nur in einer Homogenen Umgebung wenn ich das so richtig sehe.

Wenn ich jetzt von einem Windows-System ein Backup eines Ordners machen möchte, müsste ich ja CIFS nutzen aber dafür müsste der Ordner freigegeben werden richtig?
 
ja
oder du installierst cygwin drauf (mit nem sshd server)
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh