我们有几个基于 LVM 的虚拟机在 Xen 开源主机上运行。在我们的例子中,“基于 LVM”意味着根分区有一个 LVM 卷,交换分区有另一个卷。 VM 的内核和 initrd 位于这些卷之外,作为 Xen 主机中的文件。这些虚拟机是使用 xen-create-image 创建的,xen-create-image 是 Debian 的 xen-tools 套件的一部分。
我们想要将这些虚拟机迁移到 XCP 主机,并且我们找到了一个脚本来执行此操作(http://www.xen.org/files/xva/xva.py)。但此脚本假定配置文件中列出的磁盘是“虚拟磁盘”,即具有自己的分区表和其他内容。显然,情况并非如此,而且这是行不通的。
你会建议做什么?有自制方法吗?最后,我们可能不得不通过用旧虚拟机中的大 tar 文件覆盖新虚拟机来迁移虚拟机,但我希望这是我们最后的手段。
我想也许我们可以通过使用与 kpartx 相反的方式来创建一个像该脚本所期望的那样的磁盘:不要将虚拟磁盘拆分为每个分区的设备,而是将多个分区(或者在我们的例子中是 LVM 卷)捆绑在一起一个虚拟磁盘。但我不知道类似的事情。
提前致谢!
答案1
我们就是这样做的:
假设我们的虚拟机名为“anansi”(我目前正在阅读 Neil Gaiman 的一本书;我让你猜猜是哪一个:-))。它安装在两个 LVM 卷中:/dev/vg0/anansi-root(根文件系统,5GB)和 /dev/vg0/anansi-swap(512MB)。
首先我们为虚拟硬盘创建一个新的LVM卷:
lvcreate -n anansiVHD -L 6GB vg0
然后我们使用 cfdisk 在其上创建两个分区:
cfdisk /dev/vg0/anansiVHD
然后我们使用 kpartx 显示虚拟磁盘内的分区:
kpartx -av /dev/vg0/anansiVHD
我们对它们进行了格式化(在本例中使用 ext3,因为它是原始虚拟机所具有的)。您不会在 /dev/vg0 中看到新设备,因为 LVM 不知道它们。您必须使用 /dev/mapper/whatever 来访问它们,如下所示:
mkfs.ext3 /dev/mapper/vg0-anansiVHD1
mkswap /dev/mapper/vg0-anansiVHD2
然后我们挂载根分区:
mkdir /tmp/anansiVHD_root
mount /dev/mapper/vg0-anansiVHD1 /tmp/anansiVHD_root
当我们要迁移的虚拟机正在运行时,我们使用快照来复制其内容:
lvcreate -s -n anansi-snap -L 2G /dev/vg0/anansi-root
mkdir /tmp/anansi-snap
mount /dev/vg0/anansi-snap /tmp/anansi-snap
cd /tmp/anansi-snap
tar c . | (cd /tmp/anansiVHD_root ; tar xv)
我们清理:
umount /tmp/anansiVHD_root
umount /tmp/anansi-snap
lvremove -f /dev/vg0/anansi-snap
kpartx -d /dev/vg0/anansiVHD
我们必须更改虚拟机的配置文件(“anansi.cfg”)以反映对虚拟磁盘的更改。这意味着改变线路:
disk = [ 'phy:/dev/vg0/anansi-root,xvda1,w', 'phy:/dev/vg0/anansi-swap,xvda2,w' ]
对此:
disk = [ 'phy:/dev/vg0/anansiVHD,xvda,w' ]
然后我们使用之前链接的脚本来迁移机器:
xva.py -c anansi.cfg -s <the IP of our XCP host> --username=root --password=<root password>
之后,我们必须按照脚本的说明,将用于引导该 VM 的内核和 initrd 复制到 XCP 主机。最后一步是 ssh 进入 XCP 主机并更改该 VM 的引导加载程序:如果没有,XCP 将尝试使用 pygrub,并且由于这需要虚拟硬盘内的内核和 initrd,因此它将无法工作。
所以我们这样做了:
xe vm-param-set PV-bootloader="" uuid=0ab93325-bdb3-e5c9-e7ab-2173b612b02c
我们从“xe vm-list”获得了新虚拟机的 uuid。
答案2
vi /tmp/tmpmigrateVHD_root/boot/grub/grub.conf
:
root=/dev/sda1 console=tty0
-->root=/dev/xvda1 console=xvc0
六/tmp/tmpmigrateVHD_root/etc/fstab
:
/dev/sda1
-->/dev/xvda1
/dev/sda2
-->/dev/xvda2
vi /tmp/tmpmigrateVHD_root/etc/inittab
: (反向注释掉)
- co:2345:respawn:/sbin/agetty xvc0 9600 vt100-nav
- #1:2345:respawn:/sbin/mingetty tty1
- #2:2345:respawn:/sbin/mingetty tty2
- #3:2345:respawn:/sbin/mingetty tty3
- #4:2345:respawn:/sbin/mingetty tty4
- #5:2345:respawn:/sbin/mingetty tty5
- #6:2345:respawn:/sbin/mingetty tty6