有没有办法从已删除的 LVM 逻辑卷恢复 ext4 文件系统?

有没有办法从已删除的 LVM 逻辑卷恢复 ext4 文件系统?

前几天,我在 Vmware 下的 Linux 客户机上扩展磁盘时,突然脑子一片空白。我将 Vmware 磁盘文件扩展到所需大小,然后执行了我在 Linux 客户机上通常执行的操作没有LVM:我删除了 LVM 分区并重新创建了它,从与旧分区相同的位置开始,但扩展到磁盘的新大小。(随后将执行 fsck 和 resize2fs。)

然后我意识到 LVM 在原始分区上的行为与 ext2/3/4 不同... 从最近的备份(幸运的是,仅在五个小时前备份)恢复 Linux 客户机后,我现在很好奇如何从以下场景中恢复。毕竟,几乎可以肯定的是,我将来也会是个笨蛋。

虚拟 Linux 客户机具有一块磁盘,该磁盘被划分为一个 256MB 的 /boot(主)分区 (/dev/sda1),其余部分划分为一个逻辑扩展分区 (/dev/sda5)。

然后使用 pvcreate 将 /dev/sda5 设置为物理卷,并使用常用的 vgcreate 命令在其上创建一个卷组 (vgroup00)。然后,将 vgroup00 分成两个逻辑卷 root 和 swap,逻辑上用于 / 和 swap。/ 是一个 ext4 文件系统。

由于我有损坏的客户端的备份,因此我能够使用 vgcfgrestore 从 /etc/lvm/backup 下的备份 LVM 设置中重新创建卷组,并使用与物理卷相同的 UUID 等。运行此操作后,我有两个大小与之前相同的逻辑卷,并在我扩展磁盘的位置有 4GB 的可用空间。

但是,当我尝试运行“fsck /dev/mapper/vgroup00-root”时,它抱怨超级块损坏。我尝试通过运行“mke2fs -n /dev/mapper/vgroup00-root”来找到备份超级块,但这些都不起作用。然后我尝试运行测试磁盘但是当我要求它查找超级块时,它只会给出一个错误,提示由于文件系统损坏而无法打开文件系统。

那么,在 Ubuntu Server 10.04 64 位中,使用 LVM2 的默认分配策略,逻辑卷是否可能从结尾卷组?这肯定可以解释为什么恢复的逻辑卷不包含预期的数据。我可以通过重新创建大小和磁盘位置与之前完全相同的 /dev/sda5 来恢复吗?我可以使用其他工具来查找和恢复文件系统吗?(显然,问题不在于我是否应该从一开始就以不同的方式做到这一点,我知道这一点。这是一个当事情已经变得一团糟时该怎么做的问题。)

答案1

每次使用 LVM 执行操作时,默认情况下,先前的元数据都会存档在 中/etc/lvm/archive。您可以使用vgcfgrestore来恢复它,或者手动抓取扩展(更难,但lvcreate(8)应该可以覆盖它)。

编辑:

为了尽可能简单,我应该补充一点,您可以通过查看描述找到破坏性操作之前的最后一次备份:

# grep description /etc/lvm/archive/vg01_*
/etc/lvm/archive/vg01_00001.vg:description = "Created before executing 'lvremove -f /dev/vg01/foo'"
/etc/lvm/archive/vg01_00002.vg:description = "Created before executing 'lvremove -f /dev/vg01/bar'"
/etc/lvm/archive/vg01_00003.vg:description = "Created before executing 'lvremove -f /dev/vg01/baz'"

编辑:

分配normal策略(默认策略)将在有足够空间时从第一个可用 PE 分配条带。如果您想确认 LV 分配的位置,可以查看存档文件,这些文件对人类来说是完全可读的。

答案2

目前还没有真正好的恢复选项,而且据我所知,也没有工具支持这一点。不过,请参阅LVM 的危险和注意事项有关手动恢复的一些文章。

通常最好对损坏的卷或底层磁盘进行原始映像备份,然后在备份版本上进行数据恢复,以便您可以重试恢复。

上述答案中还有关于调整 LVM 卷大小的部分 - 扩展它们是相当安全的,而且通常最好使用它lvresize而不是删除并重新创建。

相关一点:由于您使用的是 VMware,因此还应注意硬盘写入缓存刷新(写入屏障)是否能从客户机 Linux 内核通过虚拟机管理程序和任何主机操作系统正确传播。在客户机 FS 和客户机内核中设置写入屏障也很重要,内核应为 2.6.33 或更高版本。

答案3

由于您在删除之前但在创建之后已经备份了磁盘映像,因此您可以简单地将 LVM 元数据复制回原位:

  1. 启动虚拟机,使用cp --reflink备份(的副本)作为磁盘,并使用第二个小磁盘来保存步骤 3 中的几 MiB 数据。

  2. 检查 PV 中的有效负载偏移量。通常为 1 MiB。

  3. 将有效负载之前的 LVM 元数据复制到额外存储上的文件中,例如dd bs=1024k count=1 if=/dev/sda5 of=/mnt/pv-meta.img

  4. 在连接了当前磁盘和额外存储的虚拟机上启动救援系统。(不要同时启动连接了当前磁盘和备份磁盘的虚拟机,因为 LVM 不喜欢两次看到相同的 PV/VG/LV UUID。)

  5. 将 PV 元数据恢复至/dev/sda5

  6. 重启

/dev/sda5如果在调整磁盘大小后弄乱了大小,请将/dev/sda5其恢复到步骤 5 之前的先前大小,以防这会使 LVM 混淆。添加新空间的正确方法是创建一个新的 PV 并将/dev/sda6其添加到 VG。

相关内容