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:
Homepage und Doku: https://raid.wiki.kernel.org/index.php
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:
mdadm --create ...
/etc/fstab
anpassenFalls Boot-Platte geändert wurde: Grub-Konfiguration anpassen
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
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.
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 2024-11-18