迁移 KVM/VMware 虚拟机或物理机到 Xen PV 虚拟机

使用 KVM, VMware, XenServer/Xen HVM 这些全虚拟技术的虚拟机之间相互转化比较容易,有的转化一下虚拟机镜像文件的格式就可以了,有的可以借助一些免费的自动转化工具如 VMware vCenter Converter 等。今天要说的是全虚拟机(HVM)或物理机到半虚拟机(PV)的转化,稍微麻烦点。

HVM 到 PV 的转化思路是这样的:

1、把整个系统打包后拷贝到 Xen 服务器;
2、在 Xen 服务器上新建一个磁盘文件,把原系统解压到这个 “磁盘” 里;
3、挂载磁盘,并利用 chroot 更换原系统的内核为支持 Xen 的内核;
4、更改原系统的几个必要文件。

下面的操作是迁移一台 Ubuntu 12.04 物理服务器到 Xen PV 虚拟机,其方法也适用于其他的版本的 Linux.

首先登录到要转化的系统上,用 tar 把整个根文件系统打包,最好关闭系统后挂载硬盘到另一台机器上离线打包,如果一定要给一个正在运行的 Linux 系统在线打包的话务必停止一切服务后(如 Apach, MySQL 等)再执行打包,尽量减少打包过程中造成的数据不一致。给一个在线系统打包需要除去一些系统运行时目录如 /proc, /sys 等:

# tar -cvpzf test.tar.gz --exclude=/test.tar.gz --exclude=/sys --exclude=/dev --exclude=/proc /

把打包好的压缩包传到 Xen 母机上,然后在母机上创建一个磁盘镜像文件、格式化、挂载这个磁盘镜像到 /mnt,最后把压缩包的内容解压(细节可以参考 如何快速创建 Xen 虚拟机镜像):

# dd if=/dev/zero of=test.img bs=1 count=1 seek=10G
# mkfs.ext3 test.img
# mount -o loop test.img /mnt

# tar -zxSf test.tar.gz -C /mnt/

创建一些系统运行时需要的目录,然后 chroot:

# mkdir /mnt/proc
# mkdir /mnt/sys
# mkdir /mnt/dev
# mkdir /mnt/dev/pts
# mount -t proc proc /mnt/proc/
# mount -t sysfs sys /mnt/sys/
# mount -o bind /dev /mnt/dev/
# mount -o bind /dev/pts /mnt/dev/pts/

# chroot /mnt

特别的 Xen 需要特别的内核,所以我们需要给原 Linux 系统换内核,chroot 后更新系统并安装 linux-virtual 内核,当然,不要忘了更新 grub:

# apt-get update & apt-get upgrade

# apt-get install linux-virtual
# apt-get purge grub2 grub-pc
# apt-get install grub
# update-grub

换了内核后还需要更新和配置几个系统文件,menu.lst, fstab, hvc0.conf,以便新内核能在 Xen 虚拟环境里正常启动:

# vi /boot/grub/menu.lst
...
# kopt=root=UUID=4da51cdc-c6e9-42a2-b3c8-6056f334a124 ro
kopt=root=/dev/xvda console=hvc0 ro quiet
...

# update-grub
# vi /mnt/etc/fstab
proc         /proc    proc    defaults                     0    0
/dev/xvda    /        ext3    noatime,errors=remount-ro    0    1
/dev/xvdb    none     swap    sw                           0    0
# vi /etc/init/hvc0.conf
# hvc0 - getty
#
# This service maintains a getty on hvc0 from the point the system is
# started until it is shut down again.

start on stopped rc RUNLEVEL=[2345]
stop on runlevel [!2345]

respawn
exec /sbin/getty -8 38400 hvc0

基本上搞定了,退出 chroot 后记得按逆顺序卸载刚才挂载的目录:

# umount /mnt/proc/
# umount /mnt/sys/
# umount /mnt/dev/pts/
# umount /mnt/dev/
# umount /mnt/

创建一个 Xen 虚拟机配置文件,用 xm create 启动虚拟机:

# vi /etc/xen/test
bootloader = "/usr/bin/pygrub"
root = "/dev/xvda ro"
name = "test"
vcpus = "1"
memory = "2048"
disk = [ "file:/root/test.img,xvda,w","file:/root/test.swp,xvdb,w" ]
vif = [ "bridge=xenbr0" ]

# xm create test