磁盘布局我的硬盘 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 文件系统中的大小为零。 有没有一个简单的解决方案来恢复它?
我的感觉是您的 RAID 阵列出现故障。您可以通过以下方式查看 RAID 状态...
cat /proc/mdstat
由于您看到的 I/O 错误可能是问题的根源。最好的方法是制作每个 RAID 成员(或至少抛出 I/O 错误的成员(的扇区级副本。参见 Linux ddrescue。复制故障硬盘驱动器是确定的。然后从副本执行恢复工作。
最后我找到了解决方案,但这不是很简单。
Xfs_undelete与我的问题不匹配,因为它不支持非常大的文件的 B+Tree 扩展数据块存储格式 (V3(。
成功解决我的问题的成功的半手动程序包括主要步骤:
- 立即卸载文件系统并使用 dd 对文件进行完整分区备份
- 调查有关截断文件的 XFS 日志条目 在
- 专家模式下使用 xfs_db 手动还原 inode 核心标头 哼。恢复索引节点核心不会将扩展数据块取消标记为非自由,当您尝试以通常的方式从具有恢复的索引节点标头的文件复制一些数据时,您将获得 I/O 错误。 这是开发python脚本的一个原因。
- 使用脚本从 inode 的 B+树树中提取盘区数据并将其写入磁盘
我已经在 GitHub 上发布了 LGPL 许可下的恢复脚本
附言由于索引节点 b+树范围记录损坏,一些数据丢失了,但它们对我来说没有意义。