Linux Raid - defekte (failed) Partition/Festplatte wechseln

Wer ein Software-RAID 1 unter Linux betreibt, der wird über kurz oder lang an den Punkt kommen, dass ein Mitglied des RAID Arrays ausfällt und als fail deklariert wird. In diesem Fall ist das System der Meinung, dass die Festplatte oder eine bestimmte Partition ausgefallen ist und weigert sich, das ausgefallene Mitglied wieder in den Verbund aufzunehmen. Aber keine Panik: das Software-Paket von mdadm bringt zahlreiche nützliche Tools mit, um den Fehler zu korrigieren, notfalls die fehlerhaften Partitionen bzw. die defekte Festplatte zu ersetzen und diese während des laufenden Betriebs (hot remove, hot add) zu wechseln.

In diesem Artikel wird eine mögliche Vorgehensweise für das "hot remove / add" gezeigt, um dem Benutzer Angst vor diesem heiklen EIngriff zu nehmen und Komplettausfälle durch fehlerhaftes Benutzerverhalten zu verhindern.

Software RAID: Ausfall erkennen

Einen Ausfall im RAID erkennt man durch die Ausgabe von /proc/mdstat:

# cat /proc/mdstat
Personalities : [raid1]
md126 : active raid1 sdc1[1] sdb1[0]
      104320 blocks [2/2] [UU]

md1 : active raid1 sdc2[1] sdb2[0]
      1003968 blocks [2/2] [UU]

md127 : active raid1 sdc3[2](F) sdb3[0]
      77039616 blocks [2/1] [U_]

unused devices: <none>

In diesem Beispiel erkennt man, dass die Partition /dev/sdc3 fehlerhaft und ausgefallen ist. sdc3 + sdb3 bilden die Raid-Partition /dev/md127.

1. Versuch: ausgefallen Partition wieder hinzufügen (re-add)

Zuerst sollte geprüft werden, ob die betroffene Partition / Festplatte wirklich defekt ist. Neben dem obligatorischen Blick in dmesg sollte der Hardware-Status (S.M.A.R.T) der Festplatte analysiert werden. Dazu verwendet man das Tool smartctl aus dem Paket smartmontools:

# smartctl -A -H /dev/sdc
smartctl version 5.36 [x86_64-pc-linux-gnu] Copyright (C) 2002-6 Bruce Allen
Home page is smartmontools.sourceforge.net

SMART Health Status: OK

In diesem Fall ist die Festplatte physikalisch in Ordnung, so dass man die ausgefallene Partition wieder zu dem Array hinzufügen kann:

# 1. Schritt: Sicherheitshalber die Partition als failed deklarieren
mdadm --manage /dev/md127 --fail /dev/sdc3

# 2. Schritt: failed Partition aus dem bestehenden RAID-Verbund entfernen
mdadm --manage /dev/md127 --remove /dev/sdc3

# 3. Schritt: Partition wieder hinzufügen
mdadm --manage /dev/md127 --re-add /dev/sdc3

 Ein kurzer Blick auf den Rebuild-Status zeigt, dass die Partition gespiegelt wird:

# watch cat /proc/mdstat
md126 : active raid1 sdc1[1] sdb1[0]
104320 blocks [2/2] [UU]

md1 : active raid1 sdc2[1] sdb2[0]
1003968 blocks [2/2] [UU]

md127 : active raid1 sdc3[2] sdb3[0]
77039616 blocks [2/1] [U_]
[=============>.......] recovery = 65.7% (50632576/77039616) finish=32.7min speed=13416K/sec

unused devices: <none>

Anschließend sollte der Status des RAID fehlerfrei sein.

2. Versuch: Festplatte/Partition on-the-fly ersetzen

Hat die Festplatte einen ernsthaften Schaden, so sollte diese schnellstmöglich ersetzt werden. In diesem Beispiel wird gezeigt, wie die Festplatte während des Betriebs ersetzt.

Hinweis: es ist bereits eine Ersatzfestplatte eingebaut, was auch nachträglich erfolgen kann. In diesem Fall entfernt man zuerst die fehlerhafte Festplatte, ersetzt die eingebaute Festplatte und fügt die neue dem RAID-Verbund hinzu.

Die (etwas ungewöhnliche) Ausgangssituation:

/dev/sda -> Ersatzfestplatte 
/dev/sdb -> Aktiv
/dev/sdc -> Aktiv und defekte Partition

sdb + sdc bilden folgendes RAID Array

# cat /proc/mdstat 
Personalities : [raid1]
md126 : active raid1 sdc1[1] sdb1[0]
      104320 blocks [2/2] [UU]

md1 : active raid1 sdc2[1] sdb2[0]
      1003968 blocks [2/2] [UU]

md127 : active raid1 sdc3[2](F) sdb3[0]
      77039616 blocks [2/1] [U_]

unused devices: <none>

/dev/sdc ist feherhaft und wird durch /dev/sda ersetzt. Hier die Ausgabe von fdisk:

# fdisk -l 

Disk /dev/sda: 82.3 GB, 82348277760 bytes
255 heads, 63 sectors/track, 10011 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x3f6445f4

   Device Boot      Start         End      Blocks   Id  System

Disk /dev/sdb: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x5db2d17c

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1          13      104391   fd  Linux raid autodetect
/dev/sdb2              14         138     1004062+  fd  Linux raid autodetect
/dev/sdb3             139        9729    77039707+  fd  Linux raid autodetect

Disk /dev/sdc: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x5db2d17c

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1          13      104391   fd  Linux raid autodetect
/dev/sdc2              14         138     1004062+  fd  Linux raid autodetect
/dev/sdc3             139        9729    77039707+  fd  Linux raid autodetect

Disk /dev/md127: 78.9 GB, 78888566784 bytes
2 heads, 4 sectors/track, 19259904 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/md127 doesn't contain a valid partition table

Disk /dev/md1: 1028 MB, 1028063232 bytes
2 heads, 4 sectors/track, 250992 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/md1 doesn't contain a valid partition table

Disk /dev/md126: 106 MB, 106823680 bytes
2 heads, 4 sectors/track, 26080 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/md126 doesn't contain a valid partition table

Festplatte ersetzen - Vorgehensweise:

Ziel: /dev/sdc durch /dev/sda ersetzen

1. /dev/sdc als fail deklarieren

mdadm --manage /dev/md126 --fail /dev/sdc1 
mdadm --manage /dev/md1   --fail /dev/sdc2
mdadm --manage /dev/md127 --fail /dev/sdc3

2. /dev/sdc entfernen

mdadm --manage /dev/md126 --remove /dev/sdc1 
mdadm --manage /dev/md1   --remove /dev/sdc2
mdadm --manage /dev/md127 --remove /dev/sdc3

3. Partitionierung von bestehender Festplatte kopieren

sfdisk -d /dev/sdb | sfdisk /dev/sda

4. Bootloader (MBR) von bestehender Festplatte kopieren

dd if=/dev/sdb of=/dev/sda bs=512 count=1

5. /dev/sda zum Raid hinzufügen

mdadm --manage /dev/md126 --add /dev/sda1 
mdadm --manage /dev/md1 --add /dev/sda2
mdadm --manage /dev/md127 --add /dev/sda3

Wie bereits erwähnt ist die Austauschfestplatte bereits im System vorhanden. Wer vorher eine Ersatzfestplatte einbauen muss, geht wie chronologisch wie folgt vor:

  • Schritt 1-2
  • Neustart, defekte Festplatte austauschen
  • Schritt 3-5

Ergänzung des Lesers Brian

Wenn man einen hotplugfähigen SCSI-Controller mit z. B. SCA-Schnittstelle hat, so kann man unter Linux die Festplatte im Laufenden Betrieb tauschen. Hierzu kennt der Linux-Kernel entsprechende Befehle.

Aktuelle Festplattenzuordung auflisten:
cat /proc/scsi/scsi

Festplatte "entbinden":
echo "scsi remove-single-device 4 0 8 0" > /proc/scsi/scsi

Bedeutung der Ziffern im Beispiel:

HOST 4
CHAN 0
DEV  8
LUN  0

Festplatte nach Austauschen wieder einbinden:

echo "scsi add-single-device 4 0 8 0" > /proc/scsi/scsi

Ich habe das auf einem Dell PowerEdge 4600 mit installiertem debian getestet. Falls es dennoch nicht funkioneren sollte, kann das eventuell an der Syntax liegen: http://lists.us.dell.com/pipermail/linux-poweredge/2002-September/004151.html