web-dev-qa-db-ja.com

ジャーナルが破損したext4ファイルシステムの回復

ジャーナルで何らかのハードウェアの問題が発生したと思われるハードドライブがあります。これにより、ドライブがロードされなくなります。ランニング mount -r -t ext4 /dev/sda5 /mnt/rootは、次のカーネル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

これが何を意味するのかはほとんどわかりませんが、ジャーナルのロードを妨げるハードウェアの問題のように見えます。とにかくこれを回避する方法はありますか?たとえば、残りのドライブをほとんどそのままにして、ジャーナルを別のオフセットに移動できますか?ドライブを使い続けるつもりはありません。重要なファイルをいくつかコピーできるように、マウントしたいだけです。

9
JSBձոգչ

ジャーナルを再生せずに読み取り専用でマウントして、ファイルにアクセスできるようにします(通常のfsにまだコミットされていない変更が失われる可能性があります)。

mount -o ro,noload ...

8
Ronald

smartctl -a /dev/sdaの出力を見てください。ケーブルの問題ではない場合は、ディスクが故障している可能性があります。最新のバックアップがない場合は、dd_rescueまたはddとそれぞれのオプションを使用して、ブロックデバイスのコンテンツを(マウントせずに)コピーしてみてください。

その後、hdparm --write-sectorを試すことができます(これらの「非常に危険な」オプションは常に面白いです...)。

別のオプションは、DMデバイスを作成して欠陥セクターをバイパスすることです。もちろん、その内容は回復しません。sdaオフセット(134913505)をsda5オフセットに変換する必要があります(見つけるsda5の最初のセクターの数とそれを減算します。sda5オフセットが12345であると仮定します。セクター12345がsda5にマップされていないブロックデバイスを作成します(ループデバイスなど)。デバイス定義(dmsetup createの場合) )は次のようになります。

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

欠陥のあるセクターが1つしかないほど幸運ではありません。必要な数だけマップすることができます(結果としてDMデバイスはこれらのセクターにゼロを提供しますが、書き込み可能です)が、loop0でのオフセットの計算が面白くなる可能性があります。別のオプションは、再マッピングに同じサイズの仮想デバイスを使用し、ゼロプロビジョニングデバイスのシンプロビジョニングまたはスナップショット(小さいチャンクサイズ、1セクターなど)を使用します。

編集1

もちろん、ループデバイスは同じディスク(sda)上のファイルを指すべきではありません。

7
Hauke Laging

FSが読み取り専用でマウントされるリカバリモードで起動し、自分のものをコピーすることができます。

0
schaiba