公司原来的测试环境使用的是 xenserver 搭建的虚拟化环境,最近有需要迁移至kvm,所以研究了如何实现从 xenserver 将 guset 迁移至 kvm 的相关技术。
使用的 xenserver 版本有5 系和 7系的。使用的都是 lvm 来做为虚拟机卷的。如此一来,那就需要将guest 先导出来,然后才能操作。
这么想,是因为看到 qemu-img 支持多种镜像格式,而且可以使用 convert 命令对名种格式进行转换。如果导出一种 qemu-img 支持的格式,然后转换成 qcow2 的格式,或者先转为 raw, 才转为 qcow2 ,那不就可以使用了吗?
一、系统环境说明
[root@kvm1 ~]# uname -a Linux kvm1.test.com 3.10.0-514.6.2.el7.x86_64 #1 SMP Thu Feb 23 03:04:39 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux [root@kvm1 ~]# cat /etc/centos-release CentOS Linux release 7.3.1611 (Core) [root@kvm1 ~]# qemu-img -h qemu-img version 1.5.3, Copyright (c) 2004-2008 Fabrice Bellard usage: qemu-img command [command options] QEMU disk image utility
系统是 CentOS-7.3 的
qemu-img 工具是 1.5.3的,有点老,不过是支持多种格式的:
[root@docker-181 ~]# qemu-img -h |grep "formats:" Supported formats: vvfat vpc vmdk vhdx vdi ssh sheepdog rbd raw host_cdrom host_floppy host_device file qed qcow2 qcow parallels nbd iscsi gluster dmg tftp ftps ftp https http cloop bochs blkverify blkdebug
二、第一次尝试转换
刚开始使用 xencenter 导出的有 ova, 发现这是个tar 文件,不能转换。再换另外一个,导出为VHD 格式的文件,这个文件大小符合虚拟机内使用磁盘的大小。使用 qemu-img info 命令查看为 vpc 格式,这种格式 Hyper-V 也是支持的。
搜索“vhd 转为 qcow2”,发现了
http://www.51ou.com/browse/linuxwt/60211.html
这篇文章,符合最初的设想。于是开始执行转换。
[root@kvm1 new]# qemu-img info xen112.vhd image: xen112.vhd file format: vpc virtual size: 127G (136899993600 bytes) disk size: 1.8G cluster_size: 2097152 [root@kvm1 new]# qemu-img convert -p -f vpcxen112.vhd -O qcow2 xen112.qcow2 (100.00/100%) [root@kvm1new]# qemu-img info xen112.qcow2 image: xen112.qcow2 file format: qcow2 virtual size: 127G (136899993600 bytes) disk size: 667M cluster_size: 65536 Format specific information: compat: 1.1 lazy refcounts: false
然后使用 xen112.qcow2 文件启动了虚拟机,启动失败。
三、尝试将转换后的 qcow2 文件挂至别的虚拟机
将此文件添加至其他虚拟机,分区是可以看到的,但是无法挂载成功。报错:无法挂载,且说已经有了文件系统,即使使用 xfs_repair 命令也是失败的。
仔细观察,这里有以下疑点:
1. xen112.vhd 文件的这个虚拟机是300G的磁盘大小,但是用 qemu-img 命令只能看到
virtual size: 127G
2. 转换之后的 xen112.qcow2 文件离谱的地方是
disk size: 667M
不论如何,原来的 disk size: 1.8G ,不能一下小这么多吧。
四、尝试将导出的 vhd 文件挂载至虚拟机
那尝试将 vhd 格式的 虚拟磁盘添加至虚拟机看看如何:
这一次使用的是另外一个刚导出的 xen215.vhd 文件 ,与 xen112.vhd 类似
不能启动,须设为read-only 模式,那就设成 read-only 模式
用 fdisk 查看,上面显示136.9GB, 跟原来的 300+G 不相符,错误与 qcow2 文件类似
挂载也与 qcow2 文件一样是失败的:
这个时候我怀疑他导出的时候就是有问题的。但是 xenserver 自己使用这个镜像是可以成功 import 并启动虚拟机的。
五、尝试更新版本
隔了一天,我又觉得会不会是版本之间不匹配的问题呢?比如说 xen6 上导出来的不能在 CentOS 7 上使用呢?带着这个疑问又在其他版本的系统上试了以后,还是不行。
难道说真的不行?
后来又想到一个问题,以前看过一篇文章说系统自带的 qemu 工具太老了,可以编译安装新的版本,以支持新的功能特性。从 qemu 官网上下了 qemu-2.8.0.tar.xz 。正准备安装时,决定先看看系统上的包都有什么跟 qemu 有关的包,
[root@kvm1vmpool]# yum list all |grep qemu ipxe-roms-qemu.noarch 20160127-5.git6366fa7a.el7 @base libvirt-daemon-driver-qemu.x86_64 2.0.0-10.el7_3.4 @updates qemu-img.x86_64 10:1.5.3-126.el7_3.3 @updates qemu-kvm.x86_64 10:1.5.3-126.el7_3.3 @updates qemu-kvm-common.x86_64 10:1.5.3-126.el7_3.3 @updates centos-release-qemu-ev.noarch 1.0-1.el7 extras libvirt-daemon-driver-qemu.x86_64 2.0.0-10.el7_3.5 updates qemu.x86_64 2:2.0.0-1.el7.6 epel qemu-common.x86_64 2:2.0.0-1.el7.6 epel qemu-guest-agent.x86_64 10:2.5.0-3.el7 base qemu-img.x86_64 10:1.5.3-126.el7_3.5 updates qemu-kvm.x86_64 10:1.5.3-126.el7_3.5 updates qemu-kvm-common.x86_64 10:1.5.3-126.el7_3.5 updates qemu-kvm-tools.x86_64 10:1.5.3-126.el7_3.5 updates qemu-system-alpha.x86_64 2:2.0.0-1.el7.6 epel qemu-system-arm.x86_64 2:2.0.0-1.el7.6 epel qemu-system-cris.x86_64 2:2.0.0-1.el7.6 epel qemu-system-lm32.x86_64 2:2.0.0-1.el7.6 epel qemu-system-m68k.x86_64 2:2.0.0-1.el7.6 epel qemu-system-microblaze.x86_64 2:2.0.0-1.el7.6 epel qemu-system-mips.x86_64 2:2.0.0-1.el7.6 epel qemu-system-moxie.x86_64 2:2.0.0-1.el7.6 epel qemu-system-or32.x86_64 2:2.0.0-1.el7.6 epel qemu-system-s390x.x86_64 2:2.0.0-1.el7.6 epel qemu-system-sh4.x86_64 2:2.0.0-1.el7.6 epel qemu-system-unicore32.x86_64 2:2.0.0-1.el7.6 epel qemu-system-x86.x86_64 2:2.0.0-1.el7.6 epel qemu-system-xtensa.x86_64 2:2.0.0-1.el7.6 epel qemu-user.x86_64 2:2.0.0-1.el7.6 epel
注意到一个
centos-release-qemu-ev.noarch
安装这个包之后,直接就有了 2.6 版本的 qemu 工具了,相对来说也新了不少,那就先用这个做尝试吧。原来这些高版本的工具被当作企业版本的yum 源里了
[root@kvm2 vmpool]# yum list all |grep qemu centos-release-qemu-ev.noarch 1.0-1.el7 @extras ipxe-roms-qemu.noarch 20160127-5.git6366fa7a.el7 @base libvirt-daemon-driver-qemu.x86_64 2.0.0-10.el7_3.4 @updates qemu-img-ev.x86_64 10:2.6.0-28.el7_3.3.1 @centos-qemu-ev qemu-kvm-common-ev.x86_64 10:2.6.0-28.el7_3.3.1 @centos-qemu-ev qemu-kvm-ev.x86_64 10:2.6.0-28.el7_3.3.1 @centos-qemu-ev OVMF.noarch 20150414-2.gitc9e5618.el7 centos-qemu-ev
安装 2.6.0 版本的 qemu-img-ev 及 qemu-kvm-ev
[root@kvm2 vmpool]# yum update qemu-img qemu-kvm
这次再用 qem-img info 查看镜像,就比前不一样了,直接就识别了
[root@kvm2xen_32.215]# qemu-img info xen215.vhd image:xen215.vhd fileformat: vpc virtualsize: 300G (322122547200 bytes) disksize: 2.8G cluster_size:2097152
然后使用上面的 qemu-img convert 命令转换之后,就成功的启动虚拟机了。
终于解决了。原来只在一线之间。
本文出自 “海风久远” 博客,请务必保留此出处http://beyondhf.blog.51cto.com/8953234/1914320
原文地址:http://beyondhf.blog.51cto.com/8953234/1914320