使用 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