Das installimage-Script von Hetzner unterstützt bisher keine SW-RAIDs. Kein Problem, wir erstellen einfach vorher das Dateisystem und deaktivieren die entsprechenden Abschnitte in den Install-Scripten.
Diese Howto enthält außerdem viele nützliche Tipps zum Anlegen von Raids. Es sollte auch helfen, auf anderen Rechnern neue Installationen mit SW-RAID1 einzurichten (Abschnitt 1 und 4). Voraussetzung ist auf jeden Fall ein 2.6er Kernel oder neuer.
Alle Angaben ohne Gewähr und Garantie. Sie verlieren sämtliche Daten Ihrer Festplatte.
Getestet mit folgenden (Minimal)-Images: Suse-10.1-64Bit-SMP, Suse-10.0-64Bit-SMP, Debian-3.1-32Bit, Debian-3.1-64Bit-LAMP, Debian-3.1.-64Bit, Ubuntu-6.06.1-32Bit, Ubuntu-6.06.1-64Bit, Suse-10.0-32Bit
Wir freuen uns über Feedback. Diskussionen bitte im entsprechenden Hetzner-Forum unter Eintrag http://forum.hetzner.de/wbb2/thread.php?threadid=7029
Weitere funktionierende Installationen bitte melden an jan.kellermann --at_ werk21.de
Über Feedback freuen wir uns ebenso.
1. RAID und Dateisystem anlegen
2. Installationsscripte runterladen
3. Anpassen der Installationsscripte
5. Mögliche Probleme, Lösungen und Tipps
6. Mini-Howtos
6.1 Raids in Rettungssystem mounten
6.2 Lilo im Rettungssystem ausführen
6.3 Neue Platte (im Rettungssystem) in Raid einhängen
Alles in allem 'ne schnelle Sache Dank des Hetzner-Scripts. Auch wenn das Howto lang aussieht - keine Angst. Wir haben uns bemüht, jeden Schritt zu erklären, daher die Länge.
[Anmerkung: Vielleicht könnte man einfach in das Hetzner-Script die Option "FS vorhanden" einbauen? Man müsste dann nur die Daten für fstab angeben.]
Wir stellen die Anleitung vollständig inkl. Erstellen der RAIDs zur Verfügung. Die Anleitung kann also einfach 1:1 umgesetzt werden..
Lets go!
Die Schritte 1 bis 4 sind natürlich im Rescue-System durchzuführen. Bei eventuelle Reboots während der Installation bitte darauf achten, das Rettungssystem erneut aktiviert zu haben. Siehe dazu auch im Hetzner-Wiki.
Nach Abschluss der Installation wird das System normal von Festplatte gebootet. Das Passwort ist dass das Passwort des zuletzt gestarteten Rettungssystems. Also fein merken :)
Wir schlagen folgene Partionierung vor (und halten uns dabei (fast) an einen Vorschlag aus dem installimage-Script):
| Nr. | Mountpoint | 64Bit | 32Bit | Dateisystem |
| PART 0 | /boot | 1 GB | 1 GB | Ext3 |
| PART 1 | swap | 4 GB | 2 GB | Swap |
| PART 2 | /tmp | 5 GB | 5 GB | Ext3 |
| PART 3 | / | 15 GB | 15 GB | Ext3 |
| PART 4 | /srv | 100 GB | 100 GB | ReiserFS |
Ob es wirklich sinnvoll ist, eine Swap-Partition im Raid anzulegen, wissen wir nicht. In einigen Howtos ist dies allerdings so vorgeschlagen worden. Feedback bitte ins Forum oder an uns.
Hinweis: Wenn bereits vorher Partitionen auf der Platte waren, kann es sinnvoll sein, die Platte einmal zu löschen oder die Partitionstabelle zu löschen.
Das Anlegen kann mit cfdisk oder fdisk geschehen.
Wichtig: TYPE muss immer fd sein.
Wer möchte, kann ansonsten auch folgende Datei in /tmp/parttab anlegen: (Die Platten müssen natürlich groß genug sein!)
linux:~# vi /tmp/parttab
Für 64-Bit-Systeme (SWAP = 4GB): (z.B. DS 9000)
Für 32-Bit-Systeme (SWAP = 2GB): (z.B. DS 3000, 5000, 7000)
Und mit sfdisk importieren:
linux:~# sfdisk /dev/sda < /tmp/parttab
linux:~# sfdisk /dev/sdb < /tmp/parttab
Sie sollten nun den Rechner rebooten, um sicherzugehen, dass die neuen Partitionstabellen eingelesen werden.
Aus diesen Partionen setzen wir nun unser RAID zusammen. Je nach Betriebssystem und Leistung des Servers kann es zu Wartezeiten beim Anlegen oder im Anschluss an das Anlegen der RAIDs kommen.
linux:~# mdadm -Cv /dev/md0 -l1 -n2 /dev/sda1 /dev/sdb1
linux:~# mdadm -Cv /dev/md1 -l1 -n2 /dev/sda2 /dev/sdb2
linux:~# mdadm -Cv /dev/md2 -l1 -n2 /dev/sda3 /dev/sdb3
linux:~# mdadm -Cv /dev/md3 -l1 -n2 /dev/sda5 /dev/sdb5
linux:~# mdadm -Cv /dev/md4 -l1 -n2 /dev/sda6 /dev/sdb6
Tipp: Wer sich vertippt, kann mit
linux:~# mdadm --stop /dev/md<x>
die Partition wieder freigeben.
Ab jetzt sollten Sie keinen Neustart durchführen. Andernfalls müssen die Raids mit mdrun wieder gestartet werden.
Bevor wir weitermachen, müssen wir die Synchronisierung abwarten um sicherstellen, dass alle RAIDs fertig sind. Dazu rufen wir die Übersicht auf:
linux:~ cat /proc/mdstat
Das sollte nach erfolgreicher Synchronisierung in etwa so aussehen:
Personalities : [raid1]
md4 : active raid1 sdb6[1] sda6[0]
58596992 blocks [2/2] [UU]
md1 : active raid1 sda2[0] sdb2[1]
1020032 blocks [2/2] [UU]
md2 : active raid1 sda3[0] sdb3[1]
5124608 blocks [2/2] [UU]
md0 : active raid1 sda1[0] sdb1[1]
4096448 blocks [2/2] [UU]
md3 : active raid1 sda5[0] sdb5[1]
10482304 blocks [2/2] [UU]
unused devices: <none>
Hinter jedem Raid muss ein [UU] stehen. Und es sollte keine Hinweise auf einen Synchronisierungs-Prozess (resync) geben. Sonst weiter warten.
Um nicht permanent den cat-Befehl aufrufen zu müssen, kann auch der watch-Befehl verwendet werden:
linux:~# watch cat /proc/mdstat
Diese Ansicht kann beendet werden mit <STRG>-C
Jetzt ist also genug Zeit, frischen Kaffee zu holen oder neue Zigaretten aus dem Automaten.
Nun müssen wir die Dateisysteme schreiben:
Die Befehle dazu nacheinander abarbeiten:
linux:~# mkfs.ext3 /dev/md0
linux:~# mkswap /dev/md1
linux:~# mkfs.ext3 /dev/md2
linux:~# mkfs.ext3 /dev/md3
linux:~# mkfs.reiserfs /dev/md4
Nun müssen wir das erschaffene Dateisystem noch in einer fstab-Datei abbilden. Diese müssen wir nach /tmp legen, damit das Installscript diese findet.
linux:~# vi /tmp/fstab
Wichtig: Am Ende darf keine Leerzeile sein!
Sollten Sie abweichende Partitionen oder Dateisysteme eingerichtet haben, muss die fstab entsprechend angepasst werden.
So, nun ist unser Dateisystem fertig. Weiter gehts!
Das Hetzner-Script /usr/sbin/installimage lädt weitere Scripte herunter und führt diese sofort aus. Da wir aber diese noch manipulieren wollen, müssen wir das Ausführen unterbinden.
linux:~# vi /usr/sbin/installimage
Letzte Zeile durch Einfügen eines # am Anfang deaktivieren:
/usr/sbin/startsetup
wird zu
# /usr/sbin/startsetup
Anmerkung: Da die Rettungskonsole als Read-Only gemounted ist, muss das Schreiben erzwungen werden. (also entweder :w! oder :x!)
Ausführen und laden der weiteren Installationsscripte:
linux:~# /usr/sbin/installimage
Nun müssen noch kleine Anpassungen an den Scripten gemacht werden. Weiter gehts!
Die Installationsscripte zerstören eigentlich das eingerichtete Dateisystem. Da wir aber wissen, dass wir bereits ein neues System eingerichtet haben und dieses leer ist, müssen wir dem Script dies abgewöhnen.
linux:~# vi /usr/sbin/setupscript
Auskommentieren der Zeilen ca. 112 bis 118 (Hilfe: Zur Zeile <xy> springen in vi mit :<xy>):
Und dahinter einfügen:
system("cp /tmp/fstab /tmp/fstab.".$pid);
Damit wird unsere generierte fstab-Datei kopiert, damit das Installscript diese auch findet.
Aus:
print "\n#~ deleting exisiting partitions..\t\t\t"; $tmp=HOS_del_parts($drive, 0); HOS_check($tmp, 0); print "\n#~ creating new partitions and fstab..\t\t\t"; $tmp=HOS_mk_parts($drive, $part_count, 0); HOS_check($tmp, 0);
wird also:
# print "\n#~ deleting exisiting partitions..\t\t\t";
# $tmp=HOS_del_parts($drive, 0);
# HOS_check($tmp, 0);
# print "\n#~ creating new partitions and fstab..\t\t\t";
# $tmp=HOS_mk_parts($drive, $part_count, 0);
# HOS_check($tmp, 0);
system("cp /tmp/fstab /tmp/fstab.".$pid);
Das wars schon. Jetzt kommt die Installation!
Wir haben ein RAID mit Dateisystem. Wir haben die Installationsscripte angepasst.
Nun kann's losgehen!
Aufrufen von
linux:~# /usr/sbin/startsetup
Nun das gewünschte System auswählen (siehe dazu auch im Hetzner-Wiki).
Die Konfigurations-Datei, die wir editieren müssen, können wir getrost ignorieren und gleich mit F10 weiter gehen.
Anschließend werden System und Kernel etc. installiert.
Für die weiteren Arbeiten müssen wir erstmal unser neues System mounten und chrooten:
linux:~# mount /dev/md3 /mnt
linux:~# mount --bind /dev /mnt/dev/
linux:~# mount --bind /proc /mnt/proc/
linux:~# mount --bind /sys /mnt/sys/
linux:~# chroot /mnt /bin/bash
linux:~# mount -a
linux:~# umount /proc
linux:~# mount -tproc none /proc
Für Debian: mdadm installieren
Beim Debian-Image muss mdadm nachträglich installiert werden.
linux:~# aptitude install mdadm
Evtl. Fehlermeldungen bitte ignorieren bzw. Fragen bestätigen.
Linux lädt zum Booten ein Image-File, in dem das Grundsystem enthalten ist. Wir müssen sicherstellen, dass dieses System auch unser Raid erkennt, also der Treiber raid1 enthalten ist.
Bei einigen neueren Images ist der Treiber enthalten. Wenn der Treiber raid1 bereits enthalten ist, brauch das Boot-Image nicht neu erstellt zu werden, der Abschnitt 4.2.1 kann dann im Weiteren übersprungen werden.
Dazu ergänzen wir die /etc/sysconfig/kernel
linux:~# vi /etc/sysconfig/kernel
Ganz am Anfang ergänzen wir die Zeile
INITRD_MODULES="via82cxxx 3w_xxxx processor thermal fan reiserfs ext3 ext2 xfs sata_via sata_sil 3w_9xxx"
und fügen "raid1" an den Anfang ein:
INITRD_MODULES="raid1 via82cxxx 3w_xxxx processor thermal fan reiserfs ext3 ext2 xfs sata_via sata_sil 3w_9xxx"
Je nach Suse-Version kann diese Zeile auch anders aussehen.
Nun müssen wir lediglich das Boot-Image neu schreiben:
linux:~# mkinitrd
Dazu ergänzen wir die /etc/mkinitrd/modules
linux:~# vi /etc/mkinitrd/modules
In den Abschnitt Filesystems fügen wir am Anfang raid1 ein.
Aus
# Filesystems ext2 ext3 xfs reiserfs
wird
# Filesystems raid1 ext2 ext3 xfs reiserfs
Nun müssen wir lediglich das Image neu schreiben. Bei Debian müssen wir dabei die Kernel-Version angeben. Dazu schauen wir in den Ordner /boot:
linux:~# ls /boot/initrd*
und sehen in etwa folgendes
/boot/initrd.img /boot/initrd.img-2.6.8-3-k7
Die Versionsnummer ist in unserem Fall daher 2.6.8-3-k7
Der Aufruf lautet wie folgt:
linux:~# mkinitrd -o /boot/initrd.img-2.6.8-3-k7 2.6.8-3-k7
Hinweis: Die Nummer muss also zwei mal ersetzt werden.
Dazu ergänzen wir die /etc/mkinitramfs/modules
linux:~# vi /etc/mkinitramfs/modules
In den Abschnitt Filesystems fügen wir am Anfang raid1 ein.
Aus
# Filesystems ext2 ext3 xfs reiserfs
wird
# Filesystems raid1 ext2 ext3 xfs reiserfs
Nun müssen wir lediglich das Image neu schreiben. Bei Ubuntu müssen wir dabei die Kernel-Version angeben. Dazu schauen wir in den Ordner /boot:
linux:~# ls /boot/initrd*
und sehen in etwa folgendes
/boot/initrd.img /boot/initrd.img-2.6.8-3-k7
Die Versionsnummer ist in unserem Fall daher 2.6.8-3-k7
Der Aufruf lautet wie folgt:
linux:~# mkinitramfs -o /boot/initrd.img-2.6.8-3-k7 2.6.8-3-k7
Hinweis: Die Nummer muss also zwei mal ersetzt werden.
Nun müssen wir noch den Bootloader lilo so konfigurieren, dass auch wirklich vom RAID gebootet wird.
linux:~# vi /etc/lilo.conf
Aus
boot = /dev/sda
wird
boot = /dev/md0
und dahinter fügen wir in einer neuen Zeile ein:
raid-extra-boot="/dev/sda,/dev/sdb"
Dann lassen wir lilo den Bootblock neu schreiben:
linux:~# lilo
Nun wird Ihr System in Zukunft vom Raid geladen. Die Bootinformationen sind auf beiden Platten drauf. Wenn also eine Platte ausfällt, kann das System problemlos gebootet werden.
Die mdadm.conf ist für die Zuordnung der RAIDs und die Überwachung zuständig. Wir können diese Conf-Datei halbautomatisch generieren lassen. Für Suse liegt sie in /etc/mdadm.conf, bei Debian liegt sie in /etc/mdadm/mdadm.conf
linux:~# vi /etc/mdadm.conf
Nur eine Zeile sollte enthalten sein:
DEVICE /dev/sda* /dev/sdb*
Dann Ausführen des Befehls:
linux:~# mdadm --detail --scan >> /etc/mdadm.conf
Um im Fehlerfall per E-Mail benachrichtigt zu werde, müssen wir nun noch ans Ende der Datei eine Zeile einfügen:
linux:~# vi /etc/mdadm.conf
und ans Ende:
MAILADDR meine@emailadresse.de
linux:~# vi /etc/mdadm/mdadm.conf
Nur eine Zeile sollte enthalten sein:
DEVICE /dev/sda* /dev/sdb*
Dann Ausführen des Befehls:
linux:~# mdadm --detail --scan >> /etc/mdadm/mdadm.conf
Um im Fehlerfall per E-Mail benachrichtigt zu werde, müssen wir nun noch ans Ende der Datei eine Zeile einfügen:
linux:~# vi /etc/mdadm/mdadm.conf
und ans Ende:
MAILADDR meine@emailadresse.de
Das sollte es bereits gewesen sein. Wir sind fertig.
Wenn alles erledigt ist, das System neu starten:
linux:~# reboot
Nun sollte das System neu starten und Linux mit RAID1 starten.
Wenn das System sauber hochgefahren ist, können Sie sich nun als root mit dem Passwort der letzten Rettungskonsole anmelden.
Wir haben lange verschiedene Wege ausprobiert und dabei einige praktische Dinge kennengelernt.
linux:~# rsync -auHxv <QUELLE> <ZIEL>
Diese Möglichkeit kann verwendet werden, wenn noch frühere Dateisysteme oder Raids von mdadm erkannt werden und man "auf Nummer sicher " gehen möchte.
linux:~# fdisk -l /dev/sd<x>
linux:~# dd if=/dev/zero of=/dev/sd<x> bs=10240
Hinweis: Dauert wirklich lange :)
Damit wird die Partitionstabelle der Festplatte <x> überschrieben.
linux:~# dd if=/dev/zero of=/dev/sd<x> count=1
linux:~# sfdisk -d /dev/sd<x> > /tmp/parttable.tmp
linux:~# sfdisk /dev/sd<x> < /tmp/parttable.tmp
Wenn noch keine mdadm.conf-Datei existiert (wie in der Rettungskonsole) werden mit mdadm -A bestehende Arrays gestartet.
linux:~# mdadm -A -a /dev/md<x> /dev/sda<x> /dev/sdb<x>
Alle existierenden Raids können mit mdrun zusammen gestartet werden:
linux:~# mdrun
Wenn die Datei mdadm.conf nicht existiert, werden Raids u.U. mit falschen Nummern versehen.
linux:~# mdadm --stop /dev/md<x>
linux:~# mdadm -f /dev/md<x> /dev/sd<x><y>
linux:~# mdadm -r /dev/md<x> /dev/sd<x><y>
Ggf. vorher Platte als defekt kennzeichnen.
linux:~# mdadm -a /dev/md<x> /dev/sd<x><y>
Die Platte wird sofort gegen das bestehende RAID synchronisiert, die Daten also gelöscht.
Hier einige nützliche kleine Mini-Howtos. Die Angaben beziehen sich immer auf die o.g. Konfiguration und Partitionierung.
- Rettungssystem booten
- Raids starten:
rescue:~# mdrun
- Alternativ: Raid bilden mit mdadm -A:
Wenn mdrun fehlschlägt, können die Raids auch per Hand gestartet werden:
rescue:~# mdadm -A -a /dev/md0 /dev/sda1 /dev/sdb1 rescue:~# mdadm -A -a /dev/md1 /dev/sda2 /dev/sdb2 rescue:~# mdadm -A -a /dev/md2 /dev/sda3 /dev/sdb3 rescue:~# mdadm -A -a /dev/md3 /dev/sda5 /dev/sdb5 rescue:~# mdadm -A -a /dev/md4 /dev/sda6 /dev/sdb6 rescue:~# mdadm -A -a /dev/md4 /dev/sda6 /dev/sdb6
- mount ROOT-Partition nach /mnt
rescue:~# mount /dev/md3 /mnt
- Systembereiche mounten
rescue:~# mount --bind /dev /mnt/dev/
rescue:~# mount --bind /proc /mnt/proc/
rescue:~# mount --bind /sys /mnt/sys/
- Chrooten der Root-Partition:
rescue:~# chroot /mnt /bin/bash
- Restliche Raids und Platten mounten
rescue:~# mount -a
- /proc remounten
rescue:~# umount /proc rescue:~# mount -tproc none /proc
Es ist kein chroot notwendig, um lilo im Rettungssystem auszuführen:
- Rettungssystem booten
- Raids starten:
rescue:~# mdrun
- mount ROOT-Partition nach /mnt
rescue:~# mount /dev/md3 /mnt
- Systembereiche mounten
rescue:~# mount --bind /dev /mnt/dev/
rescue:~# mount --bind /proc /mnt/proc/
rescue:~# mount --bind /sys /mnt/sys/
- /boot mounten
rescue:~# mount /dev/md0 /mnt/boot
- Ggf. editieren von lilo.conf
rescue:~# vi /mnt/etc/lilo.conf
- Lilo ausführen und Bootloader schreiben
rescue:~# lilo -r /mnt
Zum Einhängen einer neuen Platte ist nicht unbedingt ein Rettungssystem notwendig. Wenn jedoch eine hohe Last auf dem System liegt, spricht dies dafür, solche Arbeiten im Rettungssystem durchzuführen. Wenn der Server schnell wieder online sein soll, kann es auch im laufenden Betrieb passieren.
Achtung: Wenn eine Partition erst einmal eingehängt ist, sollte auf jeden Fall das Synchronisieren vollständig abgewartet werden. Andernfalls kann es nach einem Neustart vorkommen, dass die unvollständige Partition gegen die vollständige Partition synchronisiert - und dabei alle noch nicht synchronisierten Daten löscht...
- Rettungssystem booten
- Partitionstabellen auf neue Platte kopieren (siehe hier)
- Raid bilden mit missing, wobei die neu zu integrierende Platte durch "missing" ersetzt wird:
rescue:~# mdadm -Cv /dev/md<x> -l1 -n2 missing /dev/sd<x><y>
- Neue Platte hotadden
rescue:~# mdadm -a /dev/md<x> /dev/sd<x><y>
- warten. WIRKLICH warten bis gesynct. (siehe RAIDs kontrollieren)
- Nun das Raid auflösen und alle Raids neu bilden
rescue:~# mdadm --stop /dev/md<x>
rescue:~# mdrun
- mount ROOT-Partition nach /mnt
rescue:~# mount /dev/md3 /mnt
- Systembereiche mounten
rescue:~# mount --bind /dev /mnt/dev/
rescue:~# mount --bind /proc /mnt/proc/
rescue:~# mount --bind /sys /mnt/sys/
- /boot mounten
rescue:~# mount /dev/md0 /mnt/boot
- Neuschreiben des Bootloaders
rescue:~# lilo r /mnt
- System neu starten
rescue:~# reboot
Das Raid sollte nach dem Systemboot geladen sein, jedoch nur mit einer Platte.
- Partitionstabellen auf neue Platte kopieren (siehe hier)
- Neue Platte hotadden
rescue:~# mdadm -a /dev/md<x> /dev/sd<x><y>
- warten. WIRKLICH warten bis gesynct. (siehe RAIDs kontrollieren)
- Neuschreiben des Bootloaders
rescue:~# lilo r /mnt
Im Folgenden Kommentare und Anwendungsberichte.
Debian-3.1-64Bit Minimalsystem:
Dank an die beiden guten Howtos von Andre Holzer und Transtronics. Vielen Dank an Florian Wicke für das Script installimage und die Pflege der Distributions-Images. Und natürlich Hetzner und vielen Forum-Schreibern. Praktisch sind übrigens die ERIC-II- und LARA-Konsolen von Hetzner. Vielen Dank für die Wochenend-Nutzung von LARA!
Dank an die Forenbeiträge und E-Mails von Peeper, Squaregarden, gummibaerchen, trx, ridcully, crush, Stephan Lichtenhagen
Erstellt 30.07.2006 von Jan Kellermann (jan.kellermann --at_ werk21.de) und Carsten Mehle (mail --at_ cmehle.de)
Ergänzt 11.08.2006: Redaktionell und "Löschen der Partitionstabelle" (Thx @Florian Wicke again)
Ergänzt 14.08.2006: Einfügen von linux:~# mount --bind /sys /mnt/sys/ in 4.2, 6.1, 6.2 und 6.3
Ergänzt 14.09.2006: Ausgestest mit Ubuntu (Danke an Martin Turba und crush). Abschnitt 4.2.1 um Ubuntu ergänzt.
Ergänzt 19.09.2006: E-Mail-Benachrichtigung in 4.2.3