gmirror auf production-system einrichten

rakso

Well-Known Member
hallo Leute!

ich habe da nen server mit seriellem consolenzugang ab loader mit zwei genau gleichen Festplatten ad0 und ad2.

Ich möchte nun ein raid1 daraus machen.

http://people.freebsd.org/~rse/mirror/
kenne ich. danach habe ich es versucht, aber es zerschoss mir das system. dann habe ich den strato rootserver neu eingerichtet und das raid vernachlässigt. die idee ist schon gut, erst ad2 ins gm0 aufnehmen und ad0 nach gm0 kopieren, davon starten, dann ad0 reinnehmen... aber es sollte nichts schiefgehen. ich muss gesehen, mich mit dem disklabel / fdisk nicht gut genug auszukennen :(


wer kann mir helfen, evtl in einer "live-session" per ICQ?


Code:
# fdisk
******* Working on device /dev/ad0 *******
parameters extracted from in-core disklabel are:
cylinders=159560 heads=16 sectors/track=63 (1008 blks/cyl)

Figures below won't work with BIOS for partitions not in cyl 1
parameters to be used for BIOS calculations are:
cylinders=159560 heads=16 sectors/track=63 (1008 blks/cyl)

Media sector size is 512
Warning: BIOS sector numbering starts with sector 1
Information from DOS bootblock is:
The data for partition 1 is:
sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
    start 63, size 12578832 (6142 Meg), flag 80 (active)
        beg: cyl 0/ head 1/ sector 1;
        end: cyl 782/ head 254/ sector 63
The data for partition 2 is:
sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
    start 12578895, size 148247820 (72386 Meg), flag 0
        beg: cyl 783/ head 0/ sector 1;
        end: cyl 1023/ head 254/ sector 63
The data for partition 3 is:
<UNUSED>
The data for partition 4 is:
<UNUSED>

------------------------

# /dev/ad0s1:
8 partitions:
#        size   offset    fstype   [fsize bsize bps/cpg]
  a:  2097152        0    4.2BSD     2048 16384 28528
  b:  2097152  2097152      swap
  c: 12578832        0    unused        0     0         # "raw" part, don't edit
  d:  4194304  4194304    4.2BSD     2048 16384 28528
  e:  1048576  8388608    4.2BSD     2048 16384     8

PS: Ich habe noch einen zweiten server, allerdings ein 5.5er (der hier läuft mit 7-current). wie mache ich zu dem ein backup, womit srv2 am schnellsten wieder lauffähig ist?
 
danke, das ist aber nur für die installation und geht demnach absolut nicht auf die schwierigkeiten beim nachträgelichen einbau ein.
 
Hi rasko,

ich hatte letztens auf einem 1&1-Server das selbe Problem.
Ich habe mich wie schon früher an das How-To unter http://people.freebsd.org/~rse/mirror/ gehalten bin aber nicht weit gekommen. Irgendwas scheint in 7.0 anders zu sein als in 6.2 was das labeln des mirrors verhindert. ("Permission denied"; auch debugflags=16 hilft nicht)
Kannst mich gerne auch via ICQ anschreiben. Grundsätzlich kann ich dir schon dabei helfen. Ich weiß halt nur nicht wie weit wir kommen, da bei mir quasi nach dem Punkt "gmirror load" Schluss war :-( Weiß aber nicht, ob das Prob mittlerweile behoben ist, da ich noch mit ner 7.0 BETA 4 getestet hatte.

VG
Peter
 
Hm? Das ist doch kein Problem, oder ich habe ein Problem überlesen.
Geh folgendermassen vor, wobei ich davon ausgehe das auf /dev/da0 schon ein funktionierendes System vorhanden ist und /dev/da1 dann in den mirror soll.

Achja, alles as "root" ausführen:

1. sysctl kern.geom.debugflags=16

2. gmirror label -v -b round-robin gm0 /dev/da0
(Statt round-robin kann man auch anderes nehmen, siehe manpage zu gmirror)

3. In /boot/loader.conf diesen Eintrag machen:
geom_mirror_load="YES"

4. /etc/fstab anpassen (ACHTUNG, DIESE 5x danach kontrollieren!)
Aus /dev/da0s1a wird /dev/mirror/gm0s1a
--> Das machst Du mit allen Einträgen in der fstab analog zum obigen Beispiel. CD/DVD aussen vor lassen ;-)

5. reboot (KONTROLLIERE DIE FSTAB NOCHMALS!)

6. gmirror insert gm0 /dev/da1

7. Fertig

Mit "gmirror list" oder "gmirror status" den mirror ansehen.

Sollte nach dem reboot die Kiste nicht mehr ansprechbar sein, dann musst Du in der Konsole nachsehen wo er hängt, wahrscheinlich findet er seine Platten nicht, bzw. / da nen Fehler in der fstab ist.
Siehe dazu: http://www.onlamp.com/pub/a/bsd/2005/11/10/FreeBSD_Basics.html?page=2
 
ähm moment mal, man einfach die bestehende UFS-Partition hernehmen?
also bei mir siehts so aus:

/dev/ad0s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/ad0s1d on /usr (ufs, local, soft-updates)
/dev/ad0s1e on /var (ufs, local, soft-updates)

mirror/gm0 ist schon an mei datengrab vergeben, also muss ich fürs system gm1 (bestehend aus ad0 und ad3) nehmen.


und da kann ich jetzt einfach auf /dev/mirror/gm1s1a für /
gm1s1d für /usr
gm1s1e für /var

(in fstab) nehmen?
wieso funktioniert das?!

(nachdem ich gmirror label -v -b round-robin gm1 /dev/ad0 ausgeführt habe)


ich dachte, ich muss gm1 mit ad3 (die 2., leere platte) einrichten, dort partitionen a,d,e und swap gemäß ad0 anlegen, den inhalt von ad0s1* nach gm1s1* kopieren, dann von gm1 starten. etc...


bestätige also bitte, ob ich das so richtig kapiert hab, dann mach ichs so wie von dir vorgeschlagen.

Gruß!

(PS: ich probiers zuerst auf meinem server zu hause, der bei strato hat natürlich nur zwei platten, wo es dann auch gm0 wäre..)


2. gmirror label -v -b round-robin gm0 /dev/da0

4. /etc/fstab anpassen (ACHTUNG, DIESE 5x danach kontrollieren!)
Aus /dev/da0s1a wird /dev/mirror/gm0s1a
--> Das machst Du mit allen Einträgen in der fstab analog zum obigen Beispiel. CD/DVD aussen vor lassen ;-)

5. reboot (KONTROLLIERE DIE FSTAB NOCHMALS!)
 
Hä? Wie meinen?

Du hast eine Platte auf der schon FBSD installiert ist und rennt. Und eine auf der noch nichts drauf ist.
Dann mach es so wie beschrieben. Ob Du das nun "gm" nennst oder "foo" ist egal.
 
ok, nochmals ganz langsam.

ich habe eine Platte ad0, auf der ein FreeBSD System drauf ist, fstab sieht aus wie folgt:

/dev/ad0s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/ad0s1d on /usr (ufs, local, soft-updates)
/dev/ad0s1e on /var (ufs, local, soft-updates)


das gm1-mirror wird aus ad0 (wo FBSD drauf ist) und ad3 (leer) bestehen.


1.) gmirror label -v -b round-robin gm1 /dev/ad0

2.) fstab anpassen
/dev/ad0s1a --> /dev/mirror/gm1s1a
/dev/ad0s1d --> /dev/mirror/gm1s1d
/dev/ad0s1e --> /dev/mirror/gm1s1e

Dagegen sträubt sich noch mein Inneres, weil ich das noch nie gesehen habe.
Die "normalen", nicht gm-Partitionen ad0X sind automatisch im geom unter mirror/gmX drin?

Das wäre ja fantastisch :)
 
Was ist daran jetzt ungewöhnlich? Beim Mirror werden ja nur deine vorhandenen Daten auf eine zweite Festplatte kopiert und diese Kopie permanent aktuell gehalten.

Das gmirror-Kernelmodul schaut beim Start auf den Platten nach seinen Meta-Informationen und stellt dann nach der dort gefundenen Konfiguration die Spiegel-Devices zur Verfügung. Da gmirror nur eine zusätzliche Schicht für RAID-1 darstellt und transparent für das darüberliegende Dateisystem ist, muss man auch im Dateisystem nichts ändern.

Eigentlich keine Zauberei... Ändern müsste man nur etwas, wenn man andere RAID-Level wie RAID-5/6 oder AID-0 (Striping) nachträglich einführen möchte. Da müssen ja dann auch die Daten auf der bestehenden Platte komplett umstrukturiert werden.
 
Zuletzt bearbeitet:
ok, nochmals ganz langsam.

ich habe eine Platte ad0, auf der ein FreeBSD System drauf ist, fstab sieht aus wie folgt:

/dev/ad0s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/ad0s1d on /usr (ufs, local, soft-updates)
/dev/ad0s1e on /var (ufs, local, soft-updates)

Und was ist mit dem SWAP? Soll der nicht auch gespiegelt werden?

Ich habe das so:
Code:
# Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/mirror/gm0s1b              none            swap    sw              0       0
/dev/mirror/gm0s1a              /               ufs     rw              1       1
/dev/mirror/gm0s1e              /usr            ufs     rw,userquota            2       2
/dev/mirror/gm0s1d              /var            ufs     rw              2       2


das gm1-mirror wird aus ad0 (wo FBSD drauf ist) und ad3 (leer) bestehen.

1.) gmirror label -v -b round-robin gm1 /dev/ad0


2.) fstab anpassen
/dev/ad0s1a --> /dev/mirror/gm1s1a
/dev/ad0s1d --> /dev/mirror/gm1s1d
/dev/ad0s1e --> /dev/mirror/gm1s1e

Ja, genau. Fehlt noch der SWAP ;-).
Und, wie ich schon schrieb, musst Du vor

Code:
1.) gmirror label -v -b round-robin gm1 /dev/ad0

noch ein

Code:
 sysctl kern.geom.debugflags=16

machen.

Dagegen sträubt sich noch mein Inneres, weil ich das noch nie gesehen habe.
Die "normalen", nicht gm-Partitionen ad0X sind automatisch im geom unter mirror/gmX drin?
Das wäre ja fantastisch :)

Ja, so einfach ist das. Falls Du eine VM auf einem System haben solltest, und es nicht glauben kannst, dann spiele es da doch einfach einmal durch. Wozu sind die VMs sonst da...
 
Und was ist mit dem SWAP? Soll der nicht auch gespiegelt werden?
ja, aber vom swap steht nix in der fstab drin!

Obwohl ich aber swap habe:
Swap: 2048M Total, 165M Used, 1883M Free, 8% Inuse

muss ich also wie bei dir
/dev/mirror/gm0s1b none swap sw 0 0

zusätzlich reinschreiben, weil fbsd den swap mit gmirror nichtmehr selbst erkennt?


> Ja, so einfach ist das. Falls Du eine VM auf einem System haben
> solltest, und es nicht glauben kannst, dann spiele es da doch einfach
> einmal durch. Wozu sind die VMs sonst da...

vm nicht, aber ich hab noch n rechner mit zwei gleich großen platten rumstehen, da teste ich das.
 
geil, das funktioniert ja sogar!! :)

auf dem neu installierten system gibts in fstab swap, auf meinem server nicht. komisch, was tun? einfach mirror/gm1s1b als swap definieren?

noch eine Frage:

auf dem Server gibt es bereits gm0, das system-raid wird also gm1.
Woher erkennt FreeBSD, dass es von gm1 booten soll?

fstab?
aber der loader/kernel davor muss es doch auch wissen....





damit ist also das Engelschall-HOWTO und auch das hier http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/geom-mirror.html outdated?!
 
Zuletzt bearbeitet:
Ich rieche ein Verständnisproblem...

GEOM speichert seine Metadaten am Ende der Platte, im Gegensatz zu so machem RAID-Controller und anderem Volume-Management-System. Daher ist GEOM für andere Betriebssysteme, Bootmechanismen und so weiter unsichtbar. Loader starten den Kernel also von ad0s1a, der Kernel schaut in die fstab und mountet dann gm0s1a als /.
 
(fast) alles klar!

nochmals, der "old way" ist wirklich outdated, oder konnte man es schon immer so elegant wie hier im thread beschrieben machen?

fdisk -vBI /dev/mirror/gm0
bsdlabel -wB /dev/mirror/gm0s1
newfs -U /dev/mirror/gm0s1a
mount /dev/mirror/gm0s1a /mnt
dump -L -0 -f- / |(cd /mnt && restore -r -v -f-)
[jedes FS manuell umkopieren]
 
Das so elegant ging eigentlich schon immer, allerdings hatten ältere GEOM-Versionen mehr oder weniger große Probleme mit dem Labeln von Providern zur Laufzeit - also wenn die eingehängt waren - was unter Umständen auch schon mal in einer netten panic() enden konnte. Auch wenn es mir nur ein einziges mal passiert ist. Daher hat man bis einschließlich 5.5 eigentlich immer den umständlichen Weg genommen, außer man war mutig.
 
unglaublich, es funktioinert auch auf dem server :)
jetzt traue ich mich es auch auf dem rootserver..

GEOM_MIRROR: Device mirror/gm1 launched (1/1).
GEOM_MIRROR: Device mirror/gm0 launched (2/2).
Trying to mount root from ufs:/dev/mirror/gm1s1a
....

Code:
gmirror list gm1
Geom name: gm1
State: DEGRADED
Components: 2
Balance: round-robin
Slice: 4096
Flags: NONE
GenID: 0
SyncID: 1
ID: 3353639188
Providers:
1. Name: mirror/gm1
   Mediasize: 251000192512 (234G)
   Sectorsize: 512
   Mode: r5w4e5
Consumers:
1. Name: ad0
   Mediasize: 251000193024 (234G)
   Sectorsize: 512
   Mode: r1w1e1
   State: ACTIVE
   Priority: 0
   Flags: DIRTY
   GenID: 0
   SyncID: 1
   ID: 1547806121
2. Name: ad3
   Mediasize: 251000193024 (234G)
   Sectorsize: 512
   Mode: r1w1e1
   State: SYNCHRONIZING
   Priority: 0
   Flags: DIRTY, SYNCHRONIZING
   GenID: 0
   SyncID: 1
   Synchronized: 0%
   ID: 1820124688
 
zur sicherheit: auf dem server sieht die fstab wie folgt aus

Code:
/dev/ad0s1b  none  swap sw  0 0
/dev/ad0s1a  /  ufs rw  1 1
/dev/ad0s2a             /usr            ufs     rw              1       1
/dev/ad0s1e  /tmp  ufs rw,nosuid,noexec 2 2
/dev/ad0s1d  /var  ufs rw  2 2
also es gibt auch s2a

das macht nix aus, oder?
 
(is noch viel zu früh)

[bullshit_on]
Ohne mich jetzt zu weit aus dem Fenster zu lehnen, befürchte ich, dass du bei dieser Aufteilung dein System zerschießen wirst:
anscheinend wird die zweite Platte (ad2) für /usr genutzt!

Müßtest also _vorher_ /usr auf ad0(a?) unterbringen, sonst zerhackstückelst du dir deine Installation.
[/bullshit_on]

Wer lesen kann is klar im Vorteil ;) Vergiß das - ist ja ad0s2a und nicht ad2s...
 
so isses, gut erkannt... nachdem, was ich hier gelesen habe, sollte es kein problem sein, nur, nach dem RSE-howto nach gab es genau an dieser stelle das finale problem :)

gelabelt habe ich ad0 schon, heute morgen test-reboot (ohne fstab anzupassen), dann heisst es:


messages.0:Jan 21 07:48:49 srv2 kernel: GEOM_MIRROR: Cannot add disk ad0 to gm0 (error=1).
messages.0:Jan 21 07:48:49 srv2 kernel: GEOM_MIRROR: Device gm0 destroyed

warum dieses "cannot add disk.." ?
so wie ich das verstehe, wäre das system nach einer änderung in fstab sowiso gegen die mauer gefahren, weil gm nicht hergestellt werden kann.
 
Ich versteh nicht, was Du da machst... ?

Erstmal die HDD befreien, von allem was schon mal drauf war mit dd....

Ich lege fuer gmirror immer 1 slice an, was fast ueber die ganze HDD geht.
Nicht ueber die ganze hdd und nicht die ganze hdd.
Gmirror braucht Platz zum schreiben der Info's und Labels.

Also ad4 wuerde ich nie zu einem Mirror hinzubasteln, sondern immer ad4s1.
Und ad4s1 ist auch nicht ganz so gross, wie ad4 sondern mindestens 1MB kleiner.

########################

Du hast 2 HDD's und eine rennt (OS), die andere ist leer.

Als root machste sysinstall auf und gehst zu fdisk.
Entfernst alle slices und legst ein neues an mit der Kapazitaet Deiner HDD in MB.
(Steht auch rechts oben) Also 234567MB steht da. Ziehst 1 MB davon ab und erstellst 234566MB grosses slice.
Drueckst 'w' zum schreiben und bastelst da einen Standard Bootrecord dadrauf.

Danach fuegen wir das Laufwerk dem gmirror hinzu.

# gmirror label -v -n -b load gm0s1 /dev/ad6s1

Wir aktivieren gmirror im Kernel

# gmirror load

Nun labeln wir den gm0 Device, damit BSD damit auch was anfangen kann.

# bsdlabel -w -B /dev/mirror/gm0s1

Danach erstellen wir unsere eigenen Labels auf der Partition:

# bsdlabel -e /dev/mirror/gm0s1

Soo und nu kommt es daruf an, dass die labels von Deiner HDD, von der gerade das OS kommt auf den gmirror installiert werden. Dazu habe ich mir extra eine Tabelle gemacht, dass er das auch immer richtig macht.

Wegen der Sizes und Offsets...

Einfach das bsdlabel kopieren, von der HDD in den gmirror kannste so nicht einfach machen.

Wenn die Labels dann in deinem gmirror genauso sind, wie auf der OS HDD dumpst das einfach rueber. *g habe seit 2005 kein FBSD mehr installiert... :)

Ein Script Sample:

Code:
#!/bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/root/bin

#############################

DEV=/dev/mirror/gm0s1

############################

error_func()
{
     if [ $1 -ne 0 ]
         then
         echo "Es ist ein Fehler aufgetreten!"
         exit 1
     fi
}

###########################

rm -rf /usr/obj/*
rm -rf /data/workfiles/*
rm -rf /data/distfiles/*


# Das / Dir wird gedumpt.
newfs -U ${DEV}a
error_func $?
mount ${DEV}a /mnt
error_func $?
dump -L -0 -f- / | (cd /mnt; restore -r -v -f-)
error_func $?

# Das /var Dir wird gedumpt.
newfs -U ${DEV}d
error_func $?
mount ${DEV}d /mnt/var
error_func $?
dump -L -0 -f- /var | (cd /mnt/var; restore -r -v -f-)
error_func $?

# Das /usr Dir wird gedumpt.
newfs -U ${DEV}f
error_func $?
mount ${DEV}f /mnt/usr
error_func $?
dump -L -0 -f- /usr | (cd /mnt/usr; restore -r -v -f-)
error_func $?

# Das /tmp Dir wird gedumpt.
newfs -U ${DEV}e
error_func $?
mount ${DEV}e /mnt/tmp
error_func $?
dump -L -0 -f- /tmp | (cd /mnt/tmp; restore -r -v -f-)
error_func $?

# Das /usr/ports Dir wird gedumpt.
newfs -U -b 4096 -f 512 -i 3072 ${DEV}g
error_func $?
mount ${DEV}g /mnt/usr/ports
error_func $?
dump -L -0 -f- /usr/ports | (cd /mnt/usr/ports; restore -r -v -f-)
error_func $?

# Das /data Dir wird gedumpt.
newfs -U ${DEV}h
error_func $?
mount ${DEV}h /mnt/data
error_func $?
dump -L -0 -f- /data | (cd /mnt/data; restore -r -v -f-)
error_func $?


rm -f /mnt/etc/fstab
echo "# Device                Mountpoint      FStype  Options         Dump    Pass#" > /mnt/etc/fstab
echo "${DEV}b             none            swap    sw              0       0" >> /mnt/etc/fstab
echo "${DEV}a             /               ufs     rw              1       1" >> /mnt/etc/fstab
echo "${DEV}h             /data           ufs     rw              2       2" >> /mnt/etc/fstab
echo "${DEV}e             /tmp            ufs     rw              2       2" >> /mnt/etc/fstab
echo "${DEV}f             /usr            ufs     rw              2       2" >> /mnt/etc/fstab
echo "${DEV}g             /usr/ports              ufs     rw              2       2" >> /mnt/etc/fstab
echo "${DEV}d             /var            ufs     rw              2       2" >> /mnt/etc/fstab
echo "/dev/acd0               /cdrom          cd9660  ro,noauto       0       0" >> /mnt/etc/fstab

init 0
exit

Das Script ist einfach gehalten. Fuer mich war immer wichtig, dass es einfach und leicht funktioniert.

Mittlerweils laufen 24 Server mit mindestens 2 HDD's und gmirror. Es lauft einwandfrei.
Was mit der sysctl Variable gemacht wird um irgendwelche flags zu setzen, davon lese ich hier zum ersten mal. Das Ersetzen und zusaetzlich einbauen von HDDs ist sehr leicht bei gmirror.

Wennste noch Fragen oder Probleme hast...

CAT
 
also für mich zu kompliziert, bzw komplex und damit fehlerträchtig.. les dir mal den thread hier durch, da wird beschrieben, wie easy das eigentlich geht und seit 6.x auch stabil funktioniert!
 
habe ich, und weil ich ehrlich gesagt keine leichte Antwort gelesen habe, habe ich geantwortet. Tut mir ja leid.

Also ich habe am Anfang ein bisschen damit rumgebastelt und nun 2 Scripts, die das fast von allein machen. Keine Fehler... ;)



CAT
 
Zurück
Oben