2.3. Software-RAID

Software-RAID dient zur besseren Sicherheit der Daten auf dem Server. RAID kann in verschiedenen Modi betrieben werden. Der Modus, der weiter unten eingerichtet wird, heißt RAID-1. Dabei befinden sich im Server zwei Festplatten annähernd gleicher Kapazität. Der Software-RAID-Treiber von Linux sorgt dann dafür, dass sich auf beiden Festplatten exakt der gleiche Inhalt befindet. Die Festplatten werden sozusagen gespiegelt. Fällt eine Festplatte aus, so ist die andere immer noch voll funktionsfähig.

Die Anleitung weiter unten beschreibt, wie ein vorhandenes Linux-System nachträglich in ein RAID-1-System umgewandelt werden kann. Bei modernen Linux-Distributionen kann man möglicherweise schon bei der Installation Software-RAID einrichten; dann kann dieser Abschnitt komplett übersprungen werden.

2.3.1. Voraussetzungen

Um Software-RAID einzurichten, werden zunächst einmal die raidtools in der Version 0.9 oder höher benötigt; ob die raidtools bereits installiert sind, lässt sich mit mkraid -V herausfinden. Das passende Debian-Paket zum Nachinstallieren heißt "raidtools2". Dann muss sehr wahrscheinlich noch ein neuer Kernel der Version 2.4.x gemacht werden; dieser Vorgang ist genauer in Abschnitt 2.2, „Kernel machen“ beschrieben.

Natürlich werden auch zwei Festplatten benötigt, die ungefähr die gleiche Größe haben sollten. Diese sind - sofern IDE-Festplatten - idealerweise jeweils als Master angeschlossen und als /dev/hda und /dev/hdc ansprechbar.

Die Ausgangssituation ist folgende: Auf der ersten Festplatte (/dev/hda) ist bereits ein Linux-System installiert. Dabei ist es nicht wichtig, dass es konfiguriert ist, denn das lässt sich später noch genau so gut konfigurieren. Es ist sogar eher noch besser, wenn Software-RAID vor der eigentlichen Konfiguration des Systems eingerichtet wird. Die Anleitung bezieht sich auf die Linux-Installation, die weiter oben beschrieben ist.

2.3.2. Schritt für Schritt-Anleitung

Alle folgenden Schritte werden als Superuser (root) durchgeführt.

  1. Zuerst muss ein frischer Kernel gemacht werden. Dabei sind folgende Einstellungen zu machen:

    "Multi-device support (RAID and LVM)"
    [y] Multiple devices driver support (RAID and LVM)
    [y] RAID support
    [y] RAID-1 (mirroring) mode

    Wichtig ist hier, dass der RAID-Treiber fest im Kernel ist und keine Module erstellt werden. Eine genaue Anleitung für die Erstellung und Installation des neuen Kernels ist in Abschnitt 2.2, „Kernel machen“ beschrieben.

  2. Jetzt muss der neue Kernel getestet werden, d.h. es muss mit dem neuen Kernel gebootet werden. Wenn alles soweit funktioniert hat, kann mit dem nächsten Schritt weitergemacht werden. Übrigens: Der Kernel kann auch später nochmal aktualisiert werden; spezielle Hardware kann also später eingerichtet werden.

  3. Nach dem Neustart kann mit cat /proc/mdstat überprüft werden, ob der neue Kernel auch tatsächlich RAID unterstützt. Dabei sollte in der ersten Zeile folgendes erscheinen:

    Personalities : [raid1]

  4. Als nächstes muss die zweite Festplatte so wie die erste Festplatte partitioniert werden. Dabei dürfen die Partitionen auf der zweiten Festplatte auf keinen Fall größer sein als die Partitionen auf der ersten Festplatte. Sie müssen entweder gleich groß oder kleiner sein.

    Die Partitionierung kann z.B. mit dem Programm cfdisk vorgenommen werden. Am besten speichert man die Partitionstabelle der ersten Festplatte mit cfdisk -P t /dev/hda > hda-table in die Datei hda-table. Das sieht dann so aus:

    Partition Table for /dev/hda
    
    ---Starting---       ----Ending----    Start Number of
    # Flags Head Sect Cyl   ID  Head Sect Cyl    Sector   Sectors
    -- ----- ---- ---- ---- ---- ---- ---- ---- --------- ---------
    1 0x80     1    1    0 0x83   15   63 1023        63 135742257
    2 0x00    15   63 1023 0x83   15   63 1023 135742320  19531008
    3 0x00    15   63 1023 0x82   15   63 1023 155273328   1028160
    4 0x00     0    0    0 0x00    0    0    0         0         0

    Wichtig sind die zwei letzten Spalten (Start Sector und Number of Sectors). Mit cfdisk /dev/hdc wird die zweite Festplatte partitioniert; es müssen genau die gleichen Partitionen erstellt werden. Das geht am einfachsten über die Sektor-Anzahl. Wenn das Programm nach der Größe fragt, einfach 12345S eingeben, also die Anzahl der Sektoren mit angehängtem S. Zum Schluss müssen die Partitionstabellen der beiden Festplatten nocheinmal verglichen werden, damit auch kein Fehler unterlief; also: Partitionstabelle der zweiten Festplatte wie oben in eine Datei speichern.

    Hier sollte dann auch auf der zweiten Festplatte gleich das Bootflag gesetzt werden (auf /dev/hdc1). Außerdem müssen alle Partitionen außer dem swap-Partition den Partitionstyp fd (Linux raid autodetect) haben.

  5. Jetzt muss die Konfigurationsdatei für den Software-RAID-Treiber geschrieben werden. Diese steht in /etc/raidtab. Im Moment ist dabei die erste Festplatte (/dev/hda) als fehlerhaft zu markieren.

    #
    # /etc/raidtab
    #
    
    # /dev/md0 ist die root-Partition
    raiddev                 /dev/md0
    raid-level              1               # RAID-1 (mirroring)
    nr-raid-disks           2
    nr-spare-disks          0
    persistent-superblock   1
    chunk-size              32
    
    device                  /dev/hdc1
    raid-disk               0
    # dies ist die erste Festplatte, die hier zunächst als fehlerhaft
    # markiert ist
    device                  /dev/hda1
    failed-disk             1
    
    
    # /dev/md1 ist die var-Partition
    raiddev                 /dev/md1
    raid-level              1               # RAID-1 (mirroring)
    nr-raid-disks           2
    nr-spare-disks          0
    persistent-superblock   1
    chunk-size              32
    
    device                  /dev/hdc2
    raid-disk               0
    # die erste Festplatte ist hier genauso als fehlerhaft markiert
    device                  /dev/hda2
    failed-disk             1

  6. Danach können dieraid-Geräte gemacht werden:

    bash# mkraid /dev/md0
    bash# mkraid /dev/md1

    Mit cat /proc/mdstat kann nachgeschaut werden, ob die Geräte registriert sind. Die erste Festplatte ist hier als fehlerhaft eingetragen.

  7. Anschließend können die raid-Geräte formatiert und gemountet werden. Da die erste Festplatte ja als fehlerhaft markiert ist, wird sie nicht formatiert, sondern nur die zweite Festplatte. Die Daten auf der ersten Festplatte bleiben also vorhanden.

    Das Formatieren funktioniert so:

    bash# mkreiserfs /dev/md0
    bash# mkreiserfs /dev/md1

    Für das Mounten der Dateisysteme müssen folgende Befehle ausgeführt werden:

    bash# mount /dev/md0 /mnt
    bash# mkdir /mnt/var
    bash# mount /dev/md1 /mnt/var

  8. Jetzt können die Dateien der ersten Festplatte auf die zweite Festplatte kopiert werden. Das geht ganz einfach mit folgenden Befehlen:

    bash# cd /
    bash# find . -xdev -name "*" -o -name ".*" | cpio -pmv /mnt
    bash# cd /var
    bash# find . -xdev -name "*" -o -name ".*" | cpio -pmv /mnt/var

  9. Danach muss wieder getestet werden. Wir aktualisieren dafür zuerst folgende Datei:

    #
    # /mnt/etc/fstab
    #
    
    /dev/md0    /       reiserfs    defaults    0   0
    /dev/md1    /var    reiserfs    defaults    0   0
    [...]

    Wir ersetzen also /dev/hda1 mit /dev/md0 und /dev/hda2 mit /dev/md1.

    Beim nächsten Start mit dem neu eingerichteten RAID werden so die raid-Geräte automatisch verwendet.

  10. Nun muss noch eine Bootdiskette erstellt werden. Dazu wird eine leere, formatierte und fehlerfreie Diskette benötigt. Die Diskette in Laufwerk A: einlegen und folgende Befehle ausführen:

    bash# dd if=/boot/vmlinuz-2.4.21 of=/dev/fd0 bs=18k
    bash# rdev /dev/fd0 /dev/md0
    bash# rdev -r /dev/fd0 0
    bash# rdev -R /dev/fd0 1

    Auf der so erstellten Bootdiskette ist der neue Kernel mit Software-RAID-Unterstützung (/boot/vmlinuz-2.4.21 ist das Kernel-Image). Diese Bootdiskette kann später vielleicht mal sehr wichtig werden, z.B. wenn der Server aus irgendeinem Grund nicht mehr von der Festplatte booten kann. Deshalb sollte die Bootdiskette gut aufbewahrt werden und bei jedem Kernel-Update auch aktualisiert werden.

  11. Jetzt kann der Server neu gestartet werden. Dazu müssen aber erst die raid-Geräte gestoppt werden:

    bash# umount /mnt/var
    bash# umount /mnt
    bash# raidstop /dev/md0
    bash# raidstop /dev/md1

    Wenn die Bootdiskette eingelegt wurde, kann mit shutdown -r now der Server neu gestartet werden.

  12. Nach dem Neustart muss geprüft werden, ob alle Daten auf die zweite Festplatte kopiert wurden. Wenn der Server ohne Probleme neugestartet ist, sollte dies der Fall sein. Wenn nicht, kann der Server immer noch ohne Diskette von der ersten Festplatte gestartet werden. Dann müssen wie in Punkt 7 beschrieben die raid-Geräte wieder gemountet werden, damit eventuell vergessene Dateien kopiert werden können.

  13. Wir haben von der Diskette gebootet. Jetzt muss die erste Festplatte, die im Moment ja noch als fehlerhaft markiert ist, dem raid-Array hinzugefügt werden.Dabei gehen alle Daten auf dieser Festplatte verloren!

    Als erstes müssen mit cfdisk /dev/hda die Partitionstypen der Partitionen auf der ersten Festplatte zu fd (Linux raid autodetect) geändert werden (die swap-Partition bleibt swap). Auch das Bootflag sollte nochmal frisch auf /dev/hda1 gesetzt werden.

    Dann muss in der Datei /etc/raidtab zweimal failed-disk durch raid-disk ersetzt werden.

    Und schließlich wird mit folgenden Befehlen die erste Festplatte dem raid-Array hinzugefügt:

    bash# raidhotadd /dev/md1 /dev/hda2
    bash# raidhotadd /dev/md0 /dev/hda1

    Mit cat /proc/mdstat kann der Fortschritt der Synchronisation angezeigt werden.

  14. Während der Synchronisationsvorgang noch läuft, kann das System schon bootfähig gemacht werden. Dazu muss /etc/lilo.conf editiert werden. Die Datei sieht dann so aus:

    #
    # /etc/lilo.conf
    #
    
    boot=/dev/md0
    raid-extra-boot=/dev/hda,/dev/hdc
    
    read-only
    prompt
    timeout=50
    root=/dev/md0
    
    image=/boot/vmlinuz-2.4.21
    label=Linux

    Jetzt muss noch lilo auf beiden Festplatten installiert werden. Dies geschieht einfach durch Aufruf von lilo.

  15. Schließlich muss noch die swap-Partition auf der zweiten Festplatte eingerichtet werden. Dazu muss /etc/fstab verändert werden.

    #
    # /etc/fstab
    #
    
    [...]
    /dev/hda3   none    swap    sw,pri=1    0   0
    /dev/hdc3   none    swap    sw,pri=1    0   0

    Außerdem muss die swap-Partition noch mit mkswap /dev/hdc3 formatiert werden. Beim nächsten Neustart sind dann beide swap-Partitionen aktiviert.

  16. Wenn der Synchronisationsvorgang beendet ist, kann neu gestartet werden, um die Installation zu testen.

    Falls das Booten von der Festplatte nicht funktioniert, kann immer noch auf die Bootdiskette zurückgegriffen werden.

2.3.3. Fehlerfall

Fällt einmal tatsächlich eine Festplatte aus, muss diese ersetzt werden. Im Folgenden wird angenommen, dass die erste Festplatte (/dev/hda) ausfällt. Die einzelnen Schritte sind dann wie folgt:

  1. Erst muss der Server heruntergefahren werden, wenn er noch läuft.

  2. Dann kann die defekte Festplatte ausgetauscht werden.

  3. Jetzt muss gebootet werden. Wenn der Server nicht automatisch von der zweiten (intakten) Festplatte bootet, muss eine Bootdiskette verwendet werden (siehe voriger Abschnitt, Punkt 10).

  4. Die neue Festplatte muss nun partitioniert werden. Die swap-Partition nicht vergessen: Mit mkswap /dev/hda3 die swap-Partition formatieren.

  5. Mit dem Befehl raidhotadd den Synchronisationsvorgang starten:

    bash# raidhotadd /dev/md1 /dev/hda2
    bash# raidhotadd /dev/md0 /dev/hda1

  6. Mit lilo lilo neu installieren.

  7. Nach dem Synchronisationsvorgang kann von der Festplatte neu gebootet werden.

Hinweis: Falls das BIOS nicht von der zweiten Festplatte booten kann, wird unbedingt eine Bootdiskette benötigt.