在本文中,我们介绍了如果虚拟机本身不能启动时如何访问Xen虚拟机的所有文件。这能帮助你修复发生在虚拟机里的问题,在最糟的情形下,能帮助你回复失败的虚拟机。
很多人都觉得Xen环境下挂在虚拟机磁盘是一件很不容易的事情,实际上,您可以基于镜像来实现虚拟机磁盘的挂载。本文就来讲述如何在Xen环境下基于镜像挂载虚拟机磁盘。
基于镜像挂载虚拟机磁盘
挂载在镜像文件里的虚拟磁盘比挂载位于物理存储设备的虚拟磁盘困难得多。不像物理设备,为了挂载镜像文件你需要知道回环设备。这个回环设备由内核模块(叫做回环)组成,确保对于每个你想挂载的文件,就会创建一个回环设备。这些回环设备按顺序编号,第一个的名字在/dev/loop0。
你可能已经熟悉文件系统上的回环设备进程。例如,你能使用这个技术挂载.ISO文件。使用以下命令:
mount -o loop /bestand.iso /mnt
不过,如果你需要访问Xen虚拟磁盘文件里的分区,这个步骤帮不了你。你不想挂载文件,只想首先访问里面的分区,那么你需要在回环设备和你想访问的镜像文件之间使用losetup命令建立连接。在连接之前,输入下面的命令查看正在使用的回环设备:
losetup ?a
假定没有回环设备正在使用,可以使用/dev/loop0作为回环设备,连接到Xen镜像文件。如果镜像文件的名字是/var/lib/xen/images/vm1/disk0,使用下面命令建立连接:
losetup /dev/loop0 /var/lib/xen/images/vm1/disk0
如果你再次使用losetup,你将发现已创建的回环设备,在回环设备和镜像文件之间存在连接。现在可以使用下面命令开始分析镜像文件里的分区:
fdisk -l: fdisk -l /dev/loop0
基于fdisk -l显示给你的信息。你应该能辨别哪个设备宿主根文件系统。发现后,你需要确保你有相同的设备文件用于镜像文件里的分区,以便挂载它们。如果安装了多路径工具包,使用下面命令:
kpartx -a /dev/loop0
由于镜像文件使用loop0设备,这个创建的设备文件的名字是/dev/mapper/loop0p1、/dev/mapper/loop0p2,以此类推。你现在能使用这些文件挂载文件系统,这些系统上安装了操作系统的根。这可以是Linux或Windows操作系统,因为你能在虚拟主机操作系统上挂载它们。一旦对这个文件系统作出必要的修改,输入下面命令正确卸载:
umount /mnt
kpartx -d /dev/loop0
losetup -d /dev/loop0
Xen环境下处理基于Linux虚拟机主机里的本地卷
在上面讨论的步骤中,我已经假定你的虚拟操作系统使用通用分区。不过,如果虚拟机使用Linux的话,情况就不同了。你可能使用本地卷管理(LVM)而不是分区。这让情况变得有点复杂,因为你不能通过简单的激活分区激活本地卷。
通常,当服务器启动时,将为每个可用设备扫描本地卷。不过由于虚拟机磁盘文件里的设备在启动时不可用,你需要自己扫描本地卷。
如果fdisk——我建议在存储后端文件上显示分区——是type 8e,你需要执行专门的步骤。在下面步骤中,我假定通过/dev/mapper/loop0p2设备,这个分区是可用的。
你需要确保这个分区由LVM子系统作为物理设备。只知道这个分区是type 8e是不够的,你需要告诉LVM子系统它是可用的,能作为物理设备,并且LVM能使用它。使用下面命令这样做:
pvscan /dev/loop0p2
接下来,你将被告知LVM卷组在物理设备里被发现了,但是你需要通过使用下面命令初始化这个卷组:
vgscan
为了完成LVM架构的重新配置,你需要在卷组里的本地卷使用下面命令:
lvscan
尽管你现在能再次访问本地卷,你将发现所有本地卷都没活动。你需要在挂载本地卷时修复这个问题。通过使用vgchange命令更改卷组的状态。这个命令将更改所有在volume group vm1vg的卷的状态,并激活它们:
vgchange /dev/vm1vg
LVM本地卷现在是激活的,并准备好挂载。例如,如果你想使用名称/dev/lvm1vg/root挂载本地卷,就该使用以下命令:
mount /dev/vm1vg/root /mnt
这时,你对本地卷里的所有文件有完全访问权。你现在能作出你需要的所有修改。