0

磁盘布局 我的 HDD RAID 阵列即将报废,我为它购买了一些新磁盘。旧硬盘我已用作 kvm/qemu 虚拟机的原始磁盘映像的存储。RAID 阵列是使用 mdadm 构建的。在 md 设备上,我有 LVM 的物理卷。在物理卷上,我有存储原始磁盘映像的 XFS 文件系统。每个原始磁盘映像都是由 qemu-img 制作的,并包含 LVM 的物理卷。一个 PV = 一个 LV = 一个原始磁盘映像内的 VG。

操作 当我尝试使用 cp 进行数据移动时,我在我的 raid 阵列中遇到了坏块和 i/o 问题,所以我从 cp 切换到 dd,没有错误,我写的同步标志dd if=/mnt/old/file.img of=/mnt/**old**/file.img bs=4k conv=noerror,sync

问题 现在文件 /mnt/old/file.img 在 XFS 文件系统中的大小为零。有没有简单的解决方案来恢复它?

4

2 回答 2

0

我的感觉是您的 RAID 阵列出现故障。您可以通过...查看 RAID 状态

 cat /proc/mdstat

由于您看到可能是问题根源的 i/o 错误。最好的前进路径是为每个 RAID 成员(或至少抛出 i/o 错误的成员)制作扇区级副本。请参阅 Linux ddrescue。它旨在复制失败的硬盘驱动器。然后从副本执行恢复工作。

于 2020-06-06T15:17:42.193 回答
0

最后我找到了解决方案,但它不是很简单。

Xfs_undelete 没有匹配我的问题,因为它不支持非常大的文件的 B+Tree 范围存储格式 (V3)。

成功解决我的问题的成功半手动程序由以下主要步骤组成:

  1. 立即卸载文件系统并使用 dd 对文件进行完整分区备份
  2. 调查有关截断文件的 XFS 日志条目
  3. 在专家模式 MB 中使用 xfs_db 手动恢复 inode 核心标头。恢复 inode 核心不会取消将扩展区标记为非空闲,并且当您尝试以通常方式从具有恢复的 inode 标头的文件中复制一些数据时,您将收到 i/o 错误。这是开发python脚本的原因。
  4. 使用从 B+Tree 树中为 inode 提取扩展数据并将它们写入磁盘的脚本

我在GitHub 上发布了 LGPL 许可下的恢复脚本

PS 由于 inode b+tree extent 记录损坏,一些数据丢失了,但它们对我来说没有意义。

于 2020-06-08T21:21:37.173 回答