Deltik, Sie haben falsch verstanden, wie Linux Software RAID ( md
) funktioniert.
md
macht 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 md
reagierende Laufwerk / die nicht Partition nicht aus?
Das liegt daran, dass md
keine Ahnung hat, ob
- Das Laufwerk ist mit E / A von etwas beschäftigt, das
md
selbst 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 md
wird 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 md
automatisch aus der Parität behoben, und wenn ein Schreibfehler aufgetreten ist, md
ist das Gerät ausgefallen (siehe Abschnitt "Wiederherstellung" der md
Manpage ).
Da weder ein Lesefehler noch ein Schreibfehler aufgetreten ist, md
verwenden 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/md0
RAID-Gerät ist blockiert und kann nicht geändert werden, bis die Blockierung aufgehoben wird.
Sie haben das Flag -f
oder --fail
an den mdadm
Modus "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)
. sysfd
ist 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/sdb1
Wesentlichen Folgendes bewirkt:
echo "faulty" > /sys/block/md0/md/dev-sdb1/block/dev
Diese Anfrage wird warten und wird nicht sofort durchlaufen, da sie /dev/md0
blockiert ist.
3. Kann ein Timeout so konfiguriert werden, dass md
automatisch 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 md
ein 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 md
kein 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 md
würde auch weiterhin Ihr Zugang /dev/sdb1
wie nichts falsch war.
Dies ist aus der md
Manpage :
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 md
lediglich 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.