公司原来的测试环境使用的是 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 p_w_picpath 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
p_w_picpath: 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
p_w_picpath: 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 命令也是失败的。


xenserver迁移至kvm记录_迁移至

xenserver迁移至kvm记录_迁移至_02


仔细观察,这里有以下疑点:

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 类似

xenserver迁移至kvm记录_xenserver_03


不能启动,须设为read-only 模式,那就设成 read-only 模式


xenserver迁移至kvm记录_xenserver_04

xenserver迁移至kvm记录_kvm_05

fdisk 查看,上面显示136.9GB, 跟原来的 300+G 不相符,错误与 qcow2 文件类似

xenserver迁移至kvm记录_kvm_06

挂载也与 qcow2 文件一样是失败的:

xenserver迁移至kvm记录_xenserver_07

这个时候我怀疑他导出的时候就是有问题的。但是 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 
p_w_picpath:xen215.vhd
fileformat: vpc
virtualsize: 300G (322122547200 bytes)
disksize: 2.8G
cluster_size:2097152

  

   然后使用上面的 qemu-img convert 命令转换之后,就成功的启动虚拟机了。

   终于解决了。原来只在一线之间。