mdadm

Siehe auch

mdadm ist das Verwaltungswerkzeug für Software-RAIDs unter Linux. Die Software-RAID-Schicht liegt logisch zwischen der Disk und einem (optionalen) LVM. Dahinter steckt der md-Treiber (Multiple Devices) im Linux-Kernel - Hardware-RAID-Controller werden nicht benötigt, dafür ist das RAID an den Host gebunden.

Per cat /proc/mdstat lässt sich eine Momentaufnahme der Software-RAID-Konfiguration anzeigen. watch cat /proc/mdstat hilft in einem separaten Terminalfenster bei der laufenden Überwachung.

  • U: device is up

  • _: device is down or missing

Gefahr

Unbedingt beachten: Keine „post-2019 WD Red“- und keine „post-2020“ Desktop-Laufwerke mit „Shingled Magnetic Recording (SMR)““ in mdadm-Arrays verwenden! Für Details, siehe https://raid.wiki.kernel.org/index.php/Timeout_Mismatch

Begriffe
  • Component Device: Eine Festplatte oder Partition, die Bestandteil eines md-Devices ist.

  • md-Device: Virtuelles Block-Device (/dev/mdX oder /dev/md/<name>), das aus zwei oder mehr realen Block-Devices zusammengesetzt wird.

  • Resync / Rebuild: Initiales Synchronisieren eines neuen Arrays bzw. Rekonstruktion der Daten nach Plattenausfall. Begrenzt durch dev.raid.speed_limit_min/max.

  • Scrubbing / Check: Periodische Konsistenzprüfung aller Blöcke (echo check > /sys/block/mdX/md/sync_action).

  • Spare: Festplatte, die dem Array bekannt ist, aber nicht aktiv genutzt wird. Springt bei einem Ausfall automatisch ein.

  • Superblock: Von mdadm auf jede Component geschriebene Metadaten (UUID, Array-Name, Rolle, Position). Version 1.2 ist Standard.

RAID-Level

Der md-Treiber unterstützt folgende RAID-Level (Auswahl aus mdadm(8); die Angaben zu Lese-/Schreib-Performance sind grobe Richtwerte):

RAID 0 (Striping)

Zwei oder mehr Platten werden ohne Redundanz zusammengeschaltet. Lese- und Schreib-Performance skalieren mit der Anzahl der Platten, aber ein einzelner Plattenausfall zerstört das ganze Array. Sinnvoll nur für reproduzierbare Daten (Caches, Build-Artefakte).

RAID 1 (Mirroring)

Zwei (oder mehr) Platten halten identische Kopien. Lese-Performance skaliert mit der Anzahl der Platten, Schreib-Performance entspricht einer einzelnen Platte. Übersteht den Ausfall einer Platte pro Mirror. Standard für Boot-/System-Platten.

RAID 5

Drei oder mehr Platten mit rotierender Parität. Ein Plattenausfall ist tolerierbar, Rebuild liest alle verbleibenden Platten komplett. Nicht empfohlen bei Platten grösser als ca. 2 TB: die Rebuild-Zeit wird so lang, dass statistisch während des Rebuilds eine zweite Platte ausfallen kann (Unrecoverable-Read-Error-Problem).

RAID 6

Wie RAID 5, aber mit doppelter Parität - übersteht zwei gleichzeitige Platten-Ausfälle. Vier oder mehr Platten. Standardempfehlung für grosse Datenarrays.

RAID 10

Mindestens vier Platten; Kombination aus Mirroring und Striping (mdadm bietet zusätzlich near, far und offset-Layouts). Sehr gute Performance, verträgt je nach Layout bis zu N/2 Ausfälle. Empfehlung für write-lastige Workloads (z.B. Datenbanken).

LINEAR (Concat)

Platten werden hintereinander gehängt, keine Redundanz. Faktisch durch LVM ersetzt, für Neu-Setups nicht empfohlen.

Nicht für RAID, aber erwähnt in der Manpage:

  • MULTIPATH: deprecated, statt dessen Device-Mapper-Multipath (multipath-tools).

  • FAULTY: Injiziert Fehler für Tests, kein echtes RAID.

  • CONTAINER: IMSM- oder DDF-Metadaten-Container, z.B. bei Intel-Fake-RAID.

Installation und Konfiguration

dnf --assumeyes install mdadm

Verwendung von mdadm

Bei der Arbeit mit mdadm empfiehlt sich eine fixe Vorgehensweise, die ganz grob wie folgt aussieht:

  1. mdadm --create ...

  2. /etc/fstab anpassen

  3. Falls Boot-Platte geändert wurde: Grub-Konfiguration anpassen

  4. Details zu mdadm-Arrays ermitteln: mdadm --detail --scan > /etc/mdadm.conf

Die mdadm.conf ist nicht zwingend erforderlich, da mdadm in der Lage ist, RAID-Arrays durch Scannen der Festplatten automatisch zusammenzustellen. Allerdings hat sie einige Vorteile:

  • Automatisierung: Eine korrekt gepflegte mdadm.conf ermöglicht, dass Arrays beim Booten konsistent und ohne manuelle Eingriffe zusammengebaut werden.

  • Dokumentation: Sie dokumentiert die RAID-Konfiguration (UUID, Name, Anzahl der Geräte etc.) und erleichtert so die Verwaltung und Fehlersuche.

  • Spezielle Einstellungen: Spezielle Parameter definieren den Zusammenbau und das Verhalten des Arrays.

Auch wenn mdadm in einfachen Setups ohne mdadm.conf funktioniert, wird deren Verwendung in produktiven oder komplexen Umgebungen empfohlen, um einen reibungslosen und konsistenten Betrieb zu gewährleisten. Falls sich also etwas an der Benennung, der UUIDs oder der Anzahl der Festplatten und/oder der RAIDs geändert hat, sollte die RAID-Übersichtsdatei /etc/mdadm.conf neu erzeugt werden.

Der folgende Vorgang kann etwas Zeit in Anspruch nehmen, wenn die RAIDs stark beschäftigt sind.

cp /etc/mdadm.conf /etc/mdadm.conf.$(date +"%Y-%m-%dT%H:%M:%S")
mdadm --detail --scan > /etc/mdadm.conf

Im Beispiel der Inhalt einer mdadm.conf. Die UUID bezeichnet das RAID, steht aber auch in den Metadaten der beteiligten Festplatten, die selbst über eine UUID_SUB unterschieden werden - alle einsehbar per blkid:

ARRAY /dev/md127 metadata=1.2 UUID=b9f0e6bc:34b0fc12:c5d09814:efdd0a7d

mdadm --detail ermittelt Details zu aktiven mdadm-Arrays, mdadm --examine ermittelt dagegen Details zu den einzelnen Mitgliedern eines mdadm-Arrays.

mdadm --detail --scan
# ARRAY /dev/md/raid6 metadata=1.2 name=localhost.localdomain:raid6 UUID=0b43f42d:1333d2cf:b07ad1fa:0552b586

mdadm --examine --scan
# ARRAY /dev/md/raid6  metadata=1.2 UUID=0b43f42d:1333d2cf:b07ad1fa:0552b586 name=localhost.localdomain:raid6

Tipp

Eine Anpassung der Werte nach oben für sysctl -w dev.raid.speed_limit_min = ... und/oder sysctl -w dev.raid.speed_limit_max = ... kann zu einem deutlich schnelleren RAID-Rebuild führen.

RAID erzeugen

Im Beispiel wird ein Software-RAID 6 über acht Festplatten /dev/sdb bis /dev/sdi erzeugt.

dnf --assumeyes install mdadm

NAME=raid6
LEVEL=6
mdadm --create /dev/md/$NAME --name=$NAME --level=$LEVEL --raid-devices=8 /dev/sd[b-i]

Wer das RAID löschen möchte:

mdadm --stop /dev/md/$NAME
mdadm --zero-superblock /dev/sd[b-i]

Das war es schon. Anschliessend kann sofort der LVM übernehmen:

pvcreate /dev/md/$NAME
vgcreate vg_$NAME /dev/md/$NAME
lvcreate --extents 100%FREE vg_$NAME --name lv_$NAME

mkfs --type xfs /dev/vg_$NAME/lv_$NAME

# let's mount this to /data
mkdir -p /data

Mit LVM lautet der Mountpoint "/dev/vg_$NAME/lv_$NAME, ohne /dev/md127 (abhängig von der mdadm-Konfiguration).

Eintrag in der /etc/fstab ergänzen:

echo "/dev/vg_$NAME/lv_$NAME /data xfs defaults 0 0" >> /etc/fstab
mount --all

Achtung: ein md-Raid sollte nicht per UUID (ermittelt über blkid) gemountet werden - in unseren Tests blieben die Maschinen beim Reboot hängen (Stand 2015-01).

Alten mdadm --monitor-Prozess killen und neu starten:

mdadm --monitor --daemonise --mail=admin@example.com --delay=600 /dev/md*

Anschliessend mdadm.conf neu erzeugen:

mdadm --detail --scan > /etc/mdadm.conf

RAID aktivieren

Ein inaktives RAID lässt sich meist wie folgt aktivieren:

mdadm --assemble /dev/$MYRAID

Falls nicht, findet sich in der /var/log/dmesg eine Zeile ähnlich zu md/raid:...: cannot start dirty degraded array.? Dann hilft:

mdadm --stop /dev/$MYRAID
mdadm --assemble --force /dev/$MYRAID /dev

Festplatte hinzufügen

mdadm --manage /dev/$MYRAID --add /dev/sdx
cat /proc/mdstat

Damit ist sie als „Spare (S)“ markiert, also nicht aktiv in Benutzung. Wer keine Spare-Festplatte braucht, sondern sie nutzen will, kann im Anschluss sofort das RAID vergrössern.

RAID vergrössern

Im Beispiel besitzt das RAID drei Festplatten, die mit XFS formatiert sind. Nach dem Hinzufügen einer vierten physischen oder virtuellen Platte nimmt man folgende Schritte vor:

mdadm --grow --raid-devices=4 --backup-file=/root/grow_$MYRAID.bak /dev/$MYRAID
cat /proc/mdstat

Fehler mdadm: Need to backup xx K of critical section.. mdadm: Cannot set device shape for /dev/md... - Cannot allocate memory? Dann laut https://raid.wiki.kernel.org/index.php/Growing:

mdadm --grow --size=max /dev/$MYRAID
mdadm --grow /dev/$MYRAID
mdadm --grow --raid-devices=4 /dev/$MYRAID

Danach wie üblich das Dateisystem auf /dev/$MYRAID vergrössern

Details zu einem RAID ermitteln

mdadm --detail /dev/$MYRAID
cat /proc/mdstat

Festplatte entfernen

mdadm --manage /dev/$MYRAID --remove /dev/sdx

Unter Umständen erhält man die Meldung mdadm: hot remove failed for /dev/sdx: Device or resource busy. Meist erhält man diese Meldung, wenn die Platte für Linux noch „brauchbar“ (also nicht ausgefallen o.ä.) ist. Die Platte muss daher künstlich als ausgefallen gekennzeichnet werden:

mdadm --manage /dev/$MYRAID --fail /dev/sdx
mdadm --manage /dev/$MYRAID --remove /dev/sdx

Eine Festplatte austauschen

Wer nur über die Seriennummer der zu entfernenden Festplatte verfügt, muss zuerst die Geräte-Adresse beispielsweise mit Hilfe von smartctl ermitteln:

for hd in /dev/sd*; do
    echo -n "Device: $hd," smartctl -a $hd | grep -i serial
done

Mit der Geräte-Adresse (z.B. /dev/sdak/) schaut man nach, ob die Festplatte Bestandteil eines RAIDs ist:

cat /proc/mdstat | grep sdak

Ist die Platte Bestandteil eines RAID-Verbundes, diese wie weiter oben beschrieben aus dem RAID-Verbund entfernen.

Jetzt die Hardware ersetzen (Hot Plug). Möglicherweise muss die getauschte Festplatte noch aktiviert werden.

Wenn die Platte Bestandteil eines RAID-Verbundes war, diese wieder wie weiter oben beschrieben dem RAID hinzufügen.

Zwei (und mehr) Festplatten in einem RAID 5 (6) austauschen

Ganz gefahrlos ist das nicht (Backup ist gefordert), es lässt sich aber durchführen.

Zuerst eine Ersatz-Platte („Spare“) physisch hinzufügen und ausführen:

mdadm /dev/$MYRAID --add /dev/sdd

Die Daten der ersten auszutauschenden Platte (hier /dev/sdc) durch den Kernel direkt auf den neuen Spare kopieren lassen. Das vermeidet einen ressourcenintensiven RAID-Rebuild auf Basis der verteilt liegenden Redundanzdaten:

mdadm /dev/$MYRAID --replace /dev/sdc
cat /proc/mdstat

Nach dem Kopiervergang wird /dev/sdc automatisch auf „Faulty“ gesetzt. Daher:

mdadm /dev/$MYRAID --remove /dev/sdc

Das wird für die weiteren auszutauschenden Platten wiederholt.

RAID löschen

lsblk
fdisk -l | grep md
umount --lazy /dev/$MYRAID

Falls hier die Meldung mdadm: Cannot get exclusive access to /dev/$MYRAID: Perhaps a running process, mounted filesystem or active volume group? erscheint, mit cat /proc/mdstat prüfen, ob das RAID „auto-read-only“ gesetzt ist. In dem Fall mdadm --readwrite /dev/$MYRAID.

mdadm --stop /dev/$MYRAID
mdadm --zero-superblock /dev/sdb

Immer noch die gleiche Fehlermeldung? Die brutale Methode - einfach das Überschreiben der Superblocks mit Nullen erzwingen und durchbooten:

# for every disk in RAID
mdadm --zero-superblock --force /dev/sdb
...
reboot

RAID-Checks

Die Software-RAIDs werden periodisch geprüft. Start und Stopp eines Checks:

echo check > /sys/block/md0/md/sync_action
echo idle > /sys/block/md0/md/sync_action

Kann sein, dass der Check/Rebuild bei „idle“ zwar stoppt, aber sofort wieder startet. Um das zu verhindern:

echo frozen > /sys/block/md0/md/sync_action

Der Check wird beim Start wieder dort fortgeführt, wo er aufgehört hat. Wer einen kompletten Check von Anfang bis Ende erzwingen möchte:

echo none > /sys/block/md0/md/resync_start
echo idle > /sys/block/md0/md/sync_action

Best Practices

  • Bitmap aktivieren. Write-Intent-Bitmaps beschleunigen den Rebuild nach einem kurzzeitigen Ausfall drastisch, weil nur geänderte Blöcke re-synct werden müssen. mdadm --grow --bitmap=internal /dev/mdX nachträglich, oder --bitmap=internal beim --create.

  • Spare-Device einplanen. Ein Hot-Spare ermöglicht das automatische Einspringen, bevor ein zweiter Plattenausfall das Array zerlegt. Besonders bei RAID 5 empfohlen.

  • Regelmässiges Scrubbing. /etc/cron.weekly/raid-check (RHEL) bzw. /etc/cron.d/mdadm (Debian/Ubuntu) läuft per Default wöchentlich; nicht deaktivieren.

  • Monitor-Daemon für Alarmierung. mdadm --monitor --daemonise --mail=<adresse> oder MAILADDR <adresse> in der mdadm.conf. Icinga/Nagios sollten zusätzlich /proc/mdstat überwachen.

  • SMART-Check auf jeder Platte. Software-RAID sieht Bad-Sectors oft erst, wenn es zu spät ist; smartd mit aktiver Warnung auf Reallocated-Sectors hilft, defekte Platten vor dem Ausfall zu tauschen. Siehe Disks: S.M.A.R.T..

  • Platten gleicher Grösse (und Charge) vermeiden. Identische Platten aus derselben Produktionscharge fallen oft in derselben Zeit aus. Platten aus verschiedenen Produktionen oder verschiedenen Herstellern mischen.

  • Niemals per UUID mounten. Ein md-RAID sollte nicht per UUID in der /etc/fstab eingetragen werden (Reboot-Hänger beobachtet, Stand 2015-01).

  • mdadm.conf pflegen. Nach jedem Strukturwechsel (--grow, --add, --replace) neu generieren: mdadm --detail --scan > /etc/mdadm.conf.

  • Keine Boot-Platte aus RAID 5 oder RAID 6. Für die Boot-Partition immer RAID 1 verwenden - GRUB 2 kann zwar von RAID lesen, aber RAID-5/6-Rebuilds während des Boots sind nichts, was man haben möchte.

RHEL/Debian-Unterschiede

Paket
  • RHEL 8+: mdadm ist in der BaseOS-Repository-Gruppe verfügbar.

  • Debian/Ubuntu: mdadm im Main-Repo. Installation triggert optional die interaktive Frage, ob auf der System-Platte ein md-Array existiert, das für das Booten aktiv sein muss (dpkg-reconfigure mdadm lässt die Frage erneut stellen).

Mail-Alerting via mdadm --monitor
  • RHEL 8+: konfiguriert via MAILADDR in /etc/mdadm.conf, Unit mdmonitor.service.

  • Debian/Ubuntu: konfiguriert via /etc/default/mdadm (START_DAEMON=true, MAILADDR=...), Unit mdmonitor.service.

Weekly Scrubbing
  • RHEL 8+: /etc/cron.weekly/raid-check, konfigurierbar über /etc/sysconfig/raid-check.

  • Debian/Ubuntu: /etc/cron.d/mdadm, konfigurierbar über /etc/default/mdadm.

Troubleshooting

# see if something is happening
cat /proc/mdstat

# check mdadm superblocks on a disk
mdadm --examine /dev/sdX

# recreate mdadm.conf
mdadm --examine --scan > /etc/mdadm.conf

# get RAID details (look for "degraded")
mdadm --detail /dev/md*