[FreeBSD] Dump-Skript

marzl

Well-Known Member
ACHTUNG! Für eine aktuellere Version dieses Artikels schaut bitte ins WIKI
http://wiki.bsdforen.de/tiki-index.php?page=Backup



Ich hab eine kleines Skript geschrieben um den Dump-Prozess
(der ja regelmäßig passieren sollte) etwas zu vereinfachen und zu automatisieren. Die Strategie besteht aus 3 Teilen.

Folgendes muss aber vorweg gesagt werden:
Passt das Skript an eure bedürfnisse an! Es ist nich copy'n'dump :D

Das Dump lebt von folgender Reihenfolge
- am 1. eines Monats läuft ein level 0 dump
(Ein komplettes Backup des Systems)
- es folgen darauf bis zum nächsten Samstag jeden Tag Level 2 Dumps
(Diese Level sichert alles was sich seit dem letzten dump geändert hat)
- Am ersten Sonntag folgt dann ein Level 1 Dump
(Dieser dump sichert alles was sich seit letzen Level 0 dump geändert hat)
- Darauf die 6 Tage folgen wieder die täglichen Level 2 dumps
(Die sichern wieder alles was sich seit dem letzen Level 1 dump geändert hat)
- usw.

nochmal in der Monatsübersicht:
0 2 2 2 2 2 2 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1 2 2 2 2 2 2

Damit ist sichergestellt das wenn am vorletzen Tag eines Monats die Platte zerreißt, wir NICHT alle dumps nacheinander einspielen müssen.
Es reicht dann nacheinander zuerst der 0, dann der letzte 1 und dann der letzte 2 vor dem Crash. Kapiert? :)
Das spart zeit und vor allem Plattenplatz

Hier die Skripte

Level 0

Code:
#!/bin/sh
dump=/sbin/dump
chflags=/bin/chflags
dt=`date +%Y%m%d`
destpath=/mnt/raid5-2/backup/file
lvl=0

# /
src1=/dev/ad0s1a
# /var
src2=/dev/ad0s1d
# /usr
src3=/dev/ad0s1f

dest1=$destpath/root_ad0s1a_l0_$dt.gz
dest2=$destpath/var_ad0s1d_l0_$dt.gz
dest3=$destpath/usr_ad0s1f_l0_$dt.gz

# Ausnahmen NO BACKUP
$chflags -R nodump /usr/ports/
$chflags -R nodump /usr/src/
$chflags -R nodump /usr/obj/

# Fullbackup Level 0 Monatlich
$dump -$lvl -h 0 -Lauf - $src1 | gzip -2 | dd of=$dest1
$dump -$lvl -h 0 -Lauf - $src2 | gzip -2 | dd of=$dest2
$dump -$lvl -h 0 -Lauf - $src3 | gzip -2 | dd of=$dest3

Level 1

Code:
#!/bin/sh
dump=/sbin/dump
chflags=/bin/chflags
dt=`date +%Y%m%d`
destpath=/mnt/raid5-2/backup/file
lvl=1

# /
src1=/dev/ad0s1a
# /var
src2=/dev/ad0s1d
# /usr
src3=/dev/ad0s1f

dest1=$destpath/root_ad0s1a_l1_$dt.gz
dest2=$destpath/var_ad0s1d_l1_$dt.gz
dest3=$destpath/usr_ad0s1f_l1_$dt.gz

# Ausnahmen NO BACKUP
$chflags -R nodump /usr/ports/
$chflags -R nodump /usr/src/
$chflags -R nodump /usr/obj/

# Fullbackup Level 0 Monatlich
$dump -$lvl -h 0 -Lauf - $src1 | gzip -2 | dd of=$dest1
$dump -$lvl -h 0 -Lauf - $src2 | gzip -2 | dd of=$dest2
$dump -$lvl -h 0 -Lauf - $src3 | gzip -2 | dd of=$dest3



Level 2

Code:
#!/bin/sh
dump=/sbin/dump
chflags=/bin/chflags
dt=`date +%Y%m%d`
destpath=/mnt/raid5-2/backup/file
lvl=2

# /
src1=/dev/ad0s1a
# /var
src2=/dev/ad0s1d
# /usr
src3=/dev/ad0s1f

dest1=$destpath/root_ad0s1a_l2_$dt.gz
dest2=$destpath/var_ad0s1d_l2_$dt.gz
dest3=$destpath/usr_ad0s1f_l2_$dt.gz

# Ausnahmen NO BACKUP
$chflags -R nodump /usr/ports/
$chflags -R nodump /usr/src/
$chflags -R nodump /usr/obj/

# Fullbackup Level 2 Täglich
$dump -$lvl -h 0 -Lauf - $src1 | gzip -2 | dd of=$dest1
$dump -$lvl -h 0 -Lauf - $src2 | gzip -2 | dd of=$dest2
$dump -$lvl -h 0 -Lauf - $src3 | gzip -2 | dd of=$dest3


So, gestern hatte ich mein letztes Backup und heute raucht mein Mailserver ab :(
ABER: ich hatte ja ein Backup :D

So hab ichs nun gemacht:
  1. Neue Platte in meine Workstation eingebaut.
  2. Per sysinstall partitioniert (fdisk) und exakt wie die alte platte vom mailserver partitioniert (label). Beim mountin darauf achten das die nich mit dem vorhandenen mounts kollidieren. Ich hab die neue Platte einfach in /mnt/ad2/ abgebildet:
    /mnt/ad2/root/
    /mnt/ad2/var/
    /mnt/ad2/tmp/
    /mnt/ad2/usr/
  3. Die benötigten dumps ins eigene home kopieren und per gzip -d entpacken.
    Sieht dann ungefähr so aus:
    Code:
    -rw-r--r--  1 root    staff   54702080 24 Okt 19:34 root_ad0s1a_20041024
    -rw-r--r--  1 root    staff      61440  3 Nov 20:23 root_ad0s1a_l2_20041103
    -rw-r--r--  1 root    staff  563763200 24 Okt 19:46 usr_ad0s1f_20041024
    -rw-r--r--  1 root    staff    4014080  3 Nov 20:24 usr_ad0s1f_l2_20041103
    -rw-r--r--  1 root    staff  566609920 24 Okt 19:40 var_ad0s1d_20041024
    -rw-r--r--  1 root    staff   31631360  3 Nov 20:23 var_ad0s1d_l2_20041103
  4. Nun in z.B. /mnt/ad2/root wechseln und mit
    Code:
    restore -rf /home/marcel/root_ad0s1a_20041024
    das dump rurückspielen.
  5. Da das so einfach war schieb ich noch mein letzes Level 2 dump hinterher
    Code:
    restore -rf /home/marcel/root_ad0s1a_l2_20041103
  6. Dies mit allen anderen in usr und var wiederholen.
  7. Wenn fertig, löscht die Datei "restoresymtable" je aus den Verzeichnissen raus.
    Die werden nun nicht mehr benötigt und belegen einfach nur Platz.
  8. Jetzt Festplatte ausbauen und in den alten Rechner einbauen, booten, fertig
 
Zuletzt bearbeitet:
Danke danke, schaut gut aus :)

Es reicht dann nacheinander zuerst der 0, dann der letzte 1 und dann der letzte 2 vor dem Crash.
müssen nicht alle level 2 dumps seit dem letzten 1er dump eingespielt werden? Oder speichert ein 2er dump die Veränderungen seit dem letzten 1er dump, und nicht seit dem letzten dump?

Man sollte sich auch überlegen wohin man sichert. Auf Festplatten sichern ist imo eine schlechte Idee.
 
Maledictus schrieb:
müssen nicht alle level 2 dumps seit dem letzten 1er dump eingespielt werden? Oder speichert ein 2er dump die Veränderungen seit dem letzten 1er dump, und nicht seit dem letzten dump?

letzteres

Maledictus schrieb:
Man sollte sich auch überlegen wohin man sichert. Auf Festplatten sichern ist imo eine schlechte Idee.

nix spricht gegen eine platte, solange sie nicht im selben rechner ist.

bei mir sichern 3 server auf einen 4. über nfs. von da wandern die dumps auf dvd. aber nich alle. will mich ja nich armdumpen :D
 
Das bringt mich wieder zu meiner nicht 100%-tig geklaerten Frage, ob dump | restore auf allen Dateisystemen funktioniert auf denen FreeBSD lesen und schreiben kann, oder ob es wirklich nur auf ufs(2) geht.

Gruss, I.MC
 
ich bin mir eigentlich zu 100% sicher das dump/restore nur mit ufs bzw. ufs2 wirklich funktioniert und vor allem sinn macht, da dump z.b. auf die softupdates und die snapshots zurückgreift. und die sind nu mal ein echtes ufs feature :D
 
Mmh, die Snapshots werden nur bei der Option -L genutzt.... also ich bin mir da immer noch nicht sicher. Ich finde nirgends eine Aussage, dass das nicht geht :-)

Gruss, I.MC
 
Das bringt mich wieder zu meiner nicht 100%-tig geklaerten Frage, ob dump | restore auf allen Dateisystemen funktioniert auf denen FreeBSD lesen und schreiben kann, oder ob es wirklich nur auf ufs(2) geht.
Schau dir den Code an (/usr/src/sbin/dump/traverse.c), der greift direkt auf die Filesystem-Struktur auf der Platte zu und geht nicht über den Filesystem-Treiber. Deshalb kann es nur mit ufs funktionieren.
 
Vielen Dank für die Scripts, war gerade am Basteln von einer Backup Lösung als ich schnell zur Entspannung bsdforen.de ansurfte und dein Posting sah. Kommt mir wie gerufen :)
 
Vielen Dank marzl. Gute Arbeit. Exakt wonach ich schon die ganze Zeit gesucht habe.
Jetzt kann ich endlich alles sichern und die FreeBSD Partition vergrößern.

Ich habe aber noch einen Vorschlag.

Wie wäre es wenn du deinem HowTo noch hinzufügen würdest, wie man alles wieder restort. Evtl. wie man alles in crontab einträgt. Ich glaube es wären dir viele dafür dankbar.

albix
 
Vielen Dank für die HowTos. Dank euch und FreeSBIE läuft mein Laptop wieder mit dem alten funktionsfähigem System.

Big Thank you.

albix
 
Zuletzt bearbeitet:
Moin

Hab jetzt genau das level0 dump Script aus dem Wiki hergenommen um damit 2 Partitionen zu sichern. Klappt auch wunderprächtig, mit einem kleinen aber feinen Schönheitsfehler. Ich weiß nicht wodurch es hervorgerufen wird (gzip vielleicht), aber während der Sicherung (also während dd) wird die Zieldatei immer unter / abgelegt, erst nach erfolgtem abgeschlossenen Backup, in das Zielverzeichnis kopiert.
Das geht in meinem speziellen Fall aber nicht, da ich die root partition nur 1GB habe und somit zum Zwischenspeichern nicht genügend Platz da ist.
Hat jemand ne Ahnung wie ich das File direkt in das Zielverzeichnis lenken kann?

Hier mein script:
Code:
www# cat level0dump
#!/bin/sh
dump=/sbin/dump
chflags=/usr/bin/chflags
dt='date+%Y%m%d'
destpath=/usr/home/martin/Backup/
lvl=0

src1=/dev/ad0s1e #/var
src2=/dev/ad0s1g #/usr

dest1=$destpath/var_ad0s1e_$dt.gz
dest2=$destpatz/usr_ad0s1g_$dt.gz

$chflags -R nodump /usr/ports/
$chflags -R nodump /usr/src/
$chflags -R nodump /usr/obj/

$dump -$lvl -h0 -auf - $src1 | gzip -2 | dd of=$dest1
$dump -$lvl -h0 -auf - $src2 | gzip -2 | dd of=$dest2
www#

Wäre super, wenn mir jemand auf die Sprünge helfen könnte.

Thx
 
Hi Namensvetter,

martin schrieb:
Wäre super, wenn mir jemand auf die Sprünge helfen könnte.

Ganz einfach:

Mache aus
dest2=$destpatz/usr_ad0s1g_$dt.gz
einfach
dest2=$destpath/usr_ad0s1g_$dt.gz

Dann patht es anstatt zu patzen ;-)


CU

Martin
 
hi zusammen,
eine kleine Frage. Wie kann es denn sein das das Backup auf /home/..... liegt und man gleichzeitig das / verzeichnis zurückspielt? /home wird doch dabei überschrieben oder sehe ich das falsch?

Gruß crus4der
 
Dateien per default nicht überschrieben. Es ist jedoch ratsam das Backup nicht auf dem zu sichernden Medium zu sichern :)
 
kk das ist sehr ratsam ;)
Ich verstehe den Punkt 2 in der Anleitung hier noch nicht ganz. Und zwar mountest du ja deine neue platte nach /mnt/ad2/...wie hast du das gemacht und was machst du nach dem restore..weil die Verzeichnisse ja dann mit den Daten gefüllt sind!? Da komme ich nocht nicht ganz hinter!

Gruß crus4der

edit: Das script für den dump erstellen funzt wunderbar...THX schonmal dafür :D
 
Nach dem Restore fliegt die alten Platte raus und die neue ersetzt diese sozusagen.
Da es eine 1:1 Kopie ist, läuft das dann ohne weitere Anpassungen.
Der mount nach /mnt/ad2/ ist ja nur ein temporärer Zugriff zum Zwecke des wiederherstellens.
 
ahhh ok...da hat es bei mir noch etwas gehangen!
Nur noch eine Frage wenn ich / (root) sicher. Was sichert er dann genau? Nur die Ordner die sich im hauptroot befinden oder auch den Inhalt? Weil dann bräuchte ich ja zb /usr nicht mitsichern?

Gruß crus4der
 
Zurück
Oben