Mdadm Howto: Unterschied zwischen den Versionen
| (14 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
=Einrichten= | =Einrichten= | ||
| + | |||
==Installation== | ==Installation== | ||
| + | Debian: | ||
*apt-get install mdadm | *apt-get install mdadm | ||
| + | |||
| + | Rocky: | ||
| + | *dnf install mdadm | ||
| + | |||
| + | ==Vorbereitung der Partitionen== | ||
| + | Die Partitionen bekommen den Typ ''Linux RAID'' – <code>fd00</code> bei GPT (<code>gdisk</code>), <code>fd</code> bei MBR (<code>fdisk</code>). Der Typ ist heute nur noch eine Kennzeichnung für den Betrachter; zusammengebaut wird das Array über die Metadaten, nicht über den Typ. | ||
| + | |||
| + | Lagen auf den Partitionen vorher Dateisysteme, LVM-Strukturen oder ein altes RAID, werden die Signaturen entfernt. Sonst warnt <code>mdadm</code> beim Anlegen und fragt nach: | ||
| + | *wipefs -a /dev/sdb1 /dev/sdc1 | ||
| + | |||
==Raid 0== | ==Raid 0== | ||
*mdadm -C /dev/md0 -l 0 -n 2 /dev/sdb1 /dev/sdc1 | *mdadm -C /dev/md0 -l 0 -n 2 /dev/sdb1 /dev/sdc1 | ||
| Zeile 7: | Zeile 19: | ||
==Raid 1== | ==Raid 1== | ||
*mdadm -C /dev/md1 -l 1 -n 2 /dev/sdd1 /dev/sde1 | *mdadm -C /dev/md1 -l 1 -n 2 /dev/sdd1 /dev/sde1 | ||
| + | |||
==Raid 5== | ==Raid 5== | ||
*mdadm -C /dev/md2 -l 5 -n 3 /dev/sdb2 /dev/sdc2 /dev/sdd2 | *mdadm -C /dev/md2 -l 5 -n 3 /dev/sdb2 /dev/sdc2 /dev/sdd2 | ||
| − | ==Raid 10== | + | |
| + | ==Raid 10== | ||
*mdadm -C /dev/md3 -l 10 -n 4 /dev/sdb3 /dev/sdc3 /dev/sdd3 /dev/sde3 | *mdadm -C /dev/md3 -l 10 -n 4 /dev/sdb3 /dev/sdc3 /dev/sdd3 /dev/sde3 | ||
| + | |||
==Mit Sparedisks== | ==Mit Sparedisks== | ||
| − | *mdadm -C /dev/md3 -l 10 -n 4 -x 2 /dev/ | + | <code>-x</code> gibt die Zahl der Reserveplatten an. Sie laufen im Normalbetrieb leer mit und springen bei einem Ausfall automatisch ein. |
| + | *mdadm -C /dev/md3 -l 10 -n 4 -x 2 /dev/sdb3 /dev/sdc3 /dev/sdd3 /dev/sde3 /dev/sdb4 /dev/sdc4 | ||
==Mountpoints erzeugen== | ==Mountpoints erzeugen== | ||
*mkdir /mnt/raid{0,1,5,10} | *mkdir /mnt/raid{0,1,5,10} | ||
| + | |||
==Dateisystem aufbringen== | ==Dateisystem aufbringen== | ||
*mkfs.ext4 /dev/md0 | *mkfs.ext4 /dev/md0 | ||
| Zeile 21: | Zeile 38: | ||
*mkfs.ext4 /dev/md2 | *mkfs.ext4 /dev/md2 | ||
*mkfs.ext4 /dev/md3 | *mkfs.ext4 /dev/md3 | ||
| + | |||
==Mounten== | ==Mounten== | ||
*mount /dev/md0 /mnt/raid0 | *mount /dev/md0 /mnt/raid0 | ||
| Zeile 26: | Zeile 44: | ||
*mount /dev/md2 /mnt/raid5 | *mount /dev/md2 /mnt/raid5 | ||
*mount /dev/md3 /mnt/raid10 | *mount /dev/md3 /mnt/raid10 | ||
| + | |||
==Verfügbarer Speicher== | ==Verfügbarer Speicher== | ||
*df -h -t ext4 | *df -h -t ext4 | ||
<pre> | <pre> | ||
Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf | Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf | ||
| − | /dev/ | + | /dev/sda1 50G 25G 23G 53% / |
/dev/md0 20G 24K 19G 1% /mnt/raid0 | /dev/md0 20G 24K 19G 1% /mnt/raid0 | ||
/dev/md1 9,8G 24K 9,3G 1% /mnt/raid1 | /dev/md1 9,8G 24K 9,3G 1% /mnt/raid1 | ||
| Zeile 36: | Zeile 55: | ||
/dev/md3 20G 24K 19G 1% /mnt/raid10 | /dev/md3 20G 24K 19G 1% /mnt/raid10 | ||
</pre> | </pre> | ||
| + | |||
| + | Die Netto-Größen zeigen die Rechnung der Level: RAID 0 aus 2 × 10 GiB ergibt 20 GiB, RAID 1 aus 2 × 10 GiB nur 10 GiB, RAID 5 aus 3 × 10 GiB ergibt 20 GiB (eine Platte geht für die Parität), RAID 10 aus 4 × 10 GiB ebenfalls 20 GiB. | ||
| + | |||
==Geschwindigkeitsmessung== | ==Geschwindigkeitsmessung== | ||
| − | *dd if=/dev/zero of=tempfile bs=1M count=1024 conv=fdatasync,notrunc | + | Die Zieldatei muss auf dem gemessenen Array liegen – sonst misst man die Systemplatte. |
| + | *dd if=/dev/zero of=/mnt/raid0/tempfile bs=1M count=1024 conv=fdatasync,notrunc | ||
| + | |||
| + | Während ein Array noch synchronisiert, sind die Messwerte nicht aussagekräftig. | ||
=Kontrolle= | =Kontrolle= | ||
| − | * cat /proc/mdstat | + | *cat /proc/mdstat |
<pre> | <pre> | ||
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] | Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] | ||
| − | md3 : active raid10 | + | md3 : active raid10 sde3[3] sdd3[2] sdc3[1] sdb3[0] |
20953088 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU] | 20953088 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU] | ||
[=============>.......] resync = 68.4% (14344640/20953088) finish=0.5min speed=202328K/sec | [=============>.......] resync = 68.4% (14344640/20953088) finish=0.5min speed=202328K/sec | ||
| − | md2 : active raid5 | + | md2 : active raid5 sdd2[3] sdc2[1] sdb2[0] |
20953088 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU] | 20953088 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU] | ||
| − | md1 : active raid1 | + | md1 : active raid1 sde1[1] sdd1[0] |
10476544 blocks super 1.2 [2/2] [UU] | 10476544 blocks super 1.2 [2/2] [UU] | ||
| − | md0 : active raid0 | + | md0 : active raid0 sdc1[1] sdb1[0] |
20953088 blocks super 1.2 512k chunks | 20953088 blocks super 1.2 512k chunks | ||
</pre> | </pre> | ||
| + | |||
| + | <code>[4/4]</code> bedeutet: vier von vier Mitgliedern vorhanden. Jedes <code>U</code> steht für ein gesundes Mitglied, ein <code>_</code> für ein fehlendes. | ||
| + | |||
=Bootvorgang= | =Bootvorgang= | ||
| − | * | + | *Die Konfiguration jedes Mitglieds steht im persistenten Superblock auf der Partition selbst: Level, Array-UUID, Rolle im Verbund und der Name in der Form <code>rechnername:0</code>. |
| − | * | + | *Der Zusammenbau erfolgt beim Start durch udev und <code>mdadm</code>, in der Regel schon aus der Initramfs heraus. |
| − | * | + | *Ergänzend wird <code>/etc/mdadm/mdadm.conf</code> (Debian) bzw. <code>/etc/mdadm.conf</code> (Rocky) ausgewertet. Die Datei ist nicht nötig, damit das Array überhaupt entsteht – sie legt den Gerätenamen fest. |
| − | * | + | *Ohne passenden Eintrag kann ein Array unter einem beliebigen Namen aus dem oberen Bereich erscheinen, typischerweise <code>/dev/md127</code>. Steht in <code>/etc/fstab</code> dann <code>/dev/md0</code>, schlägt das Mounten fehl. In der fstab arbeitet man deshalb besser mit <code>UUID=</code>. |
| + | *Der Partitionstyp <code>0xFD</code> spielt dabei keine Rolle mehr. Die automatische Erkennung über den Typ (''in-kernel autodetect'') gilt nur für die alten Metadaten der Version 0.90; <code>mdadm</code> legt seit Langem Version 1.2 an. | ||
| + | |||
==Manuelles Zusammenbauen== | ==Manuelles Zusammenbauen== | ||
| − | *mdadm -A /dev/md0 /dev/ | + | *mdadm -A /dev/md0 /dev/sdb1 /dev/sdc1 |
| − | *mdadm -A /dev/md1 /dev/ | + | *mdadm -A /dev/md1 /dev/sdd1 /dev/sde1 |
| − | *mdadm -A /dev/md2 /dev/ | + | *mdadm -A /dev/md2 /dev/sdb2 /dev/sdc2 /dev/sdd2 |
| − | *mdadm -A /dev/md3 /dev/ | + | *mdadm -A /dev/md3 /dev/sdb3 /dev/sdc3 /dev/sdd3 /dev/sde3 |
| + | |||
==Erstellen der Datei /etc/mdadm/mdadm.conf== | ==Erstellen der Datei /etc/mdadm/mdadm.conf== | ||
| − | ; | + | ;Für den Betrieb nicht zwingend – legt aber den Gerätenamen fest |
*cd /etc/mdadm | *cd /etc/mdadm | ||
| − | *echo 'DEVICE | + | *echo 'DEVICE partitions' > mdadm.conf |
*mdadm --detail --scan >> mdadm.conf | *mdadm --detail --scan >> mdadm.conf | ||
| + | |||
| + | <code>DEVICE partitions</code> lässt <code>mdadm</code> alle Partitionen aus <code>/proc/partitions</code> durchsuchen. Das ist die übliche Angabe; eine Liste von Gerätemustern ist nur in Sonderfällen nötig. | ||
| + | |||
| + | Nach jeder Änderung muss die Initramfs neu gebaut werden, sonst kennt der Start die Datei nicht: | ||
| + | *update-initramfs -u | ||
| + | |||
| + | Auf Rocky: | ||
| + | *dracut -f | ||
=Arbeiten am Raid= | =Arbeiten am Raid= | ||
| + | |||
==Partition fehlerhaft setzen== | ==Partition fehlerhaft setzen== | ||
*mdadm /dev/md1 -f /dev/sde1 | *mdadm /dev/md1 -f /dev/sde1 | ||
==Partition entfernen== | ==Partition entfernen== | ||
| − | *mdadm /dev/md1 --remove /dev/ | + | *mdadm /dev/md1 --remove /dev/sde1 |
==Partition hinzufügen== | ==Partition hinzufügen== | ||
| − | *mdadm | + | *mdadm /dev/md1 -a /dev/sde4 |
==Raid stoppen== | ==Raid stoppen== | ||
| − | *umount | + | *umount /mnt/raid0 |
*mdadm -S /dev/md0 | *mdadm -S /dev/md0 | ||
==Raid wieder starten== | ==Raid wieder starten== | ||
| − | *mdadm -A /dev/md0 /dev/ | + | *mdadm -A /dev/md0 /dev/sdb1 /dev/sdc1 |
*mount -t ext4 /dev/md0 /mnt/raid0 | *mount -t ext4 /dev/md0 /mnt/raid0 | ||
| Zeile 119: | Zeile 159: | ||
Number Major Minor RaidDevice State | Number Major Minor RaidDevice State | ||
| − | 0 | + | 0 8 17 0 active sync /dev/sdb1 |
| − | 1 | + | 1 8 33 1 active sync /dev/sdc1 |
</pre> | </pre> | ||
==Superblock untersuchen== | ==Superblock untersuchen== | ||
| − | + | Der Superblock liegt auf jeder Partition des Arrays. | |
| − | *mdadm -E /dev/ | + | *mdadm -E /dev/sdd1 |
<pre> | <pre> | ||
| − | /dev/ | + | /dev/sdd1: |
Magic : a92b4efc | Magic : a92b4efc | ||
Version : 1.2 | Version : 1.2 | ||
| Zeile 156: | Zeile 196: | ||
</pre> | </pre> | ||
| − | == | + | Zu beachten: <code>mdadm -D</code> fragt das '''Array''' ab, <code>mdadm -E</code> die einzelne '''Partition'''. Ist ein Array nicht zusammengebaut, hilft nur <code>-E</code>. |
| − | *mdadm - | + | |
| − | + | ==Alle Geräte durchsuchen und ein bestimmtes Array zusammenbauen== | |
| − | *mdadm - | + | Gesucht wird nach der Array-UUID bzw. dem Namen aus dem Superblock – hier <code>rechnername:0</code>: |
| + | *mdadm -A --scan /dev/md0 | ||
| + | |||
| + | Entsprechend für md1: | ||
| + | *mdadm -A --scan /dev/md1 | ||
| + | |||
| + | Alle bekannten Arrays auf einmal: | ||
| + | *mdadm -A --scan | ||
==Konfiguration updaten== | ==Konfiguration updaten== | ||
| − | *mdadm -Ds > /etc/mdadm.conf | + | Die alten <code>ARRAY</code>-Zeilen zuerst entfernen, sonst stehen sie doppelt in der Datei. Mit <code>></code> statt <code>>></code> würden auch <code>DEVICE</code>-, <code>HOMEHOST</code>- und <code>MAILADDR</code>-Zeilen verschwinden. |
| + | *sed -i '/^ARRAY/d' /etc/mdadm/mdadm.conf | ||
| + | *mdadm -Ds >> /etc/mdadm/mdadm.conf | ||
| + | *update-initramfs -u | ||
| + | |||
==Superblock löschen== | ==Superblock löschen== | ||
| − | *mdadm --zero-superblock /dev/ | + | Entfernt die RAID-Metadaten von der Partition, damit sie nicht wieder als Mitglied erkannt wird. Das Array muss vorher gestoppt sein. |
| + | *mdadm --zero-superblock /dev/sde1 | ||
| − | == | + | ==Ein unvollständiges Array starten== |
| − | *mdadm --run /dev/ | + | Startet ein Array, dem Mitglieder fehlen und das deshalb nicht von allein anläuft: |
| − | == | + | *mdadm -A --run /dev/md1 |
| − | *mdadm --readwrite /dev/ | + | |
| + | ==Ein Array schreibbar setzen== | ||
| + | Holt ein Array aus dem Zustand ''read-only'' zurück: | ||
| + | *mdadm --readwrite /dev/md1 | ||
=Synchronisationsgeschwindigkeit anzeigen= | =Synchronisationsgeschwindigkeit anzeigen= | ||
*cat /proc/sys/dev/raid/speed_limit_max | *cat /proc/sys/dev/raid/speed_limit_max | ||
200000 | 200000 | ||
| − | + | *cat /proc/sys/dev/raid/speed_limit_min | |
1000 | 1000 | ||
| − | + | ||
| − | + | Erhöhen: | |
| + | *echo 50000 > /proc/sys/dev/raid/speed_limit_min | ||
| + | |||
| + | Die Werte stehen in KiB/s je Platte und gelten nur bis zum nächsten Start. Dauerhaft über <code>/etc/sysctl.d/</code>: | ||
| + | *dev.raid.speed_limit_min = 50000 | ||
| + | |||
=Raid 5 vergrössern= | =Raid 5 vergrössern= | ||
| + | ;Eigenständige Übung – vorher vorhandene Arrays stoppen und Superblöcke löschen | ||
| + | |||
==Erstellen des RAID 5 Arrays== | ==Erstellen des RAID 5 Arrays== | ||
| − | *mdadm -C /dev/md2 -l 5 -n 3 /dev/ | + | *mdadm -C /dev/md2 -l 5 -n 3 /dev/sdb2 /dev/sdc2 /dev/sdd2 |
*mkdir /mnt/raid5 | *mkdir /mnt/raid5 | ||
*mkfs.ext4 /dev/md2 | *mkfs.ext4 /dev/md2 | ||
*mount /dev/md2 /mnt/raid5 | *mount /dev/md2 /mnt/raid5 | ||
| + | |||
==Hinzufügen der zusätzlichen Festplatte== | ==Hinzufügen der zusätzlichen Festplatte== | ||
| − | *mdadm --add /dev/md2 /dev/ | + | *mdadm --add /dev/md2 /dev/sde2 |
| + | |||
==Erweitern des RAID 5 Arrays== | ==Erweitern des RAID 5 Arrays== | ||
| − | *mdadm --grow /dev/md2 --raid-devices=4 | + | Beim Reshape werden die Daten über die Platten umverteilt. <code>--backup-file</code> sichert dabei den kritischen Bereich und muss '''außerhalb''' des Arrays liegen. Bricht der Vorgang ab, wird diese Datei zur Wiederaufnahme gebraucht. |
| + | *mdadm --grow /dev/md2 --raid-devices=4 --backup-file=/root/md2.backup | ||
| + | |||
==Überprüfen des Fortschritts der Erweiterung== | ==Überprüfen des Fortschritts der Erweiterung== | ||
*watch cat /proc/mdstat | *watch cat /proc/mdstat | ||
| + | |||
==Vergrößern des Dateisystems== | ==Vergrößern des Dateisystems== | ||
| + | Erst wenn der Reshape abgeschlossen ist: | ||
*resize2fs /dev/md2 | *resize2fs /dev/md2 | ||
| + | |||
==Überprüfen des neuen Speicherplatzes== | ==Überprüfen des neuen Speicherplatzes== | ||
*df -h /mnt/raid5 | *df -h /mnt/raid5 | ||
| + | |||
=Raid 10 vergrössern= | =Raid 10 vergrössern= | ||
| + | ;Eigenständige Übung – vorher vorhandene Arrays stoppen und Superblöcke löschen | ||
| + | |||
==Erstellen des RAID 10 Arrays== | ==Erstellen des RAID 10 Arrays== | ||
*mdadm -C /dev/md3 -l 10 -n 4 /dev/sdb3 /dev/sdc3 /dev/sdd3 /dev/sde3 | *mdadm -C /dev/md3 -l 10 -n 4 /dev/sdb3 /dev/sdc3 /dev/sdd3 /dev/sde3 | ||
| Zeile 200: | Zeile 272: | ||
*mkfs.ext4 /dev/md3 | *mkfs.ext4 /dev/md3 | ||
*mount /dev/md3 /mnt/raid10 | *mount /dev/md3 /mnt/raid10 | ||
| + | |||
==Hinzufügen der zusätzlichen Festplatten== | ==Hinzufügen der zusätzlichen Festplatten== | ||
| + | RAID 10 wächst paarweise – es kommen zwei Platten auf einmal dazu. | ||
*mdadm --add /dev/md3 /dev/sdb4 | *mdadm --add /dev/md3 /dev/sdb4 | ||
*mdadm --add /dev/md3 /dev/sdc4 | *mdadm --add /dev/md3 /dev/sdc4 | ||
| + | |||
==Erweitern des RAID 10 Arrays== | ==Erweitern des RAID 10 Arrays== | ||
*mdadm --grow /dev/md3 --raid-devices=6 | *mdadm --grow /dev/md3 --raid-devices=6 | ||
| + | |||
==Überprüfen des Fortschritts der Erweiterung== | ==Überprüfen des Fortschritts der Erweiterung== | ||
*watch cat /proc/mdstat | *watch cat /proc/mdstat | ||
| + | |||
==Vergrößern des Dateisystems== | ==Vergrößern des Dateisystems== | ||
*resize2fs /dev/md3 | *resize2fs /dev/md3 | ||
| + | |||
==Überprüfen des neuen Speicherplatzes== | ==Überprüfen des neuen Speicherplatzes== | ||
*df -h /mnt/raid10 | *df -h /mnt/raid10 | ||
| + | |||
=Migrieren eines RAID 1 Arrays in ein RAID 5 Array= | =Migrieren eines RAID 1 Arrays in ein RAID 5 Array= | ||
| + | ;Eigenständige Übung – vorher vorhandene Arrays stoppen und Superblöcke löschen | ||
| + | |||
==Erstellen des RAID 1 Arrays== | ==Erstellen des RAID 1 Arrays== | ||
*mdadm -C /dev/md1 -l 1 -n 2 /dev/sdb1 /dev/sdc1 | *mdadm -C /dev/md1 -l 1 -n 2 /dev/sdb1 /dev/sdc1 | ||
| Zeile 220: | Zeile 301: | ||
==Migration des RAID 1 Arrays in ein RAID 5 Array== | ==Migration des RAID 1 Arrays in ein RAID 5 Array== | ||
*mdadm --add /dev/md1 /dev/sdd1 | *mdadm --add /dev/md1 /dev/sdd1 | ||
| − | *mdadm --grow /dev/md1 --level=5 --raid-devices=3 | + | *mdadm --grow /dev/md1 --level=5 --raid-devices=3 --backup-file=/root/md1.backup |
==Überprüfen des Fortschritts der Migration== | ==Überprüfen des Fortschritts der Migration== | ||
*watch cat /proc/mdstat | *watch cat /proc/mdstat | ||
| − | == | + | ==Vergrößern des Dateisystems== |
| + | Erst nach abgeschlossener Migration: | ||
*resize2fs /dev/md1 | *resize2fs /dev/md1 | ||
| − | ==Überprüfen des neuen | + | ==Überprüfen des neuen Speicherplatzes== |
*df -h /mnt/raid1 | *df -h /mnt/raid1 | ||
==Überprüfen der RAID-Details== | ==Überprüfen der RAID-Details== | ||
*mdadm --detail /dev/md1 | *mdadm --detail /dev/md1 | ||
| + | |||
| + | Der Gerätename bleibt <code>/dev/md1</code>, obwohl darin jetzt ein RAID 5 liegt – die Nummer sagt nichts über das Level aus. | ||
| + | |||
| + | =Aufräumen= | ||
| + | Nach einer Übung wird das Array vollständig abgebaut, damit die Partitionen für die nächste frei sind. | ||
| + | *umount /mnt/raid0 | ||
| + | *mdadm -S /dev/md0 | ||
| + | *mdadm --zero-superblock /dev/sdb1 /dev/sdc1 | ||
| + | *wipefs -a /dev/sdb1 /dev/sdc1 | ||
| + | |||
| + | =Wann wipefs nötig ist= | ||
| + | <code>wipefs</code> löscht die Signaturen am Anfang eines Blockgeräts – Dateisystem-Magic, LVM-Label, Partitionstabellen und RAID-Metadaten. Gebraucht wird es an drei Stellen: | ||
| + | |||
| + | *'''Vor dem Anlegen''' eines Arrays auf Partitionen, die vorher ein Dateisystem oder LVM getragen haben. <code>mdadm</code> erkennt die Reste und fragt nach; mit sauberen Partitionen läuft der Befehl ohne Rückfrage durch. | ||
| + | *'''Nach dem Abbau''' eines Arrays, wenn die Partitionen anderweitig verwendet werden sollen. <code>--zero-superblock</code> entfernt nur die RAID-Metadaten – ein Dateisystem, das vorher auf dem Array lag, hinterlässt seine Signatur auf dem Array-Gerät, nicht auf den Mitgliedern. | ||
| + | *'''Bei hartnäckigen Resten''', wenn <code>mkfs</code> oder <code>pvcreate</code> melden, das Gerät sei bereits in Verwendung. | ||
| + | |||
| + | Ohne Argumente zeigt <code>wipefs</code> nur an, was gefunden wurde, und ändert nichts – der sichere erste Schritt: | ||
| + | *wipefs /dev/sdb1 | ||
| + | |||
| + | Löschen aller Signaturen: | ||
| + | *wipefs -a /dev/sdb1 | ||
| + | |||
| + | '''Achtung:''' <code>wipefs -a</code> auf die ganze Platte (<code>/dev/sdb</code>) entfernt die Partitionstabelle mitsamt allen Partitionen. Immer die Partition angeben. | ||
| + | |||
| + | Für RAID-Mitglieder ist die Reihenfolge: erst <code>mdadm -S</code>, dann <code>--zero-superblock</code>, dann bei Bedarf <code>wipefs -a</code>. | ||
=SATA RAID= | =SATA RAID= | ||
*https://wiki.debian.org/DebianInstaller/SataRaid | *https://wiki.debian.org/DebianInstaller/SataRaid | ||
Aktuelle Version vom 26. August 2026, 08:20 Uhr
Einrichten
Installation
Debian:
- apt-get install mdadm
Rocky:
- dnf install mdadm
Vorbereitung der Partitionen
Die Partitionen bekommen den Typ Linux RAID – fd00 bei GPT (gdisk), fd bei MBR (fdisk). Der Typ ist heute nur noch eine Kennzeichnung für den Betrachter; zusammengebaut wird das Array über die Metadaten, nicht über den Typ.
Lagen auf den Partitionen vorher Dateisysteme, LVM-Strukturen oder ein altes RAID, werden die Signaturen entfernt. Sonst warnt mdadm beim Anlegen und fragt nach:
- wipefs -a /dev/sdb1 /dev/sdc1
Raid 0
- mdadm -C /dev/md0 -l 0 -n 2 /dev/sdb1 /dev/sdc1
Raid 1
- mdadm -C /dev/md1 -l 1 -n 2 /dev/sdd1 /dev/sde1
Raid 5
- mdadm -C /dev/md2 -l 5 -n 3 /dev/sdb2 /dev/sdc2 /dev/sdd2
Raid 10
- mdadm -C /dev/md3 -l 10 -n 4 /dev/sdb3 /dev/sdc3 /dev/sdd3 /dev/sde3
Mit Sparedisks
-x gibt die Zahl der Reserveplatten an. Sie laufen im Normalbetrieb leer mit und springen bei einem Ausfall automatisch ein.
- mdadm -C /dev/md3 -l 10 -n 4 -x 2 /dev/sdb3 /dev/sdc3 /dev/sdd3 /dev/sde3 /dev/sdb4 /dev/sdc4
Mountpoints erzeugen
- mkdir /mnt/raid{0,1,5,10}
Dateisystem aufbringen
- mkfs.ext4 /dev/md0
- mkfs.ext4 /dev/md1
- mkfs.ext4 /dev/md2
- mkfs.ext4 /dev/md3
Mounten
- mount /dev/md0 /mnt/raid0
- mount /dev/md1 /mnt/raid1
- mount /dev/md2 /mnt/raid5
- mount /dev/md3 /mnt/raid10
Verfügbarer Speicher
- df -h -t ext4
Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf /dev/sda1 50G 25G 23G 53% / /dev/md0 20G 24K 19G 1% /mnt/raid0 /dev/md1 9,8G 24K 9,3G 1% /mnt/raid1 /dev/md2 20G 24K 19G 1% /mnt/raid5 /dev/md3 20G 24K 19G 1% /mnt/raid10
Die Netto-Größen zeigen die Rechnung der Level: RAID 0 aus 2 × 10 GiB ergibt 20 GiB, RAID 1 aus 2 × 10 GiB nur 10 GiB, RAID 5 aus 3 × 10 GiB ergibt 20 GiB (eine Platte geht für die Parität), RAID 10 aus 4 × 10 GiB ebenfalls 20 GiB.
Geschwindigkeitsmessung
Die Zieldatei muss auf dem gemessenen Array liegen – sonst misst man die Systemplatte.
- dd if=/dev/zero of=/mnt/raid0/tempfile bs=1M count=1024 conv=fdatasync,notrunc
Während ein Array noch synchronisiert, sind die Messwerte nicht aussagekräftig.
Kontrolle
- cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md3 : active raid10 sde3[3] sdd3[2] sdc3[1] sdb3[0]
20953088 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]
[=============>.......] resync = 68.4% (14344640/20953088) finish=0.5min speed=202328K/sec
md2 : active raid5 sdd2[3] sdc2[1] sdb2[0]
20953088 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
md1 : active raid1 sde1[1] sdd1[0]
10476544 blocks super 1.2 [2/2] [UU]
md0 : active raid0 sdc1[1] sdb1[0]
20953088 blocks super 1.2 512k chunks
[4/4] bedeutet: vier von vier Mitgliedern vorhanden. Jedes U steht für ein gesundes Mitglied, ein _ für ein fehlendes.
Bootvorgang
- Die Konfiguration jedes Mitglieds steht im persistenten Superblock auf der Partition selbst: Level, Array-UUID, Rolle im Verbund und der Name in der Form
rechnername:0. - Der Zusammenbau erfolgt beim Start durch udev und
mdadm, in der Regel schon aus der Initramfs heraus. - Ergänzend wird
/etc/mdadm/mdadm.conf(Debian) bzw./etc/mdadm.conf(Rocky) ausgewertet. Die Datei ist nicht nötig, damit das Array überhaupt entsteht – sie legt den Gerätenamen fest. - Ohne passenden Eintrag kann ein Array unter einem beliebigen Namen aus dem oberen Bereich erscheinen, typischerweise
/dev/md127. Steht in/etc/fstabdann/dev/md0, schlägt das Mounten fehl. In der fstab arbeitet man deshalb besser mitUUID=. - Der Partitionstyp
0xFDspielt dabei keine Rolle mehr. Die automatische Erkennung über den Typ (in-kernel autodetect) gilt nur für die alten Metadaten der Version 0.90;mdadmlegt seit Langem Version 1.2 an.
Manuelles Zusammenbauen
- mdadm -A /dev/md0 /dev/sdb1 /dev/sdc1
- mdadm -A /dev/md1 /dev/sdd1 /dev/sde1
- mdadm -A /dev/md2 /dev/sdb2 /dev/sdc2 /dev/sdd2
- mdadm -A /dev/md3 /dev/sdb3 /dev/sdc3 /dev/sdd3 /dev/sde3
Erstellen der Datei /etc/mdadm/mdadm.conf
- Für den Betrieb nicht zwingend – legt aber den Gerätenamen fest
- cd /etc/mdadm
- echo 'DEVICE partitions' > mdadm.conf
- mdadm --detail --scan >> mdadm.conf
DEVICE partitions lässt mdadm alle Partitionen aus /proc/partitions durchsuchen. Das ist die übliche Angabe; eine Liste von Gerätemustern ist nur in Sonderfällen nötig.
Nach jeder Änderung muss die Initramfs neu gebaut werden, sonst kennt der Start die Datei nicht:
- update-initramfs -u
Auf Rocky:
- dracut -f
Arbeiten am Raid
Partition fehlerhaft setzen
- mdadm /dev/md1 -f /dev/sde1
Partition entfernen
- mdadm /dev/md1 --remove /dev/sde1
Partition hinzufügen
- mdadm /dev/md1 -a /dev/sde4
Raid stoppen
- umount /mnt/raid0
- mdadm -S /dev/md0
Raid wieder starten
- mdadm -A /dev/md0 /dev/sdb1 /dev/sdc1
- mount -t ext4 /dev/md0 /mnt/raid0
Raid Info
- mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Thu Mar 3 09:55:06 2022
Raid Level : raid0
Array Size : 20953088 (19.98 GiB 21.46 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Update Time : Thu Mar 3 09:55:06 2022
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Layout : -unknown-
Chunk Size : 512K
Consistency Policy : none
Name : debian-template:0 (local to host debian-template)
UUID : 3b7816b2:787704c6:db24d9de:55dbcfe8
Events : 0
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 33 1 active sync /dev/sdc1
Superblock untersuchen
Der Superblock liegt auf jeder Partition des Arrays.
- mdadm -E /dev/sdd1
/dev/sdd1:
Magic : a92b4efc
Version : 1.2
Feature Map : 0x0
Array UUID : 1568fb90:9dd8bc83:f06bc9fe:2dcba200
Name : debian-template:1 (local to host debian-template)
Creation Time : Thu Mar 3 09:58:15 2022
Raid Level : raid1
Raid Devices : 2
Avail Dev Size : 20953088 (9.99 GiB 10.73 GB)
Array Size : 10476544 (9.99 GiB 10.73 GB)
Data Offset : 18432 sectors
Super Offset : 8 sectors
Unused Space : before=18280 sectors, after=0 sectors
State : clean
Device UUID : 8e4801ba:56f5569e:8e03aa0e:e73190c6
Update Time : Thu Mar 3 10:33:11 2022
Bad Block Log : 512 entries available at offset 136 sectors
Checksum : 360eb7a9 - correct
Events : 45
Device Role : Active device 0
Array State : AA ('A' == active, '.' == missing, 'R' == replacing)
Zu beachten: mdadm -D fragt das Array ab, mdadm -E die einzelne Partition. Ist ein Array nicht zusammengebaut, hilft nur -E.
Alle Geräte durchsuchen und ein bestimmtes Array zusammenbauen
Gesucht wird nach der Array-UUID bzw. dem Namen aus dem Superblock – hier rechnername:0:
- mdadm -A --scan /dev/md0
Entsprechend für md1:
- mdadm -A --scan /dev/md1
Alle bekannten Arrays auf einmal:
- mdadm -A --scan
Konfiguration updaten
Die alten ARRAY-Zeilen zuerst entfernen, sonst stehen sie doppelt in der Datei. Mit > statt >> würden auch DEVICE-, HOMEHOST- und MAILADDR-Zeilen verschwinden.
- sed -i '/^ARRAY/d' /etc/mdadm/mdadm.conf
- mdadm -Ds >> /etc/mdadm/mdadm.conf
- update-initramfs -u
Superblock löschen
Entfernt die RAID-Metadaten von der Partition, damit sie nicht wieder als Mitglied erkannt wird. Das Array muss vorher gestoppt sein.
- mdadm --zero-superblock /dev/sde1
Ein unvollständiges Array starten
Startet ein Array, dem Mitglieder fehlen und das deshalb nicht von allein anläuft:
- mdadm -A --run /dev/md1
Ein Array schreibbar setzen
Holt ein Array aus dem Zustand read-only zurück:
- mdadm --readwrite /dev/md1
Synchronisationsgeschwindigkeit anzeigen
- cat /proc/sys/dev/raid/speed_limit_max
200000
- cat /proc/sys/dev/raid/speed_limit_min
1000
Erhöhen:
- echo 50000 > /proc/sys/dev/raid/speed_limit_min
Die Werte stehen in KiB/s je Platte und gelten nur bis zum nächsten Start. Dauerhaft über /etc/sysctl.d/:
- dev.raid.speed_limit_min = 50000
Raid 5 vergrössern
- Eigenständige Übung – vorher vorhandene Arrays stoppen und Superblöcke löschen
Erstellen des RAID 5 Arrays
- mdadm -C /dev/md2 -l 5 -n 3 /dev/sdb2 /dev/sdc2 /dev/sdd2
- mkdir /mnt/raid5
- mkfs.ext4 /dev/md2
- mount /dev/md2 /mnt/raid5
Hinzufügen der zusätzlichen Festplatte
- mdadm --add /dev/md2 /dev/sde2
Erweitern des RAID 5 Arrays
Beim Reshape werden die Daten über die Platten umverteilt. --backup-file sichert dabei den kritischen Bereich und muss außerhalb des Arrays liegen. Bricht der Vorgang ab, wird diese Datei zur Wiederaufnahme gebraucht.
- mdadm --grow /dev/md2 --raid-devices=4 --backup-file=/root/md2.backup
Überprüfen des Fortschritts der Erweiterung
- watch cat /proc/mdstat
Vergrößern des Dateisystems
Erst wenn der Reshape abgeschlossen ist:
- resize2fs /dev/md2
Überprüfen des neuen Speicherplatzes
- df -h /mnt/raid5
Raid 10 vergrössern
- Eigenständige Übung – vorher vorhandene Arrays stoppen und Superblöcke löschen
Erstellen des RAID 10 Arrays
- mdadm -C /dev/md3 -l 10 -n 4 /dev/sdb3 /dev/sdc3 /dev/sdd3 /dev/sde3
- mkdir /mnt/raid10
- mkfs.ext4 /dev/md3
- mount /dev/md3 /mnt/raid10
Hinzufügen der zusätzlichen Festplatten
RAID 10 wächst paarweise – es kommen zwei Platten auf einmal dazu.
- mdadm --add /dev/md3 /dev/sdb4
- mdadm --add /dev/md3 /dev/sdc4
Erweitern des RAID 10 Arrays
- mdadm --grow /dev/md3 --raid-devices=6
Überprüfen des Fortschritts der Erweiterung
- watch cat /proc/mdstat
Vergrößern des Dateisystems
- resize2fs /dev/md3
Überprüfen des neuen Speicherplatzes
- df -h /mnt/raid10
Migrieren eines RAID 1 Arrays in ein RAID 5 Array
- Eigenständige Übung – vorher vorhandene Arrays stoppen und Superblöcke löschen
Erstellen des RAID 1 Arrays
- mdadm -C /dev/md1 -l 1 -n 2 /dev/sdb1 /dev/sdc1
- mkdir /mnt/raid1
- mkfs.ext4 /dev/md1
- mount /dev/md1 /mnt/raid1
Migration des RAID 1 Arrays in ein RAID 5 Array
- mdadm --add /dev/md1 /dev/sdd1
- mdadm --grow /dev/md1 --level=5 --raid-devices=3 --backup-file=/root/md1.backup
Überprüfen des Fortschritts der Migration
- watch cat /proc/mdstat
Vergrößern des Dateisystems
Erst nach abgeschlossener Migration:
- resize2fs /dev/md1
Überprüfen des neuen Speicherplatzes
- df -h /mnt/raid1
Überprüfen der RAID-Details
- mdadm --detail /dev/md1
Der Gerätename bleibt /dev/md1, obwohl darin jetzt ein RAID 5 liegt – die Nummer sagt nichts über das Level aus.
Aufräumen
Nach einer Übung wird das Array vollständig abgebaut, damit die Partitionen für die nächste frei sind.
- umount /mnt/raid0
- mdadm -S /dev/md0
- mdadm --zero-superblock /dev/sdb1 /dev/sdc1
- wipefs -a /dev/sdb1 /dev/sdc1
Wann wipefs nötig ist
wipefs löscht die Signaturen am Anfang eines Blockgeräts – Dateisystem-Magic, LVM-Label, Partitionstabellen und RAID-Metadaten. Gebraucht wird es an drei Stellen:
- Vor dem Anlegen eines Arrays auf Partitionen, die vorher ein Dateisystem oder LVM getragen haben.
mdadmerkennt die Reste und fragt nach; mit sauberen Partitionen läuft der Befehl ohne Rückfrage durch. - Nach dem Abbau eines Arrays, wenn die Partitionen anderweitig verwendet werden sollen.
--zero-superblockentfernt nur die RAID-Metadaten – ein Dateisystem, das vorher auf dem Array lag, hinterlässt seine Signatur auf dem Array-Gerät, nicht auf den Mitgliedern. - Bei hartnäckigen Resten, wenn
mkfsoderpvcreatemelden, das Gerät sei bereits in Verwendung.
Ohne Argumente zeigt wipefs nur an, was gefunden wurde, und ändert nichts – der sichere erste Schritt:
- wipefs /dev/sdb1
Löschen aller Signaturen:
- wipefs -a /dev/sdb1
Achtung: wipefs -a auf die ganze Platte (/dev/sdb) entfernt die Partitionstabelle mitsamt allen Partitionen. Immer die Partition angeben.
Für RAID-Mitglieder ist die Reihenfolge: erst mdadm -S, dann --zero-superblock, dann bei Bedarf wipefs -a.