Dies ist ein erster Versuch einer HOWTO Dokumentation und entstand aus dem Bedürfniss heraus, meine Erfahrungen bei der Installation eines RAID1-Systems mitzuteilen. Weitere Dokumente zum Thema RAID können am Ende dieses Textes gefunden werden.
Unser System ist ein Dell PowerEdge 650 mit 2 Festplatten je 80 GB (beide leer) mit folgender Konfiguration:
/dev/hda (Primary Master) /dev/hdc (Secondary Master) /dev/hde CD-ROM Laufwerk /dev/fd0 Floppy Laufwerk
Das Zielsystem soll unter Einsatz von Linux basierend auf SuSE 8.2 arbeiten. Dazu steht uns eine bootfähige CD zur Verfügung, die auch ein Rescue-System beinhaltet. Wir benötigen die mdadm Tools, die auf CD mitgeliefert werden.
Wir haben bei der Installation von SuSE 8.2 es nicht geschafft, unsere Wunschinstallation durchzuführen. Es erscheint uns, als unterstützte Yast2 lediglich die Einrichtung eines RAID1 Devices (md0). Daher haben wir uns zu einer manuellen Installation entschlossen.
Ziel der Installation ist ein Server mit der folgenden Partitionierung:
/boot als /dev/md0: Raid1 bestehend aus /dev/hda1 und /dev/hdc1 ( 16 MB) swap als /dev/md1: Raid1 bestehend aus /dev/hda2 und /dev/hdc2 (256 MB) / als /dev/md2: Raid1 bestehend aus /dev/hda3 und /dev/hdc3 ( 20 GB) /home als /dev/md3: Raid1 bestehend aus /dev/hda4 und /dev/hdc4 ( rest )
Wir nutzen den Bootmanager LILO. Das System soll bootfähig bleiben im Falle des Ausfalls einer der beiden Platten. Swap ist auch in einem RAID1 Device, um die Ausfallsicherheit zu erhöhen.
Diese Anleitung ist “Dad”-geprüft, d.h. mein Vater hat dieser Anleitung folgend selbständig das beschriebene System installiert. Sie hat bei uns funktioniert, muss allerdings nicht auf anderen Systemen klappen. Es ist zu beachten, dass diese Anleitung auf eigene Gefahr hin zu benutzen ist. Ich übernehme keine Verantwortung für auftretende Fehler. “Follow at your own risk!”
Zuerst wird das Rescue-System der CD gebootet, um die Installationsroutinen von Yast zu umgehen. Nach dem Hochfahren loggen wir uns als root ein.
Nachdem das Rescue-System gebootet ist, richten wir die beiden Festplatten ein. Zur Partitionierung der beiden Festplatten nutzen wir fdisk.
Rescue:~ # fdisk /dev/hda
Wichtige Kommandos von fdisk sind:
m zur Anzeige der Hilfe p zur Anzeige der Partitionen d zum Löschen einer Partition n zum Anlegen einer Partition t zum Setzen des Typs der Partition a zum Setzen des Bootable-Flag w zum Schreiben der Partitionstabelle und zum Beenden von fdisk
Einmal zusammen - Schritte zum Anlegen der ersten Partition:
Command (m for help): n e extendend partition p primary partition (1-4) p[enter] Number (1-4): 1 Selected partition 1 First cylinder (1-9726, default 1):[enter] Last cylinder or +size or +sizeM or +sizeK (... , default ...): +16M[enter]
(Bitte beachten: Typ der Partitionen auf fd setzen.)
Command (m for help): t Partition number (1-4): 1[enter] Hex code (type L to list codes): fd[enter] Changed system type of partition 1 to fd (Linux raid autodetect)
(Nur Partition 1 soll auch noch bootfähig sein, darum folgt)
Command (m for help): a Partition number (1-4): 1[enter]
(Anzeigen des Erreichten:)
Command (m for help): p
Diesen Vorgang entsprechend für die restlichen Partitionen durchführen.
Die vollständige Partitionstabelle für hda sieht dann so aus:
Device Boot Start End Blocks Id System /dev/hda1 * 1 3 24066 fd Linux raid autodetect /dev/hda2 4 35 257040 fd Linux raid autodetect /dev/hda3 36 2468 19543072+ fd Linux raid autodetect /dev/hda4 2469 9726 58299885 fd Linux raid autodetect
Den Vorgang wiederholen wir für die zweite Festplatte:
Rescue:~ # fdisk /dev/hdc
Wir vergewissern uns nochmals über die Partitionen mittels
Rescue:~ # fdisk -l /dev/hda /dev/hdc Disk /dev/hda: 80.0 GB, 80000000000 bytes 255 heads, 63 sectors/track, 9726 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/hda1 * 1 3 24066 fd Linux raid autodetect /dev/hda2 4 35 257040 fd Linux raid autodetect /dev/hda3 36 2468 19543072+ fd Linux raid autodetect /dev/hda4 2469 9726 58299885 fd Linux raid autodetect Disk /dev/hdc: 80.0 GB, 80000000000 bytes 255 heads, 63 sectors/track, 9726 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/hdc1 * 1 3 24066 fd Linux raid autodetect /dev/hdc2 4 35 257040 fd Linux raid autodetect /dev/hdc3 36 2468 19543072+ fd Linux raid autodetect /dev/hdc4 2469 9726 58299885 fd Linux raid autodetect
Anschliessend rebooten wir das Rescue-System, um die neuen Partitionstabellen zu aktivieren. (Also, beim Hochfahren wieder das Rescue-System starten.)
Zum Einrichten der md Devices benutzen wir die mdtools. Der Befehl heisst mdadm und mittels
Rescue:~ # mdadm --help
kann man sich mehr Informationen anzeigen lassen.
Wir wollen ein Level 1 RAID Array bestehend aus zwei Festplatten anlegen, deshalb:
Rescue:~ # mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/hda1 /dev/hdc1 Rescue:~ # mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/hda2 /dev/hdc2 Rescue:~ # mdadm --create /dev/md2 --level=1 --raid-devices=2 /dev/hda3 /dev/hdc3 Rescue:~ # mdadm --create /dev/md3 --level=1 --raid-devices=2 /dev/hda4 /dev/hdc4
Mittels
Rescue:~ # cat /proc/mdstat
kann man sich den Status der md Devices anzeigen lassen. Sicherheitshalber warten wir, bis das resync aller Devices abgeschlossen ist (bei uns ca. 30min). Dieser Vorgang kann durch obigen Befehl beobachtet werden. Und so sieht es aus, wenn die RAID Arrays fertig sind:
Rescue:~ # cat /proc/mdstat
Personalities : [raid1]
read_ahead 1024 sectors
md3 : active raid1 hda4[0] hdc4[1]
58299776 blocks [2/2] [UU]
md2 : active raid1 hda3[0] hdc3[1]
19542976 blocks [2/2] [UU]
md1 : active raid1 hda2[0] hdc2[1]
256960 blocks [2/2] [UU]
md0 : active raid1 hda1[0] hdc1[1]
24000 blocks [2/2] [UU]
unused devices: <none>
Neustart des Systems von CD - diesmal aber “Installation” auswählen.
(Sprachauswahl durchführen)
(*) Neuinstallation auswählen
Die Oberfläche Installationseinstellungen erscheint.
Den Punkt “Partitionierung” auswählen.
(*) Partitionen nach eingenen Vorstellungen anlegen -> weiter (*) Erweiterte Einstellungen, manuelle Aufteilung (Partitionierung) -> weiter
Nun Gerät /dev/md0 auswählen -> Bearbeiten (*) Formatieren Dateisystem Ext3 (x) Persistent Superblock Mountpoint /boot2
(wir legen /boot2 als mountpoint an, weil Yast sich über /boot beschwert. Später wird diese Partition nach /boot per Hand geändert. Evtl. kann man auch keinen Mountpoint anlegen - dies haben wir aber nun nicht ausprobiert.)
Nun Gerät /dev/md1 auswählen -> Bearbeiten (*) Formatieren Dateisystem Swap (x) Persistent Superblock Mountpoint swap
Nun Gerät /dev/md2 auswählen -> Bearbeiten (*) Formatieren Dateisystem Reiser (x) Persistent Superblock Mountpoint /
Nun Gerät /dev/md2 auswählen -> Bearbeiten (*) Formatieren Dateisystem Reiser (x) Persistent Superblock Mountpoint /home -> weiter
Fehlermeldung von Yast:
Achtung: ... bisweilen kann LILO scheitern. Wollen Sie dies ändern? -> NEIN
Den Punkt “Software” auswählen.
(*) Minimales System -> Übernehmen
(Wir haben uns für das minimale System entschieden, um die Installation zu beschleunigen.)
Installationseinstellungen überprüfen und mit -> Übernehmen geht es weiter.
Yast Warnung: [...] Installation starten? -> JA
Nun werden die Partitionen formatiert und ein Minimalsystem von CD1 installiert.
Nach dem Reboot starten wir wieder im Rescue-System, um das /boot-System einzurichten.
(Zuerst vergewissern wir uns, dass die RAIDs angelegt sind)
Rescue:~ # cat /proc/mdstat
(Verzeichnisse als temporäre Mountpoints anlegen)
Rescue:~ # mkdir /mnt/md0 Rescue:~ # mkdir /mnt/md2
(Mounten der / und /boot Partitionen)
Rescue:~ # mount /dev/md0 /mnt/md0 Rescue:~ # mount /dev/md2 /mnt/md2
(Boot-Filesystem umkopieren)
Rescue:~ # cp -a /mnt/md2/boot/* /mnt/md0
(Entfernen des alten Mountpoints, nur wenn vorhanden)
Rescue:~ # rm -rf /mnt/md2/boot2
(Löschen der Dateien im alten boot-Verzeichnis)
Rescue:~ # rm /mnt/md2/boot/*
Nun müssen wir den neuen Mountpoint noch in die fstab eintragen, dazu /mnt/md2/etc/fstab ändern:
/dev/md0 /boot ext3 defaults 1 1 /dev/md2 / reiserfs defaults 1 1 /dev/md3 /home reiserfs defaults 1 2 /dev/md1 swap swap pri=42 0 0 devpts /dev/pts devpts mode=0620,gid=5 0 0 proc /proc proc defaults 0 0 usbdevfs /proc/bus/usb usbdevfs noauto 0 0 /dev/cdrom /media/cdrom auto ro,noauto,user,exec 0 0 /dev/fd0 /media/floppy auto noauto,user,sync 0 0
(Unmounten der Filesysteme)
Rescue:~ # umount /mnt/md0 Rescue:~ # umount /mnt/md2
(CD herausnehmen)
Rescue:~ # reboot
Nach dem Reboot kommt Yast wieder und möchte noch ein paar Einstellungen vornehmen. Dies führen wir nach Belieben durch.
Um Linux auch über die zweite Platte booten zu können, müssen wir den Bootrecord der zweiten Platte schreiben, dazu /etc/lilo.conf editieren:
boot = /dev/hda ändern nach
boot = /dev/hdc
und danach lilo aufrufen.
linux:~ # lilo Warning: /dev/hdc is not on the first disk Added linux * Added failsafe
Nun nochmals in die /etc/lilo.conf und die Einträge boot und raid-extra-boot ändern bzw eintragen. Unsere /etc/lilo.conf sieht dann wie folgt aus:
boot = /dev/md0
raid-extra-boot = auto
change-rules
reset
default = linux
disk=/dev/hda
bios=0x80
disk=/dev/hdc
bios=0x81
lba32
menu-scheme = Wg:kw:Wg:Wg
prompt
read-only
timeout = 80
image = /boot/vmlinuz
label = linux
append = \"splash=silent\"
initrd = /boot/initrd
root = /dev/md2
vga = 0x31a
image = /boot/vmlinuz.shipped
label = failsafe
append = \"ide=nodma apm=off acpi=off vga=normal nosmp noapic maxcpus=0 3\"
initrd = /boot/initrd.shipped
root = /dev/md2
vga = 0x31a
lilo wieder aufrufen und alle Warnungen ignorieren.
linux:~ # reboot
Nach dem Rechnerstart kann man z.B. folgendes beobachten:
linux:~ # cat /proc/mdstat
Personalities : [raid1]
read_ahead 1024 sectors
md3 : active raid1 hda4[0] hdc4[1]
58299776 blocks [2/2] [UU]
md2 : active raid1 hda3[0] hdc3[1]
19542976 blocks [2/2] [UU]
[==>..................] resync = 12.3% (2414208/19542976) finish=8.4min speed=33701K/sec
md1 : active raid1 hda2[0] hdc2[1]
256960 blocks [2/2] [UU]
md0 : active raid1 hda1[0] hdc1[1]
24000 blocks [2/2] [UU]
unused devices: <none>
Das System ist nun eigentlich einsatzbereit.
Wir wollen noch testen, ob unser System einige wichtige Ausfallkriterien erfüllt. Dazu testen wir die Bootfähigkeit unseres Systems bei Plattenausfällen. Wir wählen zuerst Platte 2, dann Platte 1, aus testhistorischen Gründen - bei ersten RAID-Versuchen lief das System nur mit Platte 1.
Im ausgeschaltetem Zustand Platte 2 vom Netz trennen. Dann den Rechner wieder hochfahren.
linux:~ # cat /proc/mdstat
Personalities : [raid1]
read_ahead 1024 sectors
md3 : active raid1 hda4[0]
58299776 blocks [2/1] [U_]
md2 : active raid1 hda3[0]
19542976 blocks [2/1] [U_]
md1 : active raid1 hda2[0]
256960 blocks [2/1] [U_]
md0 : active raid1 hda1[0]
24000 blocks [2/1] [U_]
unused devices: <none>
Dies zeigt uns, dass die zweite Festplatte nicht mehr angeschlossen ist.
linux:~ # halt
Festplatte 2 wieder ans Netz anschliessen und anschliessend das System wieder starten.
linux:~ # cat /proc/mdstat
Die zweite Platte ist richtigerweise noch nicht wieder ins RAID Array eingefügt, daher muss man dies per Hand nachholen:
linux:~ # mdadm --manage -a /dev/md0 /dev/hdc1 linux:~ # mdadm --manage -a /dev/md1 /dev/hdc2 linux:~ # mdadm --manage -a /dev/md2 /dev/hdc3 linux:~ # mdadm --manage -a /dev/md3 /dev/hdc4
Ein anschliessendes
linux:~ # cat /proc/mdstat
erlaubt uns das System beim re-synchronisieren des RAID-Arrays zu beobachten.
Im ausgeschaltetem Zustand Platte 1 vom Netz trennen. Dann den Rechner wieder hochfahren. Wenn alles gut lief, bootet das System auch hier anstandslos und man kann ähnlich wie unter 3.1 verfahren (hda(1-4) mit mdadm einbinden, nicht hdc(1-4)).
Im negativen Fall (d.h. die /etc/lilo.conf ist nicht richtig bearbeitet worden) erscheint nur ein L 99 … anstatt eines Boot-Prompts. Dann müssen wir nochmals an die /etc/lilo.conf heran. Also, Rechner aus, Platte 1 wieder anstecken, Rechner hochfahren, als root anmelden und /etc/lilo.conf editieren:
boot = /dev/hdc ... linux:~ # lilo
/etc/lilo.conf editieren:
boot = /dev/md0 raid-auto ... ... linux:~ # lilo
Nun müsste es klappen, dass man auch die Festplatte 1 abklemmen kann und das System noch bootet.
Ein weiterer Test besteht darin, die Platten einzeln zu mounten. Dies ist allerdings nur im Read-Only Modus empfohlen. Hier beschränken wir uns auf die Home-Partitionen beider Festplatten.
(Mountpoints im Verzeichnis /media anlegen)
linux:~ # mkdir /media/home1 linux:~ # mkdir /media/home2
(Mounten der Home-Partitionen der Festplatten an diese Mountpoints)
linux:~ # mount -o ro /dev/hda4 /media/home1 linux:~ # mount -o ro /dev/hdc4 /media/home2
Nun kann man sich überzeugen, dass auf beiden Partitionen die gleichen Daten stehen.
(Unmounten der Partitionen)
linux:~ # umount /media/home1 linux:~ # umount /media/home2
So, nachdem wir unser System getestet haben, können wir die restliche Software wie gehabt nachinstallieren und anschliessend den Rechner konfigurieren. Im Normalfall sollte einem nie auffallen, dass man ein RAID System hat.
Wir möchten nun auch noch, dass wir im Falle eines Fehlers unseres RAID Systems eine Email erhalten. Dazu
mdadm --monitor -f -s -m email@address > /var/log/mdadm
in /etc/init.d/boot.local eintragen. Die Schalter bedeuten übrigens
-- monitor (ein oder mehrere md-Devices überwachen) -f --daemonise (den Prozess als daemon setzen, damit er im Hintergrund läuft) -s --scan (/proc/mdstat beobachten) -m --mail (Emailadresse für Reports)
mdadm.conf ist die Konfigurationsdatei für mdadm. Diese ist jedoch optional. In der man-Page von mdadm wird folgendes Vorgehen zum Anlegen der /etc/mdadm.conf vorgeschlagen:
linux:~ # echo 'DEVICES /dev/hd*[0-9]' > /etc/mdadm.conf linux:~ # mdadm --monitor --scan >> /etc/mdadm.conf
Unsere /etc/mdadm.conf sieht (nach kleinen Veränderungen) so aus:
DEVICE /dev/hda* DEVICE /dev/hdc* ARRAY /dev/md0 level=raid1 num-devices=2 UUID=3889471d:1444987c:5318837b:5a208b33 devices=/dev/hda1,/dev/hdc1 ARRAY /dev/md1 level=raid1 num-devices=2 UUID=a207885b:ff908f8c:aceff862:5407516e devices=/dev/hda2,/dev/hdc2 ARRAY /dev/md2 level=raid1 num-devices=2 UUID=0c0de23d:d48caa2e:4021974d:f5df9048 devices=/dev/hda3,/dev/hdc3 ARRAY /dev/md3 level=raid1 num-devices=2 UUID=7995c72d:4e3f9ec0:89ef60f1:dc8b4340 devices=/dev/hda4,/dev/hdc4 MAILADDR root
Näheres zur mdadm.conf findet man über man mdadm.conf bzw
mdadm –config –help heraus.
Bei der Erstellung unseres Systems haben mir die folgenden Dokumente sehr geholfen:
Herzlichen Dank an die Autoren.
Die folgenden Dokumente wurden konsultiert, trugen aber nicht direkt zum Erfolg unserer Installation bei:
Auch diesen Autoren vielen Dank.
Mit freundlichen Grüßen,
Ralph Miarka
© Oktober 2003
Betreut durch Ralph Miarka
Letzte Änderung: Tue Oct 14 2003 23:13