Gerät in MD-RAID ausfallen, wenn ATA nicht mehr reagiert

1545
Deltik

Ich hatte erstellt fünf 1TB HDD Partitionen ( /dev/sda1, /dev/sdb1, /dev/sdc1, /dev/sde1, und /dev/sdf1) in einem RAID 6 Array namens /dev/md0mit mdadmauf Ubuntu 14.04 LTS Trusty Tahr.

Mit dem Befehl sudo mdadm --detail /dev/md0werden alle Laufwerke in aktiver Synchronisierung angezeigt .

Dann testete ich zum Testen lange E / A-Blockierungen, /dev/sdbindem ich diese Befehle ausführte, während /dev/sdb1das Array noch aktiv war:

hdparm --user-master u --security-set-pass deltik /dev/sdb hdparm --user-master u --security-erase-enhanced deltik /dev/sdb 

WARNUNG

VERSUCHEN SIE DIESES NICHT AUF DATEN, DIE SIE ÜBERNEHMEN!
Am Ende habe ich 455681 Inodes durch diese ATA-Operation beschädigt. Ich gebe meine Nachlässigkeit zu.

Es wurde erwartet, dass der ATA-Befehl zum sicheren Löschen 188 Minuten lang ausgeführt wurde und alle anderen Befehle mindestens so lange blockiert.

Ich hatte erwartet md, das nicht reagierende Laufwerk wie ein richtiger RAID-Controller fallen zu lassen, wurde aber zu meiner Überraschung ebenfalls /dev/md0blockiert.

mdadm --detail /dev/md0 fragt das blockierte Gerät ab, damit es einfriert und nicht ausgegeben wird.

Hier ist das Layout von, /proc/mdstatwährend ich nicht verwenden kann mdadm --detail /dev/md0:

root@node51 [~]# cat /proc/mdstat  Personalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10]  md0 : active raid6 sdf1[5] sda1[0] sdb1[4] sdc1[2] sde1[1] 2929887744 blocks super 1.2 level 6, 512k chunk, algorithm 2 [5/5] [UUUUU]  unused devices: <none> 

Ich habe mdadm /dev/md0 -f /dev/sdb1gewaltsam versucht zu versagen /dev/sdb1, aber das wurde auch blockiert:

root@node51 [~]# ps aux | awk '}'  USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 3334 1.2 0.0 42564 1800 ? D 03:21 3:37 parted -l root 4957 0.0 0.0 13272 900 ? D 06:19 0:00 mdadm /dev/md0 -f /dev/sdb1 root 5706 0.0 0.0 13388 1028 ? D 06:19 0:00 mdadm --detail /dev/md0 root 7541 0.5 0.0 0 0 ? D Jul19 6:12 [kworker/u16:2] root 22420 0.0 0.0 11480 808 ? D 07:48 0:00 lsblk root 22796 0.0 0.0 4424 360 pts/13 D+ 05:51 0:00 hdparm --user-master u --security-erase-enhanced deltik /dev/sdb root 23312 0.0 0.0 4292 360 ? D 05:51 0:00 hdparm -I /dev/sdb root 23594 0.1 0.0 0 0 ? D 06:11 0:07 [kworker/u16:1] root 25205 0.0 0.0 17980 556 ? D 05:52 0:00 ls --color=auto root 26008 0.0 0.0 13388 1032 pts/23 D+ 06:32 0:00 mdadm --detail /dev/md0 dtkms 29271 0.0 0.2 58336 10412 ? DN 05:55 0:00 python /usr/share/backintime/common/backintime.py --backup-job root 32303 0.0 0.0 0 0 ? D 06:16 0:00 [kworker/u16:0] 

UPDATE (21. Juli 2015): Nachdem ich die vollen 188 Minuten gewartet hatte, bis der E / A-Block gelöscht wurde, wurde die Überraschung zu Entsetzen, als ich sah, dass mddas vollständig ausgeblendete Objekt /dev/sdbso behandelt wurde, als wäre es vollständig in Takt.

Ich dachte, mddas hätte zumindest gesehen, dass die Parität nicht passt und dann gesunken wäre /dev/sdb1.

In Panik lief ich mdadm /dev/md0 -f /dev/sdb1wieder, und da der E / A-Block aufgehoben wurde, wurde der Befehl schnell ausgeführt.

Das Dateisystem wurde bereits beschädigt, als Fehler bei der Eingabe / Ausgabe auftraten. Immer noch in Panik versetzt, habe ich die Datenpartition im RAID-Array faul aufgehoben, und reboot -nfda ich dachte, es könnte nicht schlimmer werden.

Nach einer Zitterpartie e2fsckauf der Partition, machte 455.681 Inodes es in lost+found.

Ich habe das Array seitdem wieder zusammengesetzt, und das Array selbst sieht jetzt gut aus:

root@node51 [~]# mdadm --detail /dev/md0 /dev/md0: Version : 1.2 Creation Time : Mon Feb 16 14:34:26 2015 Raid Level : raid6 Array Size : 2929887744 (2794.16 GiB 3000.21 GB) Used Dev Size : 976629248 (931.39 GiB 1000.07 GB) Raid Devices : 5 Total Devices : 5 Persistence : Superblock is persistent  Update Time : Tue Jul 21 00:00:30 2015 State : active  Active Devices : 5 Working Devices : 5 Failed Devices : 0 Spare Devices : 0  Layout : left-symmetric Chunk Size : 512K  Name : box51:0 UUID : 6b8a654d:59deede9:c66bd472:0ceffc61 Events : 643541  Number Major Minor RaidDevice State 0 8 1 0 active sync /dev/sda1 1 8 97 1 active sync /dev/sdg1 2 8 33 2 active sync /dev/sdc1 6 8 17 3 active sync /dev/sdb1 5 8 113 4 active sync /dev/sdh1 

Es ist immer noch ein Schock für mich, dass mdes nicht zwei Schutzlinien gibt, die ich erwartet hatte:

  • Ein Gerät fällt aus, wenn es blockiert
  • Fehler bei einem Gerät, wenn die zurückgegebenen Daten Müll sind

Fragen

  1. Warum fällt das nicht mdreagierende Laufwerk / die nicht Partition nicht aus?
  2. Kann ich das Laufwerk / die Partition aus dem Array löschen, während das Laufwerk blockiert ist?
  3. Kann ein Timeout so konfiguriert werden, dass mdautomatisch ein Laufwerk ausfällt, das nicht auf ATA-Befehle reagiert?
  4. Warum verwendet man mdweiterhin ein Gerät mit ungültigen Daten?
4

1 Antwort auf die Frage

2
Deltik

Deltik, Sie haben falsch verstanden, wie Linux Software RAID ( md) funktioniert.

mdmacht ein virtuelles Blockgerät aus mehreren Geräten oder Partitionen und weiß nicht, welche Daten Sie zum und vom virtuellen Gerät übertragen.
Sie hofften, dass es Dinge tun könnte, für die es nicht vorgesehen war.


Antworten

1. Warum fällt das nicht mdreagierende Laufwerk / die nicht Partition nicht aus?

Das liegt daran, dass mdkeine Ahnung hat, ob

  • Das Laufwerk ist mit E / A von etwas beschäftigt, das mdselbst angefordert wurde
  • Das Laufwerk wurde aufgrund äußerer Umstände wie der Fehlerbehebung des Laufwerks oder in Ihrem Fall eines ATA Secure Erase blockiert.

so mdwird warten, um zu sehen, was die Fahrt zurückkehrt. Das Laufwerk gab schließlich keine Lese- oder Schreibfehler zurück. Wenn ein Lesefehler aufgetreten ist, wurde er mdautomatisch aus der Parität behoben, und wenn ein Schreibfehler aufgetreten ist, mdist das Gerät ausgefallen (siehe Abschnitt "Wiederherstellung" der mdManpage ).

Da weder ein Lesefehler noch ein Schreibfehler aufgetreten ist, mdverwenden Sie das Gerät weiter, nachdem der Kernel auf seine Antwort gewartet hat.

2. Kann ich das Laufwerk / die Partition aus dem Array löschen, während das Laufwerk blockiert ist?

Nein. Das /dev/md0RAID-Gerät ist blockiert und kann nicht geändert werden, bis die Blockierung aufgehoben wird.

Sie haben das Flag -foder --failan den mdadmModus "Verwalten" übergeben.
Hier erfahren Sie, was das tatsächlich macht:

Dies ist der Quellcode, wie dieses Flag funktioniert :

case 'f': /* set faulty */ /* FIXME check current member */ if ((sysfd >= 0 && write(sysfd, "faulty", 6) != 6) || (sysfd < 0 && ioctl(fd, SET_DISK_FAULTY, rdev))) { if (errno == EBUSY) busy = 1; pr_err("set device faulty failed for %s: %s\n", dv->devname, strerror(errno)); if (sysfd >= 0) close(sysfd); goto abort; } if (sysfd >= 0) close(sysfd); sysfd = -1; count++; if (verbose >= 0) pr_err("set %s faulty in %s\n", dv->devname, devname); break; 

Beachten Sie den Anruf write(sysfd, "faulty", 6). sysfdist eine Variable, die zuvor in der Datei festgelegt wurde:
sysfd = sysfs_open(fd2devnm(fd), dname, "block/dev");

sysfs_open()ist eine Funktion aus dieser Datei :

int sysfs_open(char *devnm, char *devname, char *attr) { char fname[50]; int fd;  sprintf(fname, "/sys/block/%s/md/", devnm); if (devname) { strcat(fname, devname); strcat(fname, "/"); } strcat(fname, attr); fd = open(fname, O_RDWR); if (fd < 0 && errno == EACCES) fd = open(fname, O_RDONLY); return fd; } 

Wenn Sie den Funktionen folgen, werden Sie feststellen, dass dies im mdadm /dev/md0 -f /dev/sdb1Wesentlichen Folgendes bewirkt:

echo "faulty" > /sys/block/md0/md/dev-sdb1/block/dev 

Diese Anfrage wird warten und wird nicht sofort durchlaufen, da sie /dev/md0blockiert ist.

3. Kann ein Timeout so konfiguriert werden, dass mdautomatisch ein Laufwerk ausfällt, das nicht auf ATA-Befehle reagiert?

Ja. In der Tat, der Standardeinstellung ist die Timeout 30 Sekunden :

root@node51 [~]# cat /sys/block/sdb/device/timeout 30 

Das Problem mit Ihrer Annahme war, dass Ihr Laufwerk tatsächlich einen ATA-Befehl ausgeführt hat (für 188 Minuten), sodass es nicht zu einem Zeitüberschreitung kam.

Weitere Informationen hierzu finden Sie in der Dokumentation zur Linux-Kernel-SCSI-Fehlerbehandlung .

4. Warum wird mdein Gerät mit ungültigen Daten weiterhin verwendet?

Als der ATA Secure Erase-Vorgang abgeschlossen war, meldete das Laufwerk keine Probleme wie einen abgebrochenen Befehl. Es bestand also mdkein Grund zu der Annahme, dass ein Problem vorliegt.

Ferner wird in Ihrem Fall von Partitionen als die RAID - Geräte anstelle von ganzen Festplatten verwenden, die Kernel im Arbeitsspeicher wurde Partitionstabelle nicht darüber informiert, dass die Partition auf dem abgewischt Laufwerk verschwunden war, so mdwürde auch weiterhin Ihr Zugang /dev/sdb1wie nichts falsch war.

Dies ist aus der mdManpage :

Schrubben und Mismatches

Da Speichergeräte jederzeit fehlerhafte Blöcke entwickeln können, ist es wichtig, alle Blöcke auf allen Geräten in einem Array regelmäßig zu lesen, um solche fehlerhaften Blöcke frühzeitig zu erfassen. Dieser Vorgang wird als Scrubbing bezeichnet .

md-Arrays können gelöscht werden, indem in die Datei md / sync_action im Verzeichnis sysfs für das Gerät entweder " check" oder " repair" geschrieben wird.

Wenn Sie einen Scrub anfordern, liest md jeden Block auf jedem Gerät im Array und prüft, ob die Daten konsistent sind. Für RAID1 und RAID10 bedeutet dies, dass die Kopien identisch sind. Für RAID4, RAID5, RAID6 bedeutet dies, dass der Paritätsblock (oder die Blöcke) korrekt sind.

Daraus können wir schließen, dass die Parität normalerweise nicht bei jedem Plattenlaufwerk geprüft wird. (Außerdem würde das Überprüfen der Parität bei jedem Lesevorgang die Leistung sehr beeinträchtigen, indem die erforderlichen Transaktionen erhöht werden, um einen Lesevorgang abzuschließen und der Vergleich der Parität mit den gelesenen Daten durchzuführen.)

Bei normalem Betrieb wird mdlediglich davon ausgegangen, dass die gelesenen Daten gültig sind, wodurch sie anfällig für die Beschädigung von Daten im Hintergrund sind . In Ihrem Fall hatten Sie ein gesamtes Laufwerk mit unbemerkt beschädigten Daten, weil Sie das Laufwerk gelöscht haben.

Ihr Dateisystem hat die Beschädigung nicht erkannt. Sie haben Eingabe- / Ausgabefehler auf Dateisystemebene gesehen, weil das Dateisystem nicht verstehen konnte, warum es fehlerhafte Daten hatte.

Um eine stille Datenbeschädigung zu vermeiden, sollten Sie zunächst nie wieder das tun, was Sie getan haben . Zweitens sollten Sie ZFS verwenden, ein Dateisystem, das sich auf die Datenintegrität konzentriert und leise Datenbeschädigung erkennt und korrigiert.