mdadm

mdadm ist das Verwaltungswerkzeug für Software-RAIDs unter Linux. Die Software-RAID-Schicht liegt logisch zwischen der Disk und einem (optionalen) LVM.

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

Links:

Installation und Konfiguration

yum -y 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

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. Die Datei vereinfacht im Ernstfall den Umgang mit mdadm beispielsweise bei der Zusammenstellung der RAID-Arrays. 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

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

RAID erzeugen

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

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

Troubleshooting

# see if something happens:
cat /proc/mdstat

# check mdadm superblocks
/usr/bin/md_checker

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

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

/dev/md9 /dev/md13

Built on 2022-06-03