在XFS文件系统中使用dd截断的文件 - 如何恢复?

问题描述 投票:0回答:2

磁盘布局我的HDD raid阵列即将寿终正寝,我为它买了一些新的硬盘,旧的HDD被我用来存储kvmqemu虚拟机的原始磁盘映像,Raid阵列是用mdadm建立的。在md设备上,我有LVM的物理卷。在物理卷上有XFS文件系统,存储原始磁盘镜像,每个原始磁盘镜像都是由qemu-img制作的,并且包含LVM的物理卷。在原始磁盘镜像中,一个PV=一个LV=一个VG。

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

问题现在文件mntoldfile.img在XFS文件系统中的大小为零,有什么简单的方法可以恢复吗?

truncate dd recover xfs
2个回答
0
投票

我的感觉是你的RAID阵列已经失效了。你可以看到RAID状态...

 cat /proc/mdstat

由于你看到的是io错误,这很可能是你问题的根源。最好的方法是对每个RAID成员进行扇区级的复制(或者至少是对出现IO错误的成员进行复制)。参见Linux ddrescue。复制故障硬盘是可取的,然后从副本中执行恢复工作。然后从副本中执行恢复工作。


0
投票

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

Xfs_undelete不符合我的问题,因为它不支持B+Tree程度存储格式(V3)的大文件。

成功解决我的问题的半手动程序包括以下几个主要步骤。

  1. 立即卸载文件系统,并使用dd进行全分区备份。
  2. 调查有关截断文件的 XFS 日志条目。
  3. 在专家模式下使用xfs_db手动恢复inode core头。恢复inode core不会将extents标记为非自由的,当你试图用恢复的inode头从文件中复制一些数据时,你会得到io错误。这是开发python脚本的一个原因。
  4. 使用脚本从B+Tree树中提取inode的extents数据并写入磁盘。

我已经在LGPL授权下发布了恢复脚本,地址是 GitHub

P.S.有些数据因为inode b+tree范围记录损坏而丢失,但它们对我来说没有意义。

© www.soinside.com 2019 - 2024. All rights reserved.