Linux/Software-RAID/Aufgaben
Komplexere Szenarien und Methoden, die im normalen Betrieb nicht auftreten, aber für Nutzer mit speziellen Anforderungen nützlich sein können.
Resync und Rebuild beschleunigen
- Wie eingangs erläutert ermöglicht ein RAID unterbrechungsfreien Zugriff auf die gespeicherten Daten auch während eines Ausfalls.
- Daten können also auch während eines Resyncs oder Rebuilds gelesen und geschrieben werden, wenn auch mit verringerter Geschwindigkeit.
- Lese- und Schreibzugriffe wirken sich umgekehrt wiederum auf die Geschwindigkeit von Resnyc- und Rebuild-Vorgängen aus.
- Die Balance zwischen Lese-/Schreib-Performance und Resync-/Rebuild-Geschwindigkeit kann über zwei (virtuelle) Dateien im proc-System gesteuert werden:
Pfad | Standardwert (in KiB/s) | Bedeutung |
/proc/sys/dev/RAID/speed_limit_min | 1000 | Das System wird ggf. Lese- und Schreibzugriffen verlangsamen, falls die Resync-/Rebuild-Geschwindigkeit unter diesen Wert zu fallen droht. |
/proc/sys/dev/RAID/speed_limit_max | 200000 | Das System wird Rebuild und Resync höchstens mit dieser Geschwindigkeit durchführen und eventuellen Überschuss für Lese-/Schreib-Zugriffe frei halten. |
- Da der Standard-Maximalwert von knapp 200 MiB/s die Leistung normaler Festplatten (mit Ausnahme von SSDs) übersteigt, wird das System effektiv immer versuchen, Resync und Rebuild so schnell wie möglich zu beenden, falls keine Lese- oder Schreibzugriffe stattfinden.
- Falls sich Zugriffe nicht vermeiden lassen (zum Beispiel, wenn das root-Dateisystem auf dem RAID liegt) und Rebuild/Resync trotzdem Vorrang haben sollen, kann die Mindestgeschwindigkeit temporär auf einen praktisch nicht erreichbaren Wert angehoben werden:
# su -c "echo 200000 > /proc/sys/dev/RAID/speed_limit_min"
- Gerade im Fall des root-Dateisystems kann die damit einhergehende verringerte Lese- und Schreibgeschwindigkeit jedoch zu einem instabilem, effektiv nicht mehr nutzbaren System führen.
- Änderung an den Standardwerten sind daher mit Vorsicht zu genießen.
- Bei einem Neustart werden automatisch die Standardwerte wiederhergestellt.
- Um den Wert per Hand zurückzusetzen:
# su -c "echo 1000 > /proc/sys/dev/RAID/speed_limit_min"
- In Einzelfällen kann das Aushängen des Dateisystems (falls möglich) den Vorgang beschleunigen.
- Im Regelfall wird dies jedoch keinen Vorteil bringen.
- In jedem Fall widerspricht dies natürlich dem Grundgedanken eines RAIDs, die Daten in jedem Fall verfügbar zu halten:
# umount /dev/md0
- Generell sollte man von diesen Möglichkeiten keine Wunder erwarten.
- Resync und Rebuild erfordern im Allgemeinen das komplette Lesen und Neubeschreiben aller beteiligten Laufwerke und können damit maximal so schnell durchgeführt werden, wie es das langsamste, am RAID beteiligte, Laufwerk erlaubt.
- Zeiten im Bereich von mehreren Tagen sind bei entsprechender Größe völlig normal.
- Wenn man möchte, kann man während der Vorgänge mit watch den Fortschritt kontrollieren:
# watch cat /proc/mdstat
- Die Anzeige kann mit Strg + C beendet werden.
Wechsel des Betriebssystems
- Für den Fall, dass man das Betriebssystem neu aufsetzen muss oder ein zweites Betriebssystem auf dem Rechner installieren will, kann man das Software-RAID weiter verwenden – sofern das Betriebssystem nicht direkt auf dem Software-RAID angelegt ist.
- Dazu muss auf dem neuen System das Paket...
mdadm
Paketliste zum Kopieren:
# apt install mdadm
Oder mit apturl installieren, Link:
apt://mdadm
- ...installiert werden.
- Spätestens bei einem Neustart sollten bestehenden Arrays automatisch erkannt und gestartet werden.
- Falls dies nicht funktioniert, weil z.B. Arrays mit alten Superblock-Versionen vorhanden sind, kann man dies auch per Hand aktivieren:
Achtung! Auf keinen Fall darf man hier die Optionen "--create" verwenden, da sonst die Lesbarkeit auf den beteiligten Partitionen zerstört wird.
- Das RAID nutzbar machen:
- RAID aus den gefundenen Superblöcken neu assemblieren:
# mdadm --assemble --scan
- Hat man mehrere Software-RAIDs und möchte ein bestimmtes RAID zusammenführen, kann man dies durch die Angabe der UUID des entsprechenden RAIDs tun:
# mdadm --assemble --scan --uuid=6c926c35:380d7ab2:3603cf0e:ecfa67b9
- Durch die Angabe der einzelnen Partitionen:
# mdadm --assemble /dev/md0 /dev/sde1 /dev/sdf1 /dev/sdg1
- Soll von dem neuen RAID-Verbund gebootet werden (Root-Dateisystem), dann muss noch der Bootloader installiert und das initramfs aktualisiert werden.
Live System
- Um auf einen RAID-Verbund mittels einer Live-CD bzw. eines Live-USB zuzugreifen, muss das Programmpaket mdadm mit...
# apt install --no-install-recommends mdadm
- ...installiert werden.
- Die Option --no-install-recommends verhindert dabei die Installation des Mail-Server Postfix.
- Anschließend werden mit:
# mdadm --assemble --scan
- alle gefundenen RAID-Verbunde aktiviert.
- Mit dem Befehl:
# cat /proc/mdstat
- kann man dann wieder die gefundenen RAID-Verbunde anzeigen.
- Nun wird das RAID noch mit:
# mkdir /media/RAID # mount /dev/md0 /media/RAID
- in den Verzeichnisbaum integriert.
- Jetzt kann man die Daten im Verzeichnis /media/RAID lesen (bei Bedarf auch verändern), sowie auf eine externe Festplatte oder in ein Netzwerkverzeichnis kopieren.
- Wenn man auf defekte/fehlende Festplatten zugreifen muss, dann schlägt ein --assemble --scan fehl und die Partitionen müssen einzeln assemblieren werden.
- Dazu wird z.B. sda1 als Quelle angegeben (bei RAID 0 nicht möglich):
# mdadm --assemble --run /dev/md0 /dev/sda1
- Dabei bewirkt das --run, dass der Verbund aktiviert wird.
- Nach dem Einhängen in den Verzeichnisbaum sollte man auf die Daten zugreifen können.
- Weitere Möglichkeiten, z.B. bei der Reparatur des RAID, bieten die Root-Directory-, die Chroot- oder die Setup-Methode.
Kombinierte RAIDs
- Wem die oben genannten Möglichkeiten nicht ausreichen, kann auch nach eigenen Anforderungen verschiedenen RAID-Arten kombinieren.
RAID51
- So ist es zum Beispiel möglich, zwei RAID 5 zu spiegeln, also als RAID 1 zu betreiben:======
- Aus sde1, sdf1 und sdg1 wird ein RAID 5 erstellt
- Aus sdh1, sdj1 und sdk1 wird ebenfalls ein RAID 5 erstellt
- Aus den beiden RAID 5 wird dann ein RAID 1 erstellt:
# mdadm --create --verbose /dev/md0 --level=5 --RAID-devices=3 /dev/sde1 /dev/sdf1 /def/sdg1 # mdadm --create --verbose /dev/md1 --level=5 --RAID-devices=3 /dev/sdh1 /dev/sdj1 /dev/sdk1 # mdadm --create --verbose /dev/md2 --level=1 --RAID-devices=2 /dev/md0 /dev/md1
- Ein solcher Verbund würde als RAID 51 bezeichnet werden, also ein RAID 1 über mehrere RAID 5.
- Im Allgemeinen sind solche exotischen Kombinationen zwar selten sinnvoll (je komplexer, desto fehleranfälliger sind Wartung und Reparatur), aber prinzipiell sind beliebige Kombinationen möglich.
RAID10
- Eine sinnvolle Kombination, ein RAID 0 über mehrere RAID 1, also ein RAID 10, wird direkt von mdadm als RAID-Level unterstützt und muss nicht wie hier beschrieben per Hand angelegt werden.
- Alternativ verwendet man auch gerne mehrere RAIDs in Zusammenarbeit mit LVM, da dieses einen sehr flexiblen Umgang mit RAID-Verbünden ermöglicht.
- Zudem sind dadurch auch sehr große Dateisysteme mit etlichen Terabytes und sogar Petabytes realisierbar.
RAID auflösen
- Um den Verbund eines RAID aufzulösen, d.h. die Ressourcen wieder freizugeben, geht man wie folgt vor:
- Stoppen des RAID-Verbundes:
# umount /dev/md0 # mdadm --stop /dev/md0
- In der /etc/fstab die aufgelösten RAIDs entfernen.
- Mit einem Editor in der mdadm.conf die Array-Angaben löschen.
- Den Superblock der entfernten Partitionen löschen, hier am Beispiel von sde1 und sdf1:
# mdadm --zero-superblock /dev/sde1 /dev/sdf1
- Die Partitions-ID wieder auf normale Linux-ID ändern (bei MBR) beziehungsweise das RAID-Flag der Partition ausschalten (bei GPT).
- Auf die vorhandenen Daten kann anschließend nicht mehr zugegriffen werden.
- Die Partitionen auf den Festplatten sind aber immernoch vorhanden, solange diese nicht überschrieben werden.
Bootloader
- Betreibt man einen RAID-Verbund als Systemlaufwerk, ist es praktisch, wenn das System auch noch nach Ausfall einer Festplatte hochfahren kann.
- Das wird z.B. bei ferngewarteten Rechnern benötigt, auf die man keinen direkten Zugriff hat.
- Da sich der Bootloader GRUB 2 in der Standardkonfiguration nur auf einem der Laufwerke installiert, muss man etwas nachhelfen.
- Dazu installiert man den Bootloader auf allen dem RAID-Verbund angehörenden Laufwerken.
- MPT: Installation des Bootloaders in alle MBR aller beteiligten Festplatten (grub-install /dev/sdX), wobei die neu eingerichteten Festplatten anzugeben sind.
- Am schnellsten geht es mit dem Befehl:
# dpkg-reconfigure grub-pc
https://en.wikipedia.org/wiki/Logical_block_addressing
- und der anschließenden Auswahl der gewünschten Festplatten.
- GPT: Der Bootloader muss in die entsprechenden Boot-Partitionen installiert werden.
- Z.B. bei einer Installation mit GPT und BIOS bricht die Installation von GRUB 2 sonst ab und weist mit einer Fehlermeldung auf die fehlende Partition hin.
grub-installer: /usr/sbin/grub-setup: warn: This GPT partition label has no BIOS Boot Partition; embedding won't be possible!
- Damit die Boot-Partitionen durch die initrd auch einwandfrei gemountet werden, sollte nach Änderung die mdadm.conf und initrd aktualisiert werden.
USB und RAID
- RAID 0 (stripping) ist denkbar ungeeignet für ein USB-RAID, da bei diesem das Entfernen einer Platte direkt zum Defekt des RAID-Verbunds führt.
- Mit RAID 5 und 6 kann es kritisch werden, es sollte aber funktionieren, auch wenn davon stark abzuraten ist.
- RAID 1 (mirror) mit mehreren Partitionen auf verschiedenen USB-Festplatten ist prinzipiell kein Problem, auch wenn davon im Allgemeinen abzuraten ist.
- Wer trotzdem sicher ist, dass in Spezialfällen ein RAID mit USB-Geräten sinnvoll ist, sollte folgendes beachten:
- Bei USB-Festplatten muss man unterbinden, dass ein Benutzer versucht, diese einzuhängen, bzw. dass das System dies am Anfang nicht selbst probiert.
- Da alle am RAID beteiligten Partitionen die gleiche UUID haben sollten, kann man die /etc/fstab auf diese abstellen und um die Parameter nouser und noauto erweitern.
RAID 1 zu RAID 0 konvertieren
Ausgangssituation
- /dev/md0 ist ein RAID 1 aus /dev/sda1 und /dev/sdb1.
Ziel
- /dev/md0 soll ein RAID 0 aus beiden Partitionen werden.
Vorgehen
# mdadm --grow /dev/md0 -l 0
mdadm: level of /dev/md0 changed to RAID0
- /dev/sda1 wurde aus dem RAID 1 entfernt.
- Den Superblock entfernen.
# mdadm --zero-superblock /dev/sda1
- RAID 4 ist ein notwendiger Zwischenschritt.
# mdadm --grow /dev/md0 --level=4 --RAID-devices=2 --add /dev/sda1 --backup-file=/root/RAID.bak
mdadm: level of /dev/md0 changed to RAID4 mdadm: added /dev/sda1 mdadm: Need to backup 128K of critical section.. mdadm: /dev/md0: could not set level to RAID0
- /dev/md0 ist jetzt ein RAID 4 das gesynced wird.
- Synchronisation abwarten...
- Dann RAID 4 zu RAID 0 konvertieren.
# mdadm --grow /dev/md0 --level=0 --RAID-devices=2 --backup-file=/root/RAID.bak
- Wieder das Reshaping abwarten...
watch mdadm -D /dev/md0
- Fertig ist das RAID 0.