Software root RAID1

aus PUG, der Penguin User Group
Wechseln zu: Navigation, Suche

Linux IDE root RAID1

Da die Dokumentation von Software RAID unter Linux einige Probleme verursachen kann, habe ich mich da zu durchgerungen, für den häufigsten Fall der RAID1 Konfiguration, eine weitere Dokumentation zu schreiben. Ich beschreibe hier die Installation mit Slackware. Wie das an andere Distributionen angepaÿt wird, entnimmst du am besten aus den Manpages der benutzen Programme und dem "Boot + Root + Raid + Lilo: Software Raid HOWTO"

ftp://ftp.bizsystems.net/pub/raid/Boot+Root+Raid+LILO.html


Hardware

An jedem IDE Kanal ist wegen der Performance nur eine Festplatte angeschlossen. /dev/hda und /dev/hdc Das CDROM Laufwerk habe ich zur Installation vorübergehend an /dev/hdd angeschlossen und nach der Installation wieder entfernt.

Booten

Boote den PC mit einer Linux Distribution die einen Kernel mit Raid1 Unterstützung benutzt. Raidtools sollten auch dabei sein! Ich habe Slackware 8.1 mit dem 2.4.18 Kernel benutzt. Prinzipiell lässt sich aber jede Distribution benutzen, die die RAID Unterstützung im Kernel, und die RAID Tools im Pre-Installations Dateisystem haben. Wie du diese Anleitung auf low-knowledge Distributionen wie SUSE oder RedHat umsetzts, musst du selbst herraus finden. Mein Ansatz umgeht die Möglichkeiten der Installation Prozeduren von SUSE und RedHat und ist sehr gut für eine "Linux from Scratch " oder eine transparente Installation wie die von Slackware gedacht.


Partitionen

Lösche mit fdisk die Partitionstabelle von /dev/hda und /dev/hdc. Partitioniere die Platte /dev/hda als würdest du eine normale Linux Installation vorbereiten. Ich habe mein /dev/hda in 4 Teile aufgeteilt. Diese Konfiguration ist für einen WWW + Mailserver ausgelegt.

  • /dev/hda1 4000mb für / "typ FD / Linux RAID autodetect"
  • /dev/hda2 256mb für swap "typ FD / Linux RAID autodetect"
  • /dev/hda3 10000mb für /var "typ FD / Linux RAID autodetect"
  • /dev/hda4 45000mb für /home "typ FD / Linux RAID autodetect"

Partitioniere /dev/hdc exact so wie /dev/hda. Auch die Swap Partition kann man als Raid1 ausführen. Von Raid5/6 für Swap kann ich aus Performancegründen nur abraten.

RAID Konfiguration

Hier wird jeweils die Partition 1 von hda und hdc zu einem Raid1 zusammengefasst. Auf /dev/md0 wird dann das Filesystem angelegt.

mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/hd[ac]1

Den Zustand des Raids kann man mit

mdadm --query --detail /dev/md0

abfragen:

/dev/md0:
        Version : 00.90.03
  Creation Time : Mon Feb 13 08:08:42 2006
     Raid Level : raid1
     Array Size : 256896 (250.88 MiB 263.06 MB)
    Device Size : 256896 (250.88 MiB 263.06 MB)
   Raid Devices : 2
  Total Devices : 2
Preferred Minor : 0
    Persistence : Superblock is persistent

    Update Time : Tue Oct 10 15:17:37 2006
          State : clean
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

           UUID : f25c635b:3fa602ce:e5670422:8f865f0b
         Events : 0.1225988

    Number   Major   Minor   RaidDevice State
       0       8        1        0      active sync   /dev/hda1
       1       8       17        1      active sync   /dev/hdc1

Hier kann man also sehen, dass /dev/hda1 und /dev/hdc1 das Raid bilden und dass wir es mit einem Raid1 zu tun haben. State: clean verrät uns, dass das Array keine Fehler aufweist und die Komponenten syncronisiert sind.

Eine Platte geht kaputt

Das ist ja eigentlich der Grund, warum wir ein Raid benutzen. Nur sollte man dann wissen, was zu tun ist. Hier das Rezept:

mdadm /dev/md0 --fail /dev/hdc1 --remove /dev/hdc1

Damit wird das Device zunächst mit Gewalt auf failed gesetzt, was sinnvoll ist, wenn es sporadisch zwar Errors gibt, man aber die Platte vorsichtshalber schon ersetzen will. Ein remove geht nur, wenn die betreffende Platte im Status failed ist, oder nicht aktiv ist. Nun kann man die Platte einfach ersetzen, da sie nicht mehr Teil des Raid Verbundes ist. Diese Aktion muss für alle Raid Devices durchgeführt werden, die Partitionen dieser Platte benutzen. Die neue Platte muss nun mit fdisk partitioniert werden und zwar so, dass jede Partition mindestens genauso groÿ ist, wie auf der alten Platte. Nun wird die Platte wieder in den Verbund aufgenommen:

mdadm /dev/md0 --add /dev/hdc1

Nun sollte die Synchronisation starten, was man mit der Statusprüfung (s.o.) testen kann.

Installation

Nun da der Spiegel einwandfrei funktioniert kann man das System neu starten und zum Beispiel seine Lieblings-Distribution installieren. Die Vorraussetzung dafür ist allerdings, das der BootCD Kernel mit RAID1 Unterstüzung kompiliert wurde. Dies ist aber bei den meinsten Distributionen der Fall. Zu beachten ist, das nun nicht die bekannten Devices /dev/hda usw benutzt werden, sonder man /dev/md0 usw als Zieldateisystem angibt. Partitionieren müsst ihr /dev/md0, 1 und 2 natürlich nicht mehr. Allerdings sollte noch ein Dateisystem erzeugt werden. Formatiert am besten mit Ext2 oder XFS oder einem anderen Filesystem.

Seit Debian 3.1 kann man auch direkt mit dem Debian Installer Raid Partitionen erzeugen und darauf installieren.

Reduntantes booten

Lilo

Dann muss noch lilo.conf erstellt werden, da wir ja auch Bootredundanz wollen, kommt auf jede Platte einen entsprechender Bootrecord. Ich benutze kein Grub, da ich nicht weiss, ob Grub gespiegelte Bootrecords unterstüzt. Lilo ist definiv dafür ausgelegt und läuft einwandfrei.

lilo.conf

lba32
disk=/dev/hda bios=0x80
disk=/dev/hdc bios=0x82
raid-extra-boot="/dev/hda,/dev/hdc"
boot=/dev/md0
root=/dev/md0
read-only
image=/boot/vmlinuz
label=LinuxRAID


"lilo /etc/lilo.conf" erzeug den Bootrecord

Grub

Da sind eigentlich nur die menu.conf und die device.map wichtig:

In der menu.conf müssen insbesondere der root Eintrag zum Eintrag in der device.map passen und als Kernelparameter das passende md Device angegeben sein:

title           Debian GNU/Linux, kernel 2.6.18
root            (hd0,1)
kernel          /boot/vmlinuz-2.6.18 root=/dev/md1 ro vga=0x314 selinux=0 splash=silent console=tty0 showopts console=ttyS0,115200n81 panic=15
savedefault
boot

Die device.map besagt eigentlich nur, welches Grub Device zu welchem physiklischen Device gehört:

(hd0)   /dev/hda
(hd1)   /dev/hdc