Mdadm Howto

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen

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/fstab dann /dev/md0, schlägt das Mounten fehl. In der fstab arbeitet man deshalb besser mit UUID=.
  • Der Partitionstyp 0xFD 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; mdadm legt 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. mdadm 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. --zero-superblock 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 mkfs oder pvcreate melden, 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.

SATA RAID