我的 NAS 中的一个磁盘发生故障。NAS 运行 Linux,其文件系统使用 mdadm + LVM 技术。
我确实备份了大部分内容,但没有备份最后的更改,如果可能的话,我想从这个故障磁盘中恢复它。
该磁盘(大小为 1TB 的“绿色驱动器”WD10EARS)出现此类错误:
Oct 3 12:00:41 kernel: [ 3625.620000] ata5.00: read unc at 9453282
Oct 3 12:00:41 kernel: [ 3625.620000] lba 9453282 start 9453280 end 1953511007
Oct 3 12:00:41 kernel: [ 3625.620000] sde5 auto_remap 0
Oct 3 12:00:41 kernel: [ 3625.630000] ata5.00: exception Emask 0x0 SAct 0x1 SErr 0x0 action 0x6
Oct 3 12:00:41 kernel: [ 3625.630000] ata5.00: edma_err_cause=00000084 pp_flags=00000003, dev error, EDMA self-disable
Oct 3 12:00:41 kernel: [ 3625.640000] ata5.00: failed command: READ FPDMA QUEUED
Oct 3 12:00:41 kernel: [ 3625.650000] ata5.00: cmd 60/40:00:e0:3e:90/00:00:00:00:00/40 tag 0 ncq 32768 in
Oct 3 12:00:41 kernel: [ 3625.650000] res 41/40:00:e2:3e:90/12:00:00:00:00/40 Emask 0x409 (media error) <F>
Oct 3 12:00:41 kernel: [ 3625.660000] ata5.00: status: { DRDY ERR }
但是,在使用“dd”测试时,我注意到如果我跳过前 4kB,读取似乎没问题,即类似命令。dd if=/dev/sde5 of=dev/null bs=4k count=1000 skip=1 不会返回任何读取错误。
假设磁盘的其余部分没有其他读取失败,如果我将分区复制克隆到其他地方,但前 4kB 没有丢失,我是否能够恢复这个 900 GB 的分区(正如我之前提到的,它是一个“linux raid 自动检测”分区,包含一个包含 ext4 文件系统的 LVM2 卷)?
答案1
...否则(即如果您已经有降级阵列)您仍然应该能够做到这一点。
如果创建数组的 mdadm < v.3.0,则有效载荷从偏移量 0x22000 开始(如果是 v.3.0 或更高版本,则进一步向上),这也在删除的第一个 4KB 之前。
因此只有 linux-raid 超级块被损坏,但恢复起来并不困难(特别是如果该阵列中的其他设备完好无损)。
答案2
考虑到这是一个相对简单的情况,md 设备作为线性分配的 LVM 卷的单个物理设备工作,并且包装单个 ext4 fs,我的解决方案是直接跟随 ext4 fs 并将其作为循环文件系统安装,以便进行恢复。
我的步骤:
- 如上所述,日我将整个损坏的分区复制到健康磁盘上类似大小的分区(下面命名为/dev/sdd5)
- 我复制了/dev/sdd5保存到一个文件中,然后导入到我的 Ubuntu 台式电脑中,我用十六进制编辑器打开它ghex
- 我从 ext wiki 上看到https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#The_Super_BlockEXT4 超级块在偏移量 0x38 处有一个神奇数字 0xEF53,并且从我的十六进制转储中我可以找到该签名。
- 使用另一个健康的 ext4 文件系统重做同样的操作,我发现超级块的开头位于分区开头之后 1024 字节处,因此我计算了从分区开头开始的偏移量sdd5到我正在寻找的 ext4 分区的开头。
- 我创建了循环分区
losetup -o <offset> /dev/loop0 /dev/sdd5
- 通过
fsck -n /dev/loop0
偏移量验证是正确的,因为我确实得到了一个有效的 ext fs,并且文件系统至少处于一致的状态。 - 我将循环 fs 以只读模式挂载到临时目录:
mount -o ro /dev/loop0 /tmp/recovery
此时,我可以开始访问我想要恢复的内容/tmp/恢复/。