Softwareraid-Linux Während Hardwarecontroller ganze Festplatten zu einem Raidverbund zusammenfassen, werden mit einem Softwareraid Partitionen verschiedener Festplatten zu einem Verbund zusammengefasst. Daten außerhalb der Raidpartitionen, z.b. der MBR, werden bei einem Softwareraid nicht erfasst und müssen manuell auf die verschiedenen Festplatten verteilt werden. RAID-1 (>=2 Platten): Keine optimale Wirtschaftlichkeit bezüglich des Verhältnis von Daten und Redundanz. Langsames schreiben, aber schnelles lesen. RAID-5 (>=3 Platten): Besseres Verhältnis der Datenredundanz. Der MBR Normaler Weise enthält der MBR einen Urloader, der nach einer bootbaren Partition sucht und dann den im Bootsektor der Partition gespeicherten Bootloader startet. Wird der Bootloader jedoch im MBR gespeichert, wird dieser überschrieben. Da Grub zum booten auch mehrere Dateien benötigt, ist ein RAID-5 zum booten nicht geeignet, da sämtliche Dateien über mehrere Laufwerke verstreut sind. Dieses Problem lässt sich lösen, indem eigenständige Bootpartitionen im RAID-1 auf den Festplatten angelegt werden. Diese Partitionen sollten am Anfag der Festplatte angelegt werden! Dahinter werden dann die RAID-5 Partitionen angelegt. Der Raidsuperblock Während des Bootvorgangs sucht der Kernel auf allen angeschlossenen Platten nach diesen Raid-Superblöcken. Mit den darin enthaltenen Informationen und dem Partitionstyp»0xfd - Linux raid autodetect«kann das System die entsprechenden Multiple Devices anschließend automatisch mounten. Der 4 KByte große Datenblock liegt am Beginn des letzten geraden 64-KByte-Blocks jeder Multiple-Device-Partition, es gehen also maximal 128 KByte der gesamten Kapazität einer Partition für den Superblock verloren. Zur Anzeige des Superblocks kann folgender Befehl verwendet werden: mdadm --examine /dev/sda1 01 /dev/hda1: 02 Magic : a92b4efc 03 Version : 00.90.00 04 UUID : 243e03bb:e3a486c3:ebf23ec9:fc518e36 05 Creation Time : Fri May 9 17:17:28 2003 06 Raid Level : raid1 07 Device Size : 200704 (196.00 MiB 205.52 MB) 08 Raid Devices : 3 09 Total Devices : 4 10 Preferred Minor : 0 11 12 Update Time : Fri May 9 21:57:15 2003 13 State : dirty, no-errors 14 Active Devices : 3 15 Working Devices : 3 16 Failed Devices : 1 17 Spare Devices : 0 18 Checksum : 16cd8686 - correct 19 Events : 0.25 20 21 Number Major Minor RaidDevice State 22 this 0 3 1 0 active sync /dev/sda1 23 0 0 3 1 0 active sync /dev/sda1 24 1 1 3 65 1 active sync /dev/sdb1 Die genaue Position, in diesem Fall 200704 KByte, wird unter anderem beim Booten ausgegeben oder ist über den Raid- Superblock selbst zu ermitteln. Gelöscht werden kann der Raidsuperblock mittels: mdadm - zero-superblock /dev/sda1 oder mit Angabe der Position des Superblocks (hier im Beispiel Device Size: 200704) dd if=/dev/zero of=/dev/sda1 bs=1 seek=200704 count=4 Wird der Superblock ausversehen gelöscht, gehen die Daten normaler Weise nicht verloren, wenn man das Array wieder herstellt mdadm C /dev/md0 l1 n2 /dev/sda missing
Raid auf einem neuem System erstellen 1. Partition erstellen a.. fdisk /dev/sda => erstellen b. Raidpartitionstyp mit fdisk zuweisen: Typ fd 2. Raid erstellen a. beide Platten vorhanden mdadm -C --verbose /dev/md1 -l1 -n2 /dev/sda1 /dev/sdb1 b. Erst die eine vorhandene und später die andere eingehängt mdadm -C --verbose /dev/md1 -l1 -n2 /dev/sda1 missing Das hat den großen Vorteil, dass man das Raid inklusive Neustart testen kann, bevor das stundenlange Synchronisieren der Platten beginnt. mdadm /dev/md1 --add /dev/sdb1 3. Dateisystem erstellen Das Dateisystem auf der Raidpartition eines aktiven Raids und nicht auf der Festplattenpartition oder einer inaktiven Raidpartition erstellen, z.b. mke2fs j /dev/md0. Ansonsten kommt es wegen der Raidsuperblockbelegung bei der Dateisystemprüfung durch e2fsck zu folgendem Fehler: The filesystem size (according to the superblock) is 2104483 blocks. The physical size of the device is 2104384 blocks. Either the superblock or the partition table is likely to be corrupt. E2fsck kennt den Raidsuperblock nicht und prüft dann über den gültigen Bereich hinaus. Eine vorübergehende Hilfe ist das auskommentieren der Prüfung in der /etc/fstab bis zur Reparatur: /dev/md0 /usr ext2 defaults 1 0 0 = Keine Prüfung 4. Partition übertragen sfdisk -d /dev/sda sfdisk /dev/sdb andere Möglichkeiten sind das Sichern in eine Datei und das auslesen dieser #sfdisk -d /dev/sda > partitionen.raid #sfdisk /dev/sdb < partitionen.raid 5. Konfigurationsdatei für mdadm erstellen mdadm --detail --scan >> /etc/mdadm.conf 6. Raidstatus beobachten (kein Neustart solange der Prozess noch aktiv ist!) cat /proc/mdstat watch -n1 'cat /proc/mdstat' Das kann mehrere Stunden dauern! 6. Die Datei /etc/fstab anpassen Alle Verweise von sdx bzw. hdx auf mdx anpassen 7. Bootloader Installation im MBR Auf beiden Platten identisch installieren, damit beim Ausfall auch von der zweiten gebootet werden kann (daher immer hd0!) -- Grubschell öffnen grub --no-floppy grub> -- vorhandene Platten anzeigen lassen grub> find /boot/grub/stage1 (hd0,0) (hd1,0) -- auf erster Platte installieren device (hd0) /dev/sda root (hd0,0)
setup (hd0) - auf zweiter Platte installieren device (hd0) /dev/sdb root (hd0,0) setup (hd0) quit Installation im Bootsektor Ein dort abgelegter Bootloader würde über alle Platte repliziert werden. -- Raid der Bootpartition anhalten mdadm stop /dev/md0 -- Grub in Bootpartition der ersten Platte installieren grub no-floppy root (hd0,0) setup (hd0,0) quit -- Wiederherstellen des Urloaders testdisk Mit testdisk auf allen Festplatten die Boot-Partitionen auswählen (Typ Intel) und den MBR-Code auf den ersten Sektor schreiben lassen. Die Partitionen müssen natürlich noch als aktiv gekennzeichnet werden. Danach das betroffene Raid wieder starten und übertragen lassen: mdadm -A /dev/md0 /dev/sda1 run mdadm /dev/md0 -add /dev/sdb1 8. Grubkonfiguration anpassen /boot/grub/grub.conf bzw. menu.lst Alle Deviceparameter, die auf /dev/hdx oder /dev/sdx verweisen, auf /dev/mdx anpassen 9. Beispiel für /etc/mdadm.conf DEVICES partitions ARRAY /dev/md1 level=raid1 num-devices=2 UUID=a93d4b2a:495e3373:039bf786:a83ac0c4 devices=/dev/sda1,/dev/sdb1 ARRAY /dev/md2 level=raid1 num-devices=2 UUID=d5cd6d47:923642ea:5519cf4b:3fae2999 devices=/dev/sda2,/dev/sdb2 ARRAY /dev/md3 level=raid1 num-devices=2 UUID=ae78c5e6:d025079f:bfd0325a:bb07b588 devices=/dev/sda3,/dev/sdb3 ARRAY /dev/md4 level=raid1 num-devices=2 UUID=d1e3ff7e:9a9ef68e:ac8fc385:881eb70a devices=/dev/sda4,/dev/sdb4 MAILADDR root@example.com
Bestehendes System umwandeln Ziel ist es nun, eine weitere Festplatte in das System einzubauen und beide Festplatten aus dem laufenden Betrieb heraus in ein Raid-Array zu migrieren. Das Problem liegt darin, dass wir die aktiven Partitionen nicht einfach als Raid deklarieren können, da sie noch in Gebrauch ist. Dazu benutzen wir folgenden Trick: Das neue Raid-Array wird nur mit der neuen Festplatte initialisiert. Die zweite Raid-Platte (die bestehende mit den Daten) wird als "missing" deklariert. Achtung: Wenn man statt von laufendem System über eine Boot-CD startet, dann darauf achten, dass dort auch rsync vorhanden ist! Auf der Gentoo-CD ist es nicht vorhanden. Die andere Möglichkeit ist das bestehende System direkt umzuwandeln. D.h. über eine Start-CD wie Knoppix die Systemeinstellungen und Paritionsinformationen zu ändern. Es kann zu Inkosistenzen zwischen der Blockanzahl des Dateisystems (ext3) und der Raidpartition kommen. Die Ursache liegt darin, dass der Raidsuperblock sich einen Bereich von 128KB (also 32 Blöcke a 4KB) am Ende der Partition beansprucht. Deshalb muss die Größe der bestehenden Partition um 128KB verkleinert werden! Bestehendes System Überagen 1. Partition auf leere Platte übertragen mittels zweiter Möglichkeiten sfdisk -d /dev/sda sfdisk /dev/sdb dd if=/dev/sda of=/dev/sdb count=1 2. Allen Partitionen auf /dev/sdb den Raid-Partitionstyp zuweisen fdisk => Typ = fd 3. Raid erstellen // missing ist Platzhalter für die aktive Festplatte // es kann notwendig sein den Parameter metadata=0.90 mitzugeben! // -l 1 steht Raid-1 // -n 2 steht für zwei Raid-Devices mdadm -C /dev/md1 -l1 -n2 missing /dev/sdb1 mdadm -C /dev/md2 -l1 -n2 missing /dev/sdb2 4. Dateisystem erstellen mkfs.ext2 /dev/md1 mkswap /dev/md2 swapon /dev/md2 mkreiserfs /dev/md3 mkfs.ext3 -j /dev/md4 5. Kopieren des Inhalts in das Raid mkdir /mnt/quelle mkdir /mnt/ziel // /boot nach md0 kopieren mount /dev/sda1 /mnt/quelle mount /dev/md1 /mnt/ziel rsync -avh --progress /mnt/quelle/ /mnt/ziel/ umount /mnt/quelle umount /mnt/quelle // Nächste Partition mount /dev/sda3 /mnt/quelle mount /dev/md3 /mnt/ziel rsync -avh --progress /mnt/quelle/ /mnt/ziel/ Statt rsync sollte auch copy funktionieren: cp -apx /mnt/quelle/* /mnt/ziel/ Der Parameter -v macht bei cp den Vorgang langsamer. Besser mit watch -n 10 df -H kontrollieren Der Parameter -x unterbindet das Kopieren von Daten aus eingebundenen Partitionen 6. Endeinrichtung a. Bootloader Grub einrichten b. Partitionsverweise in grunb.conf und fstab korrigieren
c. mdadm.conf erstellen. Prüfen der Parameter devices= für für die Arraydefinitionen (s.o.) in der mdadm.conf. Zur Not nachtragen. d. die alte Platte entfernen und neue Platte einbauen e. Paritionsstruktur übertragen d. Neue Platte dem Raidverbund hinzufügen (s.u.) Bestehendes System Ändern 1. Konsistenzprüfung e2fsck y /dev/sda1 2. Bestimmung der exakten Größe des Dateisystems tune2fs l /dev/sda1 grep Block count Block count: 4885768 3. Verkleinern des Dateisystems um 32 Blöcke für Raidsuperblock resize2fs p /dev/sda1 4885736 4. Partitionstyp ändern fdisk => Typ = fd usw.
Auflösen des Raidverbunds Zuerst muss die Partition als fehlerhaft gekennzeichnet werden und dann kann sie aus dem Raid entfernt und der Superblock gelöscht und die Dateisystemgröße eventuell aufs Maximum vergrößert werden. mdadm /dev/md0 -fail /dev/sdb1 mdadm /dev/md0 -remove /dev/sdb1 mdadm -zero-superblock /dev/sdb1 fdisk => Typ 0x83 resize2fs p /dev/sda1 Soll das Raid insgesamt aufgelöst warden und es ist noch aktiv, dann muss es zuerst angehalten warden: mdadm -stop /dev/md0 Ändern der Raid-Geräte-ID (minor: /dev/md127 zu /dev/md0) Hier wird die Raid-ID für ein Raid-1 über eine Vollpartitionierung der Festplatten (sda,sdb) geändert. Bei schon bestehendem Dateisystem muss die aktuelle Metadataversion berücksichtigt werden. War die alte z.b. 0.90 und wird von einer >=1.0 überschrieben, ist auch das Dateisystem davon betroffen, weil der neue Superblock größer ist als der alte. Daher sollte dann der Parameter metadata=0.90 mitgegeben werden. mdadm S /dev/md127 mdadm -zero-superblock /dev/sd[a-b]1 mdadm C /dev/md0 l1 n2 metadata=0.90 /dev/sda1 /dev/sdb1 mdadm A /dev/md0 Vergrößern des Raidverbunds Hotspare-Variante Partitionierung/Bootloader wie die Festplatten im laufendem Raid und dann Integrieren. mdadm /dev/md1 -add /dev/sdc1 Alte Festplatten durch neue größere ersetzen Variante Alle Partitionen der einer alten redundanten Platte (sdc) als fehlerhaft markieren und entfernen oder die neue zunächst als weitere aktive Festplatte einbinden. Dann die neue hinzufügen, die Partitionsstruktur übernehmen, ins Raid einbinden usw.. -- alte Platte aus dem Raid nehmen mdadm /dev/md[0-n] -fail /dev/sdc[1-n] mdadm /dev/md[0-n] -remove /dev/sdc[1-n] mdadm -zero-superblock /dev/sdc[1-n] -- neue Platte/Partitionen einbinden mdadm /dev/md[0-n] -add /dev/sdc[1-n] Diesen Vorgang für alle Festplatten des Raids der Reihe nach ausführen und die Synchronisation bis zum Ende durchlaufen lassen. Danach kann die Größe des Raids verändert werden. mdadm /dev/md[0-n] - grow - size=max e2fsck f /dev/md[0-n] resize2fs p /dev/md[0-n] Jetzt noch den Bootloader neu installieren.
Ausfall einer Festplatte im Raidverbund 1. Partitionen der defekten Platte dem Raidverbund als fehlerhaft melden, wenn nicht schon geschehen: mdadm -f /dev/md[0-n] /dev/sd[x][1-n] 2. Partitionen der defekten Platte aus dem Raidverbund abmelden: mdadm -r /dev/md[0-n] /dev/sd[x][1-n] 3. System herunterfahren Bei SATA-Wechselplatten ist das Runterfahren nicht notwendig. 4. Festplatte austauschen Neue leere mind. gleichgroße Platte mit derselben Partitionsstruktur einbauen, d.h. entweder vorpartitioniert oder mit Boot-CD oder vom laufendem System aus von der heilen Platte kopieren. sfdisk -d /dev/sd[x] sfdisk /dev/sd[y] Eine Formartierung ist nicht notwendig. 5. System neu starten (falls runtergefahren) und die einzelnen Partitionen der neuen Platte dem Raidverbund hinzufügen mdadm -a /dev/md[0-n] /dev/sd[x][1-n] Synchronisierung beobachten watch -n5 cat /proc/mdstat 6. Bootmanager einrichten Grub z.b. auf zweiter Platte installieren device (hd0) /dev/sdb root (hd0,0) setup (hd0) quit Beispiel für Raid-1 mit 3 Raidpartitionen (md1-md3) und ausfall einer Partition auf 2ter Platte Aus dem Raid entfernen: mdadm /dev/md1 -r /dev/sdb1 mdadm /dev/md2 -r /dev/sdb2 mdadm /dev/md3 -r /dev/sdb3 Festplatte auswechseln und Partitionsstruktur übertragen sfdisk -d /dev/sda sfdisk /dev/sdb Dem Raid hinzufügen mdadm /dev/md1 -a /dev/sdb1 mdadm /dev/md2 -a /dev/sdb2 mdadm /dev/md3 -a /dev/sdb3
Bootprobleme a. Installations-CD starten und dann aufrufen: mdadm --assemble /dev/md1 /dev/sda1 /dev/sdb1 mdadm --assemble /dev/md2 /dev/sda2 /dev/sdb2 mdadm --assemble /dev/md3 /dev/sda3 /dev/sdb3 b. Swap aktivieren swapon /dev/md2 c. einbinden mount /dev/md3 /mnt/gentoo mount /dev/md1 /mnt/gentoo/boot Eventuell noch chrooten. Hierbei jedoch prüfen, ob die Raid-Partitionen (mdn) die Gerätenummer haben, die sie haben sollen und nicht die, welche sich häufig automatisch zugewiesen bekommen (N>120). Währen /proc/mdstat die hohen Nummern zeigt und mdadm detail scan die niedrigen, dann ist alles ok, wenn nicht dann kann eine Benutzung des Raids dazuführen, das die hohen Gerätenummern zurückgeschrieben werden! Dann muss der Superblock nachträglich geändert werden. Datenkonsistenzprüfung a. manuell echo check >> /sys/block/mdx/md/sync_action watch -n.1 cat /proc/mdstat b. /etc/crond.daily oder /etc/cron.weekly #!/bin/bash # # This script checks all RAID devs on the system # raid_base="/sys/block" raid_names="md*" cd ${raid_base} for raid in echo ${raid_names}; do test -f ${raid_base}/${raid}/md/sync_action && \ echo "check" >> ${raid_base}/${raid}/md/sync_action /bin/logger -t "RAID" "Raidprüfung für: ${raid}" done Defekte Blöcke a. anzeigen lassen cat /sys/block/mdx/md/mismatch_cnt b. verschieben echo repair >> /sys/block/mdx/md/sync_action watch -n.1 cat /proc/mdstat