答案1
这是问题评论中提到的 pastebin 中的虚拟机磁盘配置:
<devices>
<emulator>/usr/bin/kvm</emulator>
<disk type='block' device='disk'>
<driver name='qemu' type='raw'/>
<source dev='/dev/mars_ssd/myUnivativ'/>
<target dev='hda' bus='ide'/>
<address type='drive' controller='0' bus='0' unit='0'/>
</disk>
<disk type='block' device='cdrom'>
<driver name='qemu' type='raw'/>
<target dev='hdc' bus='ide'/>
<readonly/>
<address type='drive' controller='0' bus='1' unit='0'/>
</disk>
[...non-disk devices after this point...]
VM 配置中的信息表明 VM 磁盘/dev/sda
实际上位于/dev/mars_ssd/myUnivativ
主机上,即 VG mars_ssd
、 LV myUnivativ
。 (是的,我知道 VM 配置说的hda
是sda
- 它显然假定 VM 将使用旧的 IDE 驱动程序。)
如果mars_ssd
主机的 VG 有任何问题,您应该首先在主机级别修复它们。
由于/dev/mars_ssd/myUnivativ
LV 包含 VM 磁盘映像,因此它具有自己的分区表和 LVM 层。
由于虚拟机的根文件系统似乎位于损坏的 VG 内,因此在虚拟机内修复它会很困难。如果您可以使用主机上可用的所有工具,修复它会更容易。
所以:
“磁盘欺骗”
- 关闭虚拟机。
sudo losetup -f
在主机上运行以识别主机的第一个空闲/dev/loop*
设备。我将其称为/dev/loopN
。- 用于
sudo losetup /dev/loopN /dev/mars_ssd/myUnivativ
为虚拟机的磁盘设置循环设备。现在您可以像常规的全磁盘设备一样访问虚拟机的磁盘映像,即使它实际上是主机上的 LV。 - 要访问虚拟机磁盘映像上的各个分区,请使用
sudo kpartx -a /dev/loopN
。它将为虚拟机磁盘映像上的分区创建设备,并使它们可以作为常规分区设备访问,命名为/dev/mapper/loopNpP
,其中 P 是分区号。
现在,您可以在主机级别挂载虚拟机磁盘映像上的任何分区:由于虚拟机的 PV 被指示为/dev/sda5
在主机上,因此磁盘映像上至少有两个分区。您可以使用 查看分区sudo fdisk -l /dev/loopN
,然后挂载任何感兴趣的分区,例如sudo mount /dev/mapper/loopNp1 /mnt
。
您甚至可以运行pvscan
或vgscan
并在主机级别获取虚拟机的卷组 - 如果它们的名称与主机的名称不冲突。如果您找到一个可运行的 VG,您可以使用激活它,sudo vgchange -ay
然后正常安装它。
如果您愿意,此时您还可以使用任何文件救援工具。
再次启动虚拟机之前,请撤消您在主机级别访问虚拟机磁盘映像所做的所有操作:
- 从主机上卸载所有虚拟机的文件系统。
sudo vgchange -an <name of VM's VG>
如果你已经激活了虚拟机的所有卷组,请从主机上停用它们- 使用以下命令删除分区设备
sudo kpartx -d /dev/loopN
- 用 断开循环设备
sudo losetup -d /dev/loopN
。
希望对您有所帮助。请根据您的发现更新您的问题,然后我会在必要时更新我的答案。