Wiederherstellen eines ext4-Dateisystems mit beschädigtem Journal

9

Ich habe eine Festplatte, auf der im Journal ein Hardwareproblem aufgetreten zu sein scheint. Dies verhindert, dass das Laufwerk geladen wird. Das Ausführen mount -r -t ext4 /dev/sda5 /mnt/rootführt zu folgendem Kernel-Spew:

[ 1420.671055] ata1.00: exception Emask 0x0 SAct 0x1000000 SErr 0x0 action 0x0
[ 1420.673862] ata1.00: irq_stat 0x40000008
[ 1420.676600] ata1.00: failed command: READ FPDMA QUEUED
[ 1420.679326] ata1.00: cmd 60/40:c0:a8:9d:0a/00:00:08:00:00/40 tag 24 ncq 32768 in
[ 1420.679326]          res 41/40:40:e1:9d:0a/00:00:08:00:00/00 Emask 0x409 (media error) <F>
[ 1420.685014] ata1.00: status: { DRDY ERR }
[ 1420.687858] ata1.00: error: { UNC }
[ 1420.761064] ata1.00: configured for UDMA/133
[ 1420.763863] sd 0:0:0:0: >[sda] Unhandled sense code
[ 1420.766653] sd 0:0:0:0: >[sda]  
[ 1420.769364] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[ 1420.772104] sd 0:0:0:0: >[sda]  
[ 1420.774780] Sense Key : Medium Error [current] [descriptor]
[ 1420.777491] Descriptor sense data with sense descriptors (in hex):
[ 1420.780249]         72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00 
[ 1420.783175]         08 0a 9d e1 
[ 1420.785972] sd 0:0:0:0: >[sda]  
[ 1420.788730] Add. Sense: Unrecovered read error - auto reallocate failed
[ 1420.791545] sd 0:0:0:0: >[sda] CDB: 
[ 1420.794331] Read(10): 28 00 08 0a 9d a8 00 00 40 00
[ 1420.797242] end_request: I/O error, dev sda, sector 134913505
[ 1420.800072] ata1: EH complete
[ 1420.800077] JBD2: Failed to read block at offset 2748
[ 1420.812529] JBD2: recovery failed
[ 1420.815275] EXT4-fs (sda5): error loading journal

Ich verstehe kaum, was dies bedeutet, aber es sieht sicher nach einem Hardwareproblem aus, das das Laden des Journals verhindert. Gibt es überhaupt etwas zu umgehen? Kann das Journal beispielsweise auf einen anderen Versatz verschoben werden, während der Rest des Laufwerks größtenteils intakt bleibt? Ich habe nicht die Absicht, das Laufwerk weiter zu verwenden. Ich möchte es nur mounten, damit ich ein paar wichtige Dateien kopieren kann.

JSB ձոգչ
quelle
Zwei Dinge: Stellen Sie sicher, dass Sie die Kabel trennen und wieder anschließen. Wenn das Hardwareproblem möglicherweise sogar vorübergehend behoben wird. Wenn ja, besorgen Sie sich neue Kabel. Versuchen Sie andernfalls auch die Festplatte (n) in einem anderen Computer mit anderen Kabeln.
0xC0000022L
Haben Sie versucht, fsckdas Dateisystem?
Psusi
Ich hatte heute ein ähnliches Problem, bei dem ich es irgendwie geschafft habe, das Journal beim Entsperren meiner verschlüsselten ext4-Partition zu beschädigen. Ich konnte nur als schreibgeschützt einbinden. Ich habe es geschafft, das Problem zu beheben, indem ich die Routine 'Check' für die Partition in GParted ausgeführt habe. Die Routine 'Prüfen' hat die Probleme mit dem Journal gefunden und automatisch behoben.
Navi

Antworten:

8

Um es schreibgeschützt zu mounten, ohne das Journal erneut abzuspielen, damit Sie auf Ihre Dateien zugreifen können (Sie werden wahrscheinlich einige Änderungen verlieren, die noch nicht für die regulären fs übernommen wurden):

mount -o ro,noload ...

Ronald
quelle
7

Schauen Sie sich die Ausgabe von an smartctl -a /dev/sda. Wenn es sich nicht um ein Kabelproblem handelt, stirbt die Festplatte möglicherweise ab. Wenn Sie keine aktuelle Sicherung haben, sollten Sie versuchen, den Inhalt des Blockgeräts (ohne Mounten) mit dd_rescue oder dd mit den entsprechenden Optionen zu kopieren.

Danach können Sie es versuchen hdparm --write-sector(immer lustig diese "SEHR GEFÄHRLICHEN" Optionen ...).

Eine andere Möglichkeit besteht darin, ein DM-Gerät zu erstellen, das die defekten Sektoren umgeht. Das stellt ihren Inhalt natürlich nicht wieder her. Sie müssen den SDA-Offset (134913505) in einen SDA5-Offset konvertieren (ermitteln Sie die Nummer des ersten SDA5-Sektors und subtrahieren Sie ihn). Nehmen wir an, der sda5-Offset ist 12345. Sie erstellen ein Blockgerät, dessen Sektor 12345 nicht sda5 zugeordnet ist, sondern an einer anderen Stelle (z. B. Schleifengerät). Die Gerätedefinition (für dmsetup create) sieht folgendermaßen aus:

0 12345 linear /dev/sda5 0
12345 1 linear /dev/loop0 0
12346 99987653 /dev/sda5 12345

# format:
# logical_start_sector num_sectors linear destination_device start_sector

Sie werden nicht so viel Glück haben, dass es nur einen defekten Sektor gibt. Sie können so viele zuordnen, wie Sie möchten (was dazu führt, dass das DM-Gerät Nullen für diese Sektoren liefert, aber beschreibbar ist), aber die Berechnung der Offsets in loop0 kann Spaß machen. Eine andere Möglichkeit wäre, ein virtuelles Gerät derselben Größe für die Neuzuordnung zu verwenden und entweder Thin Provisioning oder einen Snapshot (mit kleiner Blockgröße, z. B. 1 Sektor) eines Null-Zielgeräts zu verwenden.

Bearbeiten 1

Das Loop-Gerät sollte natürlich nicht auf eine Datei auf derselben Festplatte (sda) verweisen.

Hauke ​​Laging
quelle
Sehr guter Punkt. --write-sectorist FAR von „gefährlich“. In der Tat, das ist eigentlich die ist ideal zu verwenden Sie die Option , wenn bestimmte korrupte einzelne Sektoren verhindern , dass Sie einen bekommt kontinuierliche rohe Sektorbild ( ddwürde aus der Patsche helfen mit „Device I / O - Fehler“, einige hdds erfordern sogar Stromzyklus der Maschine ( !) um wieder vom Betriebssystem erkannt zu werden). Doch Sie müssen über Shell-Scripting wissen , wenn Sie verwenden möchten --write-sectorfür den Sektor Bereiche .
Syntaxfehler
0

Sie können im Wiederherstellungsmodus booten, in dem der FS schreibgeschützt bereitgestellt wird, und Ihre Daten kopieren.

schaiba
quelle
Ich montiere schreibgeschützt. Ich habe die oben gezeigte Befehlszeile korrigiert, um dies klarer zu machen.
JSB 24
Und können Sie auf das Laufwerk zugreifen?
schaiba
Nein. Der Versuch, das Laufwerk RO zu montieren (oder in R / W macht es keinen Unterschied), führt zu dem oben gezeigten Fehler.
JSB 24
Dann kann der Vorschlag mit dem Kabeltausch nützlich sein. Und in Bezug auf Ihre Frage kann das Tagebuch nicht so verschoben werden, wie Sie es möchten.
schaiba