Debian etch/lenny mit 2 IDE Festplatten als Raid 1
Zunächst eine debian Basisinstallation, alle Updates sowie die Pakete mc,ssh und sudo Installieren.
Natürlich sind mc und sudo nicht notwendig, ich bevorzuge aber mcedit als Editor und bin der Meinung das man root-Rechte besser bei Bedarf mit sudo einholt.
Nun kann man sich bequem per SSH einloggen und das Softwareraid einrichten.
Hinweis: Wenn SATA Festplatten verwendet werden sind i.d.R. alle /dev/hda mit /dev/sda zu ersetzen. Das gleiche gilt natürlich auch für hdb mit sdb.
Dieses HowTo ist in großen Teilen aus folgender Quelle kopiert: http://www.howtoforge.de/howto/software-raid1-auf-einem-laufenden-system-inkl-grub-konfiguration-debian-etch-einrichten/
Ausgangssituation ist das laufende Debian etch System, mit zwei IDE Festplatten.
Auf der ersten Festplatte sind 4 Partitionen angelegt.
hda1 = /
hda2 = swap
hda3 = /home
hda4 = /var
fdisk -l
Disk /dev/hda: 41.1 GB, 41174138880 bytes 255 heads, 63 sectors/track, 5005 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/hda1 * 1 997 8008371 83 Linux /dev/hda2 998 1119 979965 82 Linux swap / Solaris /dev/hda3 1120 3794 21486937+ 83 Linux /dev/hda4 3795 5005 9727357+ 83 Linux Disk /dev/hdb: 41.1 GB, 41174138880 bytes 16 heads, 63 sectors/track, 79780 cylinders Units = cylinders of 1008 * 512 = 516096 bytes Device Boot Start End Blocks Id System
apt-get install initramfs-tools mdadm
- Frage: MD arrays needed for the root filesystem: Antwort: all
Laut oben genannter Quelle müssen nun ein paar Kernelmodule geladen werden. Dieses soll einen neustart verhindern. Dei folgenden sollten für ein raid1 genügen:
modprobe md
modprobe linear
modprobe multipath
modprobe raid1
cat /proc/mdstat
Sollte nun folgende Ausgabe bringen:
Personalities : [linear] [multipath] [raid1] unused devices: <none>
Bei zwei exakt gleichen Festplatten können nun die Partitionen mit folgendem Befehl kopiert werden:
sfdisk -d /dev/hda | sfdisk /dev/hdb
Sind die Festplatten auch nur leicht unterschiedlich wird dieses so nicht funktionieren. Für diesen Fall müssen die Partitionen auf der zweiten Disk von Hand angelegt werden. Partitionen müssen hier gleich groß oder leicht kleiner sein. Dieses ist notwendig da wir später die erste Platte dem Raid welches auf der zweiten dann schon existiert hinzufügen werden. Das kann nur funktionieren wenn die hinzugefügte gleich groß oder größer ist.
Wenn nicht schon beim Anlegen (z.B. bei ungleichen Festplatten) geschehen, so müssen nun auf der zweiten Festplatte die Partitionen in "fd = Linux raid auto" geändert werden.
Um sicher zu gehen das keinerlei alte Raid Informationen auf den Festplatten zu finden sind, müssen nun die Superblöcke gelöscht werden:
mdadm --zero-superblock /dev/hdb1
mdadm --zero-superblock /dev/hdb2
mdadm --zero-superblock /dev/hdb3
mdadm --zero-superblock /dev/hdb4
Die Ausgabe
mdadm: Unrecognised md component device - /dev/hdb1
Ist normal wenn kein Raid vorher auf diese Disk war.
Nun werden die Raid erstellt:
mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/hdb1
mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/hdb2
mdadm --create /dev/md2 --level=1 --raid-disks=2 missing /dev/hdb3
mdadm --create /dev/md3 --level=1 --raid-disks=2 missing /dev/hdb4
Der Befehl
cat /proc/mdstat
sollte nun folgendes ausgeben:
Personalities : [linear] [multipath] [raid1]
md3 : active raid1 hdb4[1]
9732672 blocks [2/1] [_U]
md2 : active raid1 hdb3[1]
21487424 blocks [2/1] [_U]
md1 : active raid1 hdb2[1]
980160 blocks [2/1] [_U]
md0 : active raid1 hdb1[1]
8008448 blocks [2/1] [_U]
unused devices: <none>
Nun werden dort Filesysteme erzeugt:
mkfs.ext3 /dev/md0
mkswap /dev/md1
mkfs.ext3 /dev/md2
mkfs.ext3 /dev/md3
Nun wird die mdadm Konfigurationsdatei erstellt:
cp /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf_orig
mdadm --examine --scan >> /etc/mdadm/mdadm.conf
Nun Mounten wir, mit Ausnahme der swap Partition, die Raid Partitionen:
mkdir /mnt/md0
mkdir /mnt/md2
mkdir /mnt/md3
mount /dev/md0 /mnt/md0
mount /dev/md2 /mnt/md2
mount /dev/md3 /mnt/md3
Nun bearbeiten wir /etc/fstab und ersetzen /dev/hda1 mit /dev/md0 usw. Diese sollte dann in etwa so aussehen:
proc /proc proc defaults 0 0 /dev/md0 / ext3 defaults,errors=remount-ro 0 1 /dev/md2 /home ext3 defaults 0 2 /dev/md3 /var ext3 noatime 0 2 /dev/md1 none swap sw 0 0 /dev/hdc /media/cdrom0 udf,iso9660 user,noauto 0 0 /dev/fd0 /media/floppy0 auto rw,user,noauto 0 0
Das gleiche nun in der /etc/mtab.
In der Datei /boot/grub/menu.lst muss nun direkt hinter dem Eintrag "default 0" eine Zeile mit "fallback 1" eingetragen werden. Dann noch die erste der Kernel Zeilen kopieren, an erste Stelle setzen und Editieren:
title Debian GNU/Linux, kernel 2.6.18-6-686 Raid (hd1) root (hd1,0) kernel /boot/vmlinuz-2.6.18-6-686 root=/dev/md0 ro initrd /boot/initrd.img-2.6.18-6-686 savedefault
Hier wurde hda1 mit md0 und hd0,0 mit hd1,0 ersetzt.
Die ramdisk wird nun der Situation angepasst:
update-initramfs -u
Nun kopieren wir die Inhalte der Partitionen:
cd /
cp -dpRx . /mnt/md0
cd /home
cp -dpRx . /mnt/md2
cd /var
cp -dpRx . /mnt/md3
Nun starten wir mit dem Befehl "grub" die Grub-Shell um den Bootloader auf hdb zu installieren: In dieser Shell dann folgende Befehle nacheinander eingeben:
root (hd0,0)
setup (hd0)
root (hd1,0)
setup (hd1)
quit
Nun sollte der Rechner von diesem noch "defektem" Raid hochfahren.
Daher "reboot"
Nach dem Neustart sollte "df -h" anzeigen das der Rechner nun vom Raid gebootet wurde.
Nun werden auch die Partitionen der ersten Fetplatte zu "fd = Linux raid auto" verändert.
Danach werden sie Partitionen der ersten Platte dem raid hinzugefühgt:
mdadm --add /dev/md0 /dev/hda1
mdadm --add /dev/md1 /dev/hda2
mdadm --add /dev/md2 /dev/hda3
mdadm --add /dev/md3 /dev/hda4
Hier noch einmal der Hinweis: Wenn die Partitionen auf der zweiten Platte nicht kleiner oder absolut gleich zu denen auf der ersten Platte ist kein Raid möglich sein! Es zählt was "cat /proc/partitions" ausgibt.
Wenn alles glatt läuft sollte
cat /proc/mdstat
nun in etwa folgendes ausgeben:
Personalities : [raid1]
md3 : active raid1 hda4[2] hdb4[1]
9277568 blocks [2/1] [_U]
resync=DELAYED
md2 : active raid1 hda3[2] hdb3[1]
20996544 blocks [2/1] [_U]
resync=DELAYED
md1 : active raid1 hda2[2] hdb2[1]
928256 blocks [2/1] [_U]
resync=DELAYED
md0 : active raid1 hda1[2] hdb1[1]
7910656 blocks [2/1] [_U]
[=============>.......] recovery = 67.7% (5362368/7910656) finish=1.3min speed=32343K/sec
unused devices: <none>
Nun müssen wir warten bis die Platten Synchronisiert sind. Man kann diesen Vorgang dazu mit "watch cat /proc/mdstat" beobachten.
Erneut muss nun die Konfig-Datei von mdadm angepasst werden:
cp /etc/mdadm/mdadm.conf_orig /etc/mdadm/mdadm.conf
mdadm --examine --scan >> /etc/mdadm/mdadm.conf
Noch einmal muss nun die Datei /boot/grub/menu.lst bearbeitet werden. Wir kopieren hier nun die erste Kernelzeile mit dem Raid (hd1,0) und ändern hd1,0 in hd0,0 ab. Alle anderen Kernelzeilen können entfernt, bzw. auskommentiert werden.
Zudem muss nun das vorkommen von "# kopt=root=/dev/hda1 ro" abgeändert werden. Ersetzen Sie hier hda1 durch md0, das Route Zeichen muss stehen bleiben.
Nun muss die Ramdisk noch einmal aktualisiert werden:
update-initramfs -u
Fertig, durch ein reboot kann nun das System neu gestartet werden.
Anhang:
Um das Raid zu überwachen sollte man einen regelmäßigen cronjob laufen haben. Hier ein Beispiel:
10 1 * * * /sbin/mdadm --monitor --scan -1 --mail=martin@meinemail.tld
Tipp: um den Job zu Testen kann man ein Testereignis generieren. Hierzu nur "-t" ans Ende der Befehlszeile anhängen.
Ausfall einer Disk:
1. Disk tauschen und Booten.
2. Partitionstabelle kopieren.
sfdisk -d /dev/hdb | sfdisk --force /dev/hda
3. Superblöcke der neuen Platte löschen (für alle Partitionen)
mdadm --zero-superblock /dev/hda1
4. Neue Disk Partition für Partition hinzufühgen:
mdadm -a /dev/md0 /dev/hda1
5. Rebuilt beobachten
cat /proc/mdstat
6. Grub neu schreiben:
root (hd0,0)
setup (hd0)
root (hd1,0)
setup (hd1)
quit
Mögliche Probleme:
mdadm: add new device failed for /dev/hda1 as 2: No space left on device
Hier wird beanstandet das hda1 kleiner ist als die zu spiegelnde Partition. Sicher haben Sie aber aufgepasst und immer etwas mehr spendiert. Klarheit verschafft
cat /proc/partitions
major minor #blocks name 3 0 40209120 hda 3 1 8008371 hda1 3 2 979965 hda2 3 3 21486937 hda3 3 4 9727357 hda4 3 64 40209120 hdb 3 65 8008528 hdb1 3 66 980280 hdb2 3 67 21487536 hdb3 3 68 9732744 hdb4 9 0 8008448 md0 9 1 980160 md1 9 2 21487424 md2 9 3 9732672 md3
Hier ist zu sehen das hda1 = 8008371 kleiner ist als hdb1 = 8008528 ! Auch md0 = 8008448 ist größer, das einbinden muss daher fehlschlagen.
Ind iesem Beipsiel aber Zeigt fdisk etwas anderes an:
fdisk -l Disk /dev/hda: 41.1 GB, 41174138880 bytes 16 heads, 63 sectors/track, 79780 cylinders Units = cylinders of 1008 * 512 = 516096 bytes Device Boot Start End Blocks Id System /dev/hda1 * 1 15890 8008528+ fd Linux raid autodetect /dev/hda2 15891 17835 980280 fd Linux raid autodetect /dev/hda3 17836 60469 21487536 fd Linux raid autodetect /dev/hda4 60470 79780 9732744 fd Linux raid autodetect Disk /dev/hdb: 41.1 GB, 41174138880 bytes 16 heads, 63 sectors/track, 79780 cylinders Units = cylinders of 1008 * 512 = 516096 bytes Device Boot Start End Blocks Id System /dev/hdb1 * 1 15890 8008528+ fd Linux raid autodetect /dev/hdb2 15891 17835 980280 fd Linux raid autodetect /dev/hdb3 17836 60469 21487536 fd Linux raid autodetect /dev/hdb4 60470 79780 9732744 fd Linux raid autodetect
Die partiion scheint gleich. Da am Ende nur die Werte in /proc/partitions zählen, muss hier nachgearbeitet werden.
