是否有可能恢复部分 LVM 逻辑卷?

是否有可能恢复部分 LVM 逻辑卷?

背景

它是一个带有 5 个虚拟硬盘 (VDI) 的 Ubuntu 12.04 VirtualBox VM,注意这只是一个测试 VM,因此没有提前做好规划:

  1. ubuntu.vdi对于 /(/dev/mapper/ubuntu-root 又名 /dev/ubuntu/root)和 /home(/dev/mapper/ubuntu-home)
  2. weblogic.vdi- /dev/sdb (安装在 /bea 上用于 weblogic 和其他东西)
  3. btrfs1.vdi- /dev/sdc (btrfs -m raid1 -d raid1 配置的一部分)
  4. btrfs2.vdi- /dev/sdd (btrfs -m raid1 -d raid1 配置的一部分)
  5. more.vdi- /dev/sde(添加这个虚拟硬盘是因为/用完了 inode,而且很难确定要删除什么以释放 inode,所以我只是添加了新的虚拟硬盘,创建了 PV,将其添加到现有卷组 ubuntu,扩大了根逻辑卷以解决 inode 问题-_-)

发生了什么?

上周五,在完成之前,我想释放该盒子上的一些磁盘空间,出于某种原因,我认为 more.vdi 没用,并试图将其从虚拟机中分离出来,然后在分离时错误地单击了删除(应该单击保留文件!)。不幸的是,我没有备份。太晚了。

我尝试过

尝试恢复删除的 vdi 文件(使用 testdisk 和 photorec),但耗时太长,恢复了大量我不需要的 .vdi 文件(太大了,占满了磁盘,该死!)。我最终放弃了。幸运的是,大多数数据都在单独的 ext4 分区和 btrfs 卷上。

出于好奇,我仍然尝试挂载逻辑卷,看看是否有可能至少恢复 /var 和 /etc

我尝试使用系统救援 CD 来启动并激活卷组,得到以下结果:

Couldn't find device with uuid xxxx.
Refusing activation of the partial LV root. Use --partial to override.
1 logical volume(s) in volume group "ubuntu" now active.
I was able to mount home LV but not root LV.

我想知道是否还能访问根 LV。在引擎盖下,数据(在 LV 根 - / 上)被条带化到 more.vdi (PV),我知道几乎不可能恢复。

但我仍然很好奇系统管理员/ DevOps 人员如何处理这种情况 ;-)

提前致谢。

答案1

[编辑:如果你不熟悉 LVM,请阅读本概述或者至少维基百科关于它的页面

LVM 将其物理卷分割成称为“物理范围”(PE)的片。您可以通过发出以下命令来检查哪些逻辑卷在您仍拥有的 PV 中分配了 PE:

pvdisplay -m

输出类似这样的内容(此处仅显示一个 PV):

--- Physical volume ---
  PV Name               /dev/sda3
  VG Name               htpcvg
  PV Size               929.27 GiB / not usable 18.71 MiB
  Allocatable           yes 
  PE Size               32.00 MiB
  Total PE              29736
  Free PE               1190
  Allocated PE          28546
  PV UUID               7SfjbY-3dy4-UDeB-iSEL-3R9Y-vvnv-O7m9jr

  --- Physical Segments ---
  Physical extent 0 to 28545:
    Logical volume      /dev/htpcvg/home
    Logical extents     29430 to 57975
  Physical extent 28546 to 29735:
    FREE

通过此信息,您可以知道该 PV 中存储了多少 LV。

然后,如果该信息显示您的 LV 有一些可用范围,则可以使用其他命令(编辑 VolGroupName)激活包含它们的 VG:[编辑: 请阅读手册页]

vgchange -a y --partial VolGroupName

这应该会使您的 LV“可用”,但无论如何都是有故障的(显然,您将无法读取丢失的 PE)。为了安全起见,您还可以使用以下命令将已停用的 LV 设置为只读lvchange -p r --partial /path/to/logical/volume

现在,考虑到你可能无法挂载部分 LV 中的文件系统,你应该使用以下命令复制剩余部分救援

ddrescue -n /dev/mapper/yourVG-yourLV /file/for/the/dump ddrescue.log

然后对该转储进行取证分析。这里有很多选择。Photorec 只是其中之一。

答案2

为了子孙后代,我们必须做一件事。

Partial 不会加载部分 LV。

此外,它还会替换您的配置,并且您的 fs 仍会收到严重错误。要加载损坏的 LV,您必须先用例如 nfs 挂载的循环映像替换损坏/故障/禁用的驱动器或部件。

转储 VG 的配置,将其与备份配置进行比较,并添加除损坏的跨度之外的工作跨度,检查段大小以与跨度数量相关。请记住,映像应大于以前的驱动器。

然后您可以对其进行 pvcreate,并将范围分配给损坏的 LV。

此后,在损坏的 LV fs 上执行 e2fsck(因为超级块将由于跨度损坏而损坏)。然后使用 resize2fs 将其调整为新的较小尺寸,您就可以安全地删除扩展循环,首先通过将 lv 的大小减少到 fs(现在您可以在一个命令中完成此操作而无需 resize2fs),然后通过 vgreduce 从您的 LV 中踢出循环。

此后,您可以安全地挂载已修复的 LV fs 和备份数据,甚至可以重新启动系统来运行它。

但是,如果您的 LV 损坏并且超级块损坏,请不要使用 /dev/ioerror(如在线某处所建议的那样),因为它不允许修复超出 LV 边界的错误,最终导致 fsck 始终失败。如果您愿意,只需补充循环设备或甚至真实设备。

相关内容