恢复带有损坏日志的 ext4 文件系统

恢复带有损坏日志的 ext4 文件系统

我的硬盘似乎在日志中出现了某种硬件问题。这会阻止加载驱动器。运行mount -r -t ext4 /dev/sda5 /mnt/root结果如下:

[ 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

我几乎不明白这意味着什么,但看起来确实是硬件问题导致日志无法加载。有办法解决这个问题吗?例如,是否可以将日志重新定位到不同的偏移量,同时保持驱动器的其余部分基本完好无损?我无意继续使用该驱动器;我只想安装它,以便复制一些重要文件。

答案1

要将其挂载为只读,而不重播日志,以便您可以访问您的文件(您可能会丢失一些尚未提交到常规文件系统的更改):

mount -o ro,noload...

答案2

看看 的输出smartctl -a /dev/sda。如果不是电缆问题,则磁盘可能即将报废。如果您没有最近的备份,您应该尝试使用 dd_rescue 或 dd 以及相应的选项来复制块设备内容(无需安装)。

之后你可以尝试hdparm --write-sector(总是很有趣这些“非常危险”的选项......)。

另一种选择是创建绕过有缺陷扇区的 DM 设备。当然,这并不能恢复它们的内容。您必须将 sda 偏移量(134913505)转换为 sda5 偏移量(找出 sda5 的第一个扇区的编号并减去它)。假设 sda5 偏移量为 12345。您创建一个块设备,其扇区 12345 未映射到 sda5,而是映射到其他位置(例如循环设备)。设备定义(用于 dmsetup 创建)如下所示:

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

你不会那么幸运,只有一个有缺陷的扇区。您可以根据需要映射任意多个(导致 DM 设备为这些扇区提供零,但可写),但计算 Loop0 中的偏移量可能会变得很有趣。另一种选择是使用相同大小的虚拟设备进行重新映射,并使用精简配置或零目标设备的快照(具有小块大小,例如 1 个扇区)。

编辑1

当然,循环设备不应该指向同一磁盘(sda)上的文件。

答案3

您可以在恢复模式下启动,在该模式下,FS 将以只读方式挂载,并复制您的内容。

相关内容