mdadm reparatur eines stücks / sektors

400
user10186803

Ich möchte einen NAS mit mdadm für das RAID und btrfs für die Bitrot-Erkennung erstellen. Ich habe ein ziemlich einfaches Setup, das 3 1-TB-Platten mit mdadm zu einem RAID5 kombiniert, als Btrfs darüber hinaus.

Ich weiß, dass Mdadm Bitrot nicht reparieren kann. Es kann mir nur sagen, wenn Unstimmigkeiten bestehen, aber es weiß nicht, welche Daten korrekt und welche fehlerhaft sind. Wenn ich mdadm mitteilte, mein md0 zu reparieren, nachdem ich Bitrot simuliert habe, wird die Parität immer neu aufgebaut. Btrfs verwendet Prüfsummen, um zu wissen, welche Daten fehlerhaft sind. Die Daten können jedoch nicht repariert werden, da die Parität nicht angezeigt wird.

Ich kann jedoch einen Btrfs-Scrub ausführen und das Syslog lesen, um den Offset der Daten zu erhalten, die nicht mit der Prüfsumme übereinstimmen. Ich kann diesen Versatz dann in einen Datenträger und einen Versatz auf diesem Datenträger übersetzen, weil ich den Datenanfangsversatz von md0 (2048 * 512), die Blockgröße (512K) und das Layout (linkssymmetrisch) kenne. Das Layout bedeutet, dass in meiner ersten Ebene die Parität auf der dritten Platte, in der zweiten Ebene auf der zweiten Platte und in der dritten Ebene auf der ersten Platte liegt.

Durch die Kombination all dieser Daten und einiger weiterer btrfs auf dem Wissen über das Format des Datenträgers kann ich genau berechnen, welcher Teil von welchem ​​Datenträger der fehlerhafte ist. Ich kann jedoch keinen Weg finden, um mdadm mitzuteilen, dass er diesen bestimmten Block reparieren soll.

Ich habe bereits ein Skript geschrieben, das die Parität und den fehlerhaften Block mit dem Befehl dd austauscht, dann eine Reparatur mit mdadm startet und sie dann wieder austauscht. Dies ist jedoch keine gute Lösung, und ich möchte, dass mdadm diesen Sektor als schlecht und fehlerhaft kennzeichnet Verwenden Sie es nicht wieder. Da es zu verrotten begann, sind die Chancen hoch, dass es wieder geht.

Meine Frage ist: Gibt es eine Möglichkeit, mdadm mitzuteilen, einen einzelnen Block zu reparieren (was nicht die Parität ist) und möglicherweise sogar einen Plattensektor als schlecht zu kennzeichnen? Möglicherweise wird ein Lesefehler erstellt.

(Und ich weiß, dass ZFS dies alles alleine erledigen kann, aber ich möchte keinen ECC-Speicher verwenden.)

Edit: In dieser Frage / Antwort geht es darum, wie btrfs RAID6 instabil ist und wie ZFS viel stabiler / benutzbarer ist. Das bezieht sich nicht auf meine Frage, wie man einen einzelnen bekannten fehlerhaften Chunk mit mdadm reparieren kann.

0
Sie benötigen keinen ECC-Speicher, um ZFS zu verwenden. Ich würde empfehlen, ZFS zu verwenden. Attie vor 5 Jahren 1
"_... Ich kann diesen Versatz dann in einen Datenträger und einen Versatz auf diesem Datenträger konvertieren ..." - Sie planen, _far_ mit dem Speicher zu praktisch zu sein ... Das wird wahrscheinlich schief gehen. Attie vor 5 Jahren 1
Wenn ich ZFS ohne ECC verwende, könnte ich mich genauso gut um den Bitrot-Schutz sorgen. Beide verhindern sehr selten Fehler, aber ich möchte dies richtig machen. Da Sie zu praktisch sind, haben Sie recht. Aber ich sehe keinen besseren Weg. Ich weiß, dass es möglich ist, die ReadyNas und Synology von netgear kombinieren mdadm und btrfs und behalten trotzdem den Bitrot-Schutz. user10186803 vor 5 Jahren 0
Sie schützen nicht nur vor Bit Rot, sondern auch andere Dinge wie Lese- / Schreibfehler (zB: High Write). Die ZFS / ECC-Frage wurde stark übertrieben und missverstanden - ja, eine laufende Maschine könnte von der ECC profitieren, aber um Daten zu erleiden, müssen einige seltene Probleme auf die richtige Weise auftreten. Es wäre besser, wenn Sie ZFS für die von Ihnen skizzierte Situation verwenden würden. Wie wäre die Verwendung von BTRFS + MDADM + -Skripts ohne ECC ein geringeres Problem als ZFS ohne ECC? Attie vor 5 Jahren 1
"_Netgears ReadyNas und Synology kombinieren mdadm und btrfs und behalten trotzdem den Bitrot-Schutz." Attie vor 5 Jahren 0
Auch wenn die gestellte Frage nicht mit [Btrfs over mdadm raid6?] (Https://superuser.com/q/1131701/83694) identisch ist, handelt es sich um ein [XY-Problem] (http://xyproblem.info/). Dies ist vollständig durch die andere Frage und [Antwort] (https://superuser.com/a/1131710/83694) angesprochen. Deltik vor 5 Jahren 1
Mögliches Duplikat von [Btrfs over mdadm raid6?] (Https://superuser.com/questions/1131701/btrfs-over-mdadm-raid6) Attie vor 5 Jahren 0
@Attie Vielen Dank für Ihre Beiträge, aber ich stimme der Aussage nicht zu, dass der ECC-Speicher für ZFS nur ein kleiner Bonus und keine Voraussetzung ist. Und ja, sie tun: [link] (https://community.netgear.com/t5/Verwenden-Ihr-ReadyNAS/Bit-Rot-Protection-explained/td-p/1132146) user10186803 vor 5 Jahren 0
Und ich sehe nicht, dass dies ein Duplikat ist. Meine ursprüngliche Frage ist, wie man einen Sektor als schlecht einstuft und mdadm zwingt, diesen Sektor zu reparieren. Ich glaube auch nicht, dass es ein XY-Problem ist, da ich alle Daten und Offsets kenne. Ich muss nur einem Programm mitteilen, dass es die von einem anderen Programm gesammelten Daten verwenden soll. Vielleicht ist das in dieser Situation nicht möglich? user10186803 vor 5 Jahren 0
"_Ich danke Ihnen für Ihren Beitrag, aber ich stimme nicht zu _" ... fair genug. Ich werde nur sagen, dass es sich anhört, als würden Sie planen, ein Produktionsspeicherarray mit der alltäglichen Mentalität zu betreiben, die nur bei einer Wiederherstellung von "_oh sh * t ... now what_" in Betracht gezogen werden sollte Modus. Attie vor 5 Jahren 0
Auch dies: http://jrs-s.net/2015/03/03/will-zfs-and-non-ecc-ram-kill-your-data/ Attie vor 5 Jahren 0

2 Antworten auf die Frage

1
Deltik

Ich kann keinen Weg finden, um mdadm mitzuteilen, dass er diesen Chunk reparieren soll.

Das liegt daran, dass md bei einer unbeaufsichtigten Datenbeschädigung nicht über ausreichende Informationen verfügt, um zu wissen, welcher Block unbemerkt beschädigt ist.

Ich lade Sie ein, meine Antwort auf Frage 4 ("Warum mdverwendet ein Gerät weiterhin mit ungültigen Daten?") Hier zu lesen, was dies ausführlicher erklärt.

Um das geplante Layout noch zu verschlechtern , kann der oben beschriebene Btrfs-Layer nicht erkannt werden, wenn ein Paritätsblock stumme Datenfehler aufweist. Wenn ein Datenträger mit dem entsprechenden Datenblock ausfällt und Sie versuchen, ihn zu ersetzen, verwendet md die beschädigte Parität und beschädigt Ihre Daten irreversibel. Nur wenn diese Festplatte ausfällt, erkennt Btrfs die Beschädigung, aber Sie haben die Daten bereits verloren.

Dies liegt daran, dass md nicht aus Paritätsblöcken liest, wenn das Array nicht beeinträchtigt wird.


Gibt es eine Möglichkeit, mdadm mitzuteilen, einen einzelnen Chunk zu reparieren (was nicht die Parität ist) und möglicherweise sogar einen Plattensektor als schlecht zu kennzeichnen? Möglicherweise wird ein Lesefehler erstellt.

Bei fehlerhaften Sektoren, die von der Festplatte selbst erkannt wurden, kann md dies problemlos verkraften, da der fehlerhafte Sektor für md erkannt wird.

Sie können technisch einen fehlerhaften Sektor mit machen hdparm --make-bad-sector, aber woher wissen Sie, auf welcher Festplatte der Block von der unbeaufsichtigten Datenbeschädigung betroffen ist?

Betrachten Sie dieses vereinfachte Beispiel:

Paritätsformel: PARITY = DATA_1 + DATA_2

+--------+--------+--------+ | DATA_1 | DATA_2 | PARITY | +--------+--------+--------+ | 1 | 1 | 2 | # OK +--------+--------+--------+ 

Lassen Sie uns nun jeden Block mit einem Wert von Folgendes beschädigen 3:

+--------+--------+--------+ | DATA_1 | DATA_2 | PARITY | +--------+--------+--------+ | 3 | 1 | 2 | # Integrity failed – Expected: PARITY = 4 | 1 | 3 | 2 | # Integrity failed – Expected: PARITY = 4 | 1 | 1 | 3 | # Integrity failed – Expected: PARITY = 2 +--------+--------+--------+ 

Wenn Sie nicht die erste Tabelle zum Anschauen hätten, woher würden Sie wissen, welcher Block beschädigt war?
Sie können es nicht sicher wissen.

Deshalb blockieren Btrfs und ZFS beide Prüfsummen. Es benötigt etwas mehr Speicherplatz, aber diese zusätzlichen Informationen lassen das Speichersystem herausfinden, welcher Block liegt.

Aus Jeff Bonwicks Blogartikel "RAID-Z" :

Wenn Sie einen RAID-Z-Block lesen, vergleicht ZFS ihn mit seiner Prüfsumme. Wenn die Datenfestplatten nicht die richtige Antwort geliefert haben, liest ZFS die Parität und führt anschließend eine kombinatorische Rekonstruktion durch, um herauszufinden, welche Festplatte fehlerhafte Daten zurückgegeben hat.

Um dies mit Btrfs auf md zu tun, müssten Sie versuchen, jeden Block neu zu berechnen, bis die Prüfsumme in Btrfs übereinstimmt. Dies ist ein zeitaufwendiger Prozess, für den kein Benutzer / Skript eine einfache Schnittstelle hat.


Ich weiß, dass ZFS dies alles alleine erledigen kann, aber ich möchte keinen ECC-Speicher verwenden

Weder ZFS noch Btrfs über md hängen vom ECC-Speicher ab oder kennen ihn sogar. ECC-Speicher fängt nur stille Datenbeschädigung im Speicher auf, sodass das Speichersystem agnostisch ist.

Ich habe ZFS über Btrfs für RAID-5 und RAID-6 (analog zu ZFS RAID-Z bzw. RAID-Z2) zuvor in Btrfs über Mdadm Raid6 empfohlen? and Fail Device in MD RAID, wenn ATA nicht mehr reagiert, aber ich möchte die Gelegenheit nutzen, um einige weitere Vorteile von ZFS zu skizzieren:

  • Wenn ZFS eine unbegründete Datenbeschädigung feststellt, wird diese sofort und ohne menschliches Eingreifen sofort korrigiert.
  • Wenn Sie eine gesamte Festplatte neu erstellen müssen, "resilver" ZFS nur die tatsächlichen Daten, anstatt unnötig über das gesamte Blockgerät zu laufen.
  • ZFS ist eine All-in-One-Lösung für logische Volumes und Dateisysteme, was die Verwaltung weniger vereinfacht als die Erstellung von Btrfs über md.
  • Im Gegensatz zu sind RAID-Z und RAID-Z2 zuverlässig und stabil
    • Btrfs unter md RAID-5 / RAID-6, das nur Fehlererkennung für unbemerkt beschädigte Datenblöcke bietet (plus fehlerhaft beschädigte Paritätsblöcke werden möglicherweise nicht erkannt, bis es zu spät ist) und keine einfache Möglichkeit zur Fehlerkorrektur
    • Btrfs RAID-5 / RAID-6, das " mehrere schwerwiegende Datenverluste enthält ".
  • Wenn ich eine ganze Festplatte mit ZFS RAID-Z2 unbemerkt beschädigt habe, würde ich keinerlei Daten verlieren, während ich bei md RAID-6 tatsächlich 455,681 Inodes verlor .
-1
user10186803

Ich habe einen Weg gefunden, einen Lesefehler für Mdadm zu erstellen.

Mit dmsetup können Sie logische Geräte aus Tabellen erstellen.

Geräte werden erstellt, indem eine Tabelle geladen wird, die ein Ziel für jeden Sektor angibt (512 Byte).

Von: manpage

In diesen Tabellen können Sie Offsets angeben, die einen E / A-Fehler zurückgeben sollen. Beispiel:

0 4096 linear /dev/sdb 0 4096 1 error 4097 2093055 linear /dev/sdb 4097 

Dadurch wird ein Gerät (1 GB) mit einem Fehler am Offset 4096 * 512 erstellt.

Warum in aller Welt würdest du das tun? Das Erstellen eines md-Geräts mit absichtlichen, nicht zu korrigierenden Fehlern schließt erfolgreiche Array-Wiederherstellungen aus. Im Großen und Ganzen wirkt sich die Fixierung solcher Hacks dem Fluss der Datenintegrität entgegen, und Tunnelblick führt zu Unfällen. Sie erwähnten: "Ich möchte das richtig machen" (https://superuser.com/questions/1346523/mdadm-repair-single-chunk-sector/1346547#comment2017223_1346523) ". Sie sollten also wirklich die Dekade verwenden. seit langem etablierte Lösung, ZFS. Deltik vor 5 Jahren 0