Backup mit rsync funktioniert nicht

Lazybone

Member
Hallo, ich habe hier einen Server mit 2 HDs

Code:
~# fdisk -l

Disk /dev/sda: 250.1 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders, total 488397168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00094c7b

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048   480278527   240138240   83  Linux
/dev/sda2       480280574   488396799     4058113    5  Extended
/dev/sda5       480280576   488396799     4058112   82  Linux swap / Solaris

Disk /dev/sdb: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders, total 312581808 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1   *          63      257039      128488+  83  Linux
/dev/sdb2          257040     4160834     1951897+  82  Linux swap / Solaris
/dev/sdb3         4160835   312576704   154207935   83  Linux

Auf der sda liegt alles, was im Netz ist. Auf sdb soll per Cron
jede Nacht ein Backup von sda erfolgen. Mit diesem Script

Code:
#!/bin/sh

if [ ! -d /backup/grub ]; then
  mount -t ext3 /dev/sdb1 /backup &> /dev/null
fi

rsync --archive --verbose --delete /boot/ /backup/ 

umount /backup

if [ ! -d /backup/root ]; then
  mount -t ext3 /dev/sdb3 /backup &> /dev/null
fi

rsync --archive --verbose --delete --exclude-from=/root/tools/rsync/.rsync-exclude / /backup/

umount /backup

echo "Backup ok" | mail -s "Rsync Backup" hostmaster@server.de

Das klappt auch leidlich, d.h. alles wird gemountet, rsync läuft durch,
fertig. Aaaber was merkwürdig ist … Die sdb1 und sbd3 werden ausgehängt,
aber auf der sda im Ordner /backup sind alle Dateien des Backups
komplett vorhanden. Jetzt kann ich /backup komplett löschen,
mounte von Hand z.B. die sdb3 … Und da ist das komplette Backup auch.
So, wie es sein soll. Wieso legt das Script eine Kopie aller Daten in
/backup an? Hat dazu jemand ne Erklärung oder gar Lösung?

Der Vollständigkeit halber! Das Alles hat schon VOR dem neu aufsetzen des
Servers jahrelang funktioniert.
 
im Ordner /backup sind alle Dateien des Backups
komplett vorhanden.
Dein Script prüft nicht, ob ein Volume tatsächlich gemountet ist. Überhaupt hat dein Script keinerlei exception handling.
Am wahrscheinlichsten ist, dass der rsync gelaufen ist, ohne dass das entsprechende Volume gemountet war - wie soll ein Backup anders unterhalb des Mountpoints entstehen?
 
okay, mag sein … ;) Bin leider nicht der bash Auskenner :(
Wie würdest du es denn "abfangen", bzw. anstellen?

So evtl?

Code:
if [ ! -d /backup/root ]; then
  mount -t ext3 /dev/sdb3 /backup &> /dev/null
fi
if [ ! -d /backup/root ]; then
  echo "Could not mount Backup device"
  exit 0
fi

rsync --archive --verbose --delete --exclude-from=/root/tools/rsync/.rsync-exclude / /backup/

umount /backup

echo "Backup ok" | mail -s "Rsync Backup" hostmaster@server.de
 
Last edited by a moderator:
Wenn du fauilpelzig bist, dann beendest du mit einem bestimmten Fehlercode.

Beispiele der zu ändernden Zeilen:

mount -t ext3 /dev/sdb3 /backup &> /dev/null || exit 1;

rsync --archive --verbose --delete --exclude-from=/root/tools/rsync/.rsync-exclude / /backup/ || exit 2;

umount /backup || exit 3;


Den Fehlercode kannst du dann im externen Aufruf des Shellprogramms auswerten.
 
aha ;) Wir kommen der Sache näher

+ rsync warning: some files vanished before they could be transferred (code 24) at main.c(1070) [sender=3.0.9]
+ exit 2

Danach wird dann das umount nicht mehr ausgeführt
 
Danach wird dann das umount nicht mehr ausgeführt
Exit beendet die Ausführung des Script. Wenn du aufräumen möchtest, kannst du das z.b. so machen:

Code:
mount /device /mountpoint || exit 1
rsync --options /source / destination 2>&1 || {
  umount /mountpoint
  exit 2
}
 
ich habe jetzt bei der source div. tmp Dateien gelöscht und das Script
noch mal laufen lassen. Keine Fehlermeldung mehr, umount hat
prima funktioniert. Aber …
Der Ordner /backup ist wieder mit der Kopie des Backup gefüllt. :confused:
Wo ist der (Denk) fehler?
 
Es wäre denkbar, dass das Backupscript mal gelaufen war, ohne das die Backupplatte gemountet war. Damit wären die Daten innerhalb der gleichen Platte dupliziert worden. Sagte elias aber schon.
In dem Fall könntest du alles unterhalb von /backup einfach löschen.

Es könnte allerdings ebenso sein, dass es irgendwann mal nicht unmounted wurde und du alles weitere drüber gemountet hast. Für den Fall solltest du dir unbedingt "cat /proc/mounts" anschauen, bevor du irgendwas löschst. :)

Btw, das ist nicht zufällig ein Server bei/von Domainbox? Das Backupscript hab ich schon viel zu oft gesehen. :p
 
Deine Ausgabeumleitung sieht nicht ganz koscher aus. Das & gehört da nicht hin. Das sieht aus, als würde der mount im Hintergrund laufen und der rsync starten, bevor das Volume gemountet ist. Dann sollte sich am Inhalt des Backup-Volumes nichts ändern.
 
Es könnte allerdings ebenso sein, dass es irgendwann mal nicht unmounted wurde und du alles weitere drüber gemountet hast. Für den Fall solltest du dir unbedingt "cat /proc/mounts" anschauen, bevor du irgendwas löschst. :)

nee, da hab ich immer drauf geachtet ;)

Btw, das ist nicht zufällig ein Server bei/von Domainbox? Das Backupscript hab ich schon viel zu oft gesehen. :p

Genau. Und wie gesagt: Vor dem neu aufsetzen lief das auch immer
tadellos. Aber ist mir egal, von wem das Script ist, laufen
muss es
 
Wenn in /backup schon was drin ist und du das Script ausführst, wird er deine Backupplatte gar nicht erst mounten. Und wieder innerhalb des eigenen Dateisystems "syncen".
Denn das Script prüft ja nicht ob gemountet ist, sondern nur ob ein spezifischer Ordner unterhalb des Mountpoints existiert. :)
 
wenn ich die 3 Anweisungen einzeln auf der shell ausführe,
klappt alles prima

EDIT: So gehts jetzt prima

Code:
#!/bin/sh

#set -x

mount -t ext3 /dev/sdb3 /backup || exit 1
sleep 8
rsync --archive --verbose --delete --exclude-from=/root/tools/rsync/.rsync-exclude / /backup/ || exit 2
sleep 8
umount /backup || exit 3
 
Last edited by a moderator:
Back
Top