背景
它是一个带有 5 个虚拟硬盘 (VDI) 的 Ubuntu 12.04 VirtualBox VM,注意这只是一个测试 VM,因此没有提前做好规划:
ubuntu.vdi
对于 /(/dev/mapper/ubuntu-root 又名 /dev/ubuntu/root)和 /home(/dev/mapper/ubuntu-home)weblogic.vdi
- /dev/sdb (安装在 /bea 上用于 weblogic 和其他东西)btrfs1.vdi
- /dev/sdc (btrfs -m raid1 -d raid1 配置的一部分)btrfs2.vdi
- /dev/sdd (btrfs -m raid1 -d raid1 配置的一部分)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 始终失败。如果您愿意,只需补充循环设备或甚至真实设备。