TL; DR-Zusammenfassung : Übersetzen Sie eine MD-Sektornummer in Offsets innerhalb des /dev/mdX
Geräts und wie Sie sie untersuchen xfs_db
. Die Sektornummer ist von sh->sector
in linux/drivers/md/raid5.c:handle_parity_checks5()
.
Ich kenne keine MD-Interna, daher weiß ich nicht genau, was ich mit der Ausgabe der von printk
mir hinzugefügten Protokollierung tun soll .
dd
Interessant wären auch Offsets in die Komponentengeräte (für oder einen Hex-Editor / Viewer).
Ich nehme an, ich sollte dies auf der Linux-Raid-Mailingliste fragen. Ist es nur für Abonnenten oder kann ich ohne Abonnement posten?
Ich habe xfs direkt auf MD RAID5 von 4 Festplatten in meinem Desktop (kein LVM). Bei einem kürzlich durchgeführten Scrub wurde ein mismatch_cnt
Wert ungleich Null festgestellt (8 in der Tat, da md jeweils 4 KB-Seiten bearbeitet).
Dies ist ein RAID5, nicht RAID1 / RAID10, wobei mismatch_cnt
! = 0 während des normalen Betriebs auftreten kann . (Die anderen Links am Ende dieser Wiki-Seite können für einige Leute nützlich sein.)
Ich könnte nur blind sein repair
, aber dann hätte ich keine Ahnung, welche Datei auf mögliche Beschädigungen überprüft werden soll, abgesehen davon, dass ich keine Chance mehr habe, den Weg für die Rekonstruktion zu wählen. Die Antwort von Frostschutz auf eine ähnliche Frage ist der einzige Vorschlag, den ich gefunden habe, um einen Unterschied im Dateisystem festzustellen. Es ist umständlich und langsam, und ich würde lieber etwas Besseres verwenden, um es zuerst auf ein paar Dateien einzugrenzen.
Kernel-Patch zum Hinzufügen der Protokollierung
Seltsamerweise meldet die Überprüfungsfunktion von md nicht, wo ein Fehler gefunden wurde . Ich fügte hinzu , eine printk
in md / raid5.c einzuloggen sh->sector
im if
Zweig dass Schritte mddev->resync_mismatches
inhandle_parity_checks5()
(kleiner Patch auf GitHub veröffentlicht , ursprünglich basierend auf 4,5-rc4 von kernel.org.) Für diese für die allgemeinen Gebrauch in Ordnung zu sein, ist es wahrscheinlich brauchen würde Vermeiden Sie es, die Protokolle bei Reparaturen mit vielen Fehlanpassungen zu überfluten (möglicherweise nur, wenn der neue Wert resync_mismatches
<1000 ist?). Auch vielleicht nur anmelden check
und nicht repair
.
Ich bin mir ziemlich sicher, dass ich etwas Nützliches protokolliere (obwohl ich keine MD-Interna kenne!), Da dieselbe Funktion diese Sektornummer im Fehlerbehandlungsfall desswitch
druckt .
Ich habe meinen modifizierten Kernel kompiliert und gebootet und dann die Prüfung erneut ausgeführt:
[ 399.957203] md: data-check of RAID array md125
...
[ 399.957215] md: using 128k window, over a total of 2441757696k.
...
[21369.258985] md/raid:md125: check found mismatch at sector 4294708224 <-- custom log message
[25667.351869] md: md125: data-check done.
Jetzt weiß ich nicht genau, was ich mit dieser Sektornummer anfangen soll. Ist sh->sector * 512
eine lineare Adresse drin /dev/md/t-r5
(aka /dev/md125
)? Handelt es sich um eine Sektornummer in jedem Komponentengerät (bezieht sich also auf drei Daten und einen Paritätssektor)? Ich vermute letzteres, da eine Paritätsfehlanpassung in RAID5 bedeutet, dass N-1-Sektoren des md-Geräts in Gefahr sind und durch die Streifeneinheit gegeneinander versetzt sind. Ist Sektor 0 der Anfang des Komponentengeräts oder der Sektor nach dem Superblock oder so? Gab es weitere Informationen handle_parity_checks5()
, die ich hätte berechnen / protokollieren sollen?
Wenn ich nur die nicht übereinstimmenden Blöcke erhalten wollte, ist das richtig?
dd if=/dev/sda6 of=mmblock.0 bs=512 count=8 skip=4294708224
dd if=/dev/sdb6 of=mmblock.1 bs=512 count=8 skip=4294708224
dd if=/dev/sda6 of=mmblock.2 bs=512 count=8 skip=4294708224
dd if=/dev/sdd of=mmblock.3 bs=512 count=8 skip=4294708224 ## not a typo: my 4th component is a smaller full-disk
# i.e.
sec_block() { for dev in {a,b,c}6 d; do dd if=/dev/sd"$dev" of="sec$1.$dev" skip="$1" bs=512 count=8;done; }; sec_block 123456
Ich vermute nicht, weil ich 4k Nullen von allen vier Schlachtzugskomponenten bekomme, und 0^0 == 0
das sollte also die richtige Parität sein, oder?
Ein anderer Ort, an dem die Verwendung von Sektoradressen in md erwähnt wurde, ist für sync_min
und sync_max
(in sysfs). Neil Brown auf der Linux-Raid-Liste als Antwort auf eine Frage zu einem ausgefallenen Laufwerk mit Sektornummern von hdrecover
, bei dem Neil die Vollplatten-Sektornummer als MD-Sektornummer verwendete. Das ist nicht richtig, oder? Wären md-Sektornummern nicht relativ zu den Komponentengeräten (in diesem Fall Partitionen), nicht zu dem vollständigen Gerät, zu dem die Partition gehört?
linearer Sektor zu XFS-Dateiname:
Bevor mir klar wurde, dass die md-Sektornummer wahrscheinlich für die Komponenten und nicht für das RAID-Gerät bestimmt war, habe ich versucht, sie schreibgeschützt zu verwenden xfs_db
:
Dave Chinners sehr kurzer Vorschlag, wie man herausfindet, wie XFS einen bestimmten Block verwendet, schien für mich überhaupt nicht zu funktionieren. (Ich hätte für einen Sektor ein Ergebnis erwartet, da die Anzahl nicht über das Ende des Geräts hinausgehen sollte, auch wenn es sich nicht um den nicht übereinstimmenden Sektor handelt.)
# xfs_db -r /dev/md/t-r5
xfs_db> convert daddr 4294708224 fsblock
0x29ad5e00 (699227648)
xfs_db> blockget -nv -b 699227648
xfs_db> blockuse -n # with or without -c 8
must run blockget first
huh? Was mache ich hier falsch? Ich denke, das sollte eine separate Frage sein. Ich werde dies durch einen Link ersetzen, wenn ich danach frage oder woanders eine Antwort auf diesen Teil finde.
Mein RAID5 ist im Wesentlichen inaktiv, ohne Schreibaktivität und mit minimalem noatime
Lesevorgang (und daher führen Lesevorgänge nicht zu Schreibvorgängen).
Zusätzliches Zeug zu meinem Setup, hier nichts Wichtiges
Viele meiner Dateien sind Video- oder andere komprimierte Daten, mit denen effektiv festgestellt werden kann, ob die Daten korrekt sind oder nicht (entweder interne Prüfsummen im Dateiformat oder nur fehlerfreie Dekodierung). Das würde diese schreibgeschützte Loopback-Methode praktikabel machen, sobald ich weiß, welche Datei überprüft werden soll. Ich wollte jedoch nicht für jede Datei im Dateisystem einen 4-Wege-Diff ausführen, um zuerst die Nichtübereinstimmung zu finden, wenn der Kernel beim Überprüfen über die erforderlichen Informationen verfügt und diese problemlos protokollieren kann.
my /proc/mdstat
für mein Bulk-Daten-Array:
md125 : active raid5 sdd[3] sda6[0] sdb6[1] sdc6[4]
7325273088 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
bitmap: 0/19 pages [0KB], 65536KB chunk
Es befindet sich auf Partitionen auf drei Toshiba 3-TB-Laufwerken und einem nicht partitionierten WD25EZRS-Green-Power-Laufwerk (langsam), das ich durch ein anderes Toshiba ersetze. ( mdadm --replace
Ich habe es online ohne Lücken in der Redundanz gemacht. Nach einer Kopie wurde mir klar, dass ich den RAID-Zustand vorher und nachher überprüfen sollte, um Probleme zu erkennen. Dann habe ich die Nichtübereinstimmung festgestellt. Möglicherweise gibt es sie schon lange , da ich vor fast einem Jahr einige Abstürze hatte, aber keine alten Protokolle habe und mdadm standardmäßig keine E-Mails darüber sendet (Ubuntu 15.10).
Meine anderen Dateisysteme befinden sich auf RAID10f2-Geräten, die aus früheren Partitionen auf den drei größeren Festplatten (und RAID0 für / var / tmp) erstellt wurden. Das RAID5 ist nur für die Massenspeicherung gedacht, nicht /home
oder /
.
Meine Laufwerke sind alle in Ordnung: Die Anzahl der SMART-Fehler beträgt 0 für alle fehlerhaften Blockzähler auf allen Laufwerken, und kurze + lange SMART-Selbsttests wurden bestanden.
Fast Duplikate dieser Frage, die keine Antworten haben:
- Welche Chunks stimmen in einem Linux-MD-Array nicht überein?
- http://www.spinics.net/lists/raid/msg49459.html
- MDADM mismatch_cnt> 0. Gibt es eine Möglichkeit, festzustellen, welche Blöcke nicht übereinstimmen?
- Andere Dinge sind bereits inline verknüpft, vor allem aber die schreibgeschützte Loopback-Idee von Frostschutz .
- Scrubben auf der Arch Wiki RAID-Seite
.damaged
oder so, anstatt nur zu wissen, dass wahrscheinlich irgendwo eine kaputte Datei vorhanden ist.
mdadm -E /dev/xxx
.