迁移 VMware 虚拟机到 KVM
如何迁移 VMware 上的 Windows 及 Linux 虚拟机到基于 KVM 的虚拟机
目前 x86 平台上最流行的虚拟化软件是 VMware 公司的系列产品,而基于开源技术的 KVM 虚拟化软件也得到了广泛的应用。本文是虚拟化迁移技术系列文章的第三部分,详细介绍了如何使用 virt-v2v 开源工具或者手动方法迁移创建在 VMware 软件上的 Window 及 Linux 虚拟机到基于 KVM 的虚拟机,并且从功能上比较了虚拟机系统迁移前后的变化,最后总结了 VMware 虚拟机到 KVM 迁移的不足和注意事项。
郭 晋兵, 高级软件工程师, IBM
吴 超凤, 软件工程师, IBM
丛 彬彬, 高级软件工程师, IBM
2011 年 11 月 02 日
-
内容
前言
随着虚拟化技术的不断发展,虚拟机的应用也越来越广泛。日常应用中可能出现资源不足,系统管理调整或者系统备份等原因,希望将某一虚拟机从原来物理主机迁移到另一个物理主机上,即 V2V(Virtual-to-Virtual)迁移。虚拟机的迁移需要物理主机上 VMM(Virtual Machine Monitor)的支持。相同类型 VMM 之间,使用相同的 API 接口,通常具有强大的迁移能力。例如本系列第二篇文章介绍的 KVM 虚拟机之间的迁移,它支持三种迁移方式:离线迁移、在线共享存储迁移和在线块迁移。而不同的 VMM 之间,由于虚拟化实现技术的不同、开发厂商的不同、API 接口的不同,使虚拟机迁移困难重重。本文分别介绍如何静态迁移 VMware ESX/ESXi、VMware Workstation 及 VMware Player 上的虚拟机到 KVM 主机。
VMware 虚拟机迁移到 KVM 的方式
虚拟机 V2V(Virtual-to-Virtual)迁移是在虚拟机之间移动操作系统和数据, 照顾主机级别的差异和处理不同的虚拟硬件。V2V 的迁移方法有两种,静态迁移和在线迁移。静态迁移(offline migration)也叫做常规迁移、离线迁移。在迁移之前将虚拟机暂停,同时拷贝虚拟机镜像和状态到目的主机。相比较于在线迁移(online migration),其缺点是静态迁移方式的过程需要显式的停止虚拟机的运行,而在线迁移的过程仅有非常短暂的停机时间,保证迁移过程中虚拟机服务的持续可用;优点是兼容性强,不需要 VMM 的有统一的 API 接口,可以借助第三方工具辅助迁移。由于目前 VMM 的开发没有统一的标准,不同的虚拟化厂商,尤其是闭源的商业厂商开发的 VMM 各成一套,静态迁移是解决不同类型虚拟机之间迁移的有效办法。本文采用 V2V 静态迁移的方法实现 VMware 虚拟机到 KVM 的迁移,同时介绍开源迁移工具 virt-v2v 的使用。
VMware 虚拟化产品及虚拟机文件
VMware 产品简介
VMware 是全球虚拟化解决方案的领导厂商,提供了一套虚拟机解决方案,按产品特点可分为如下四类。
- VMware ESX/ESXi:这个产品不需要安装任何操作系统,它本身就是一个用来管理硬件资源的特殊的操作系统,所有的虚拟机都安装在它的上面。ESX Server 带有远程 web 管理和客户端管理功能。
- VMware Server、Workstation 和 Fusion:与 ESX 相比,这三个产品都是要安装在操作系统上的。Server 和 Workstation 运行在 Windows 和 Linux 上,Fusion 运行在苹果的 Mac OS 上。
- VMware VMotion:是 VMware 开发出的一项独特技术,它将服务器、存储和网络设备完全虚拟化,使得正在运行的整个虚拟机能够在瞬间从一台服务器移到另一台服务器上。
- Virtual Center、Importer、Convertor、P2V、Player:这些是为了配合 VMware 虚拟引擎,主要是为了配合 ESX 开发的管理软件和工具,这些工具中很多是免费的。
本文主要迁移创建在 VMware ESX/ESXi、VMware Workstation 和 VMware Player 上的虚拟机到 KVM 主机上,迁移后的虚拟机可以被开源的 libvirt 软件管理。
VMware 虚拟机文件介绍
成功迁移虚拟机的一个重要的验证标准就是文件的正确性和完整性。下图中列出与 VMware 虚拟机相关的文件,但是迁移 VMware 虚拟机到 KVM 并不需要用到所有的文件。
图 1. VMware 虚拟机文件
VMware 虚拟机的文件主要包括 .nvram 文件,.vmx 文件,vmdk 文件,.vswp 文件,.vmss 文件,.vmsd 文件,.vmsn 文件,.log 文件,.vmxf 文件。与迁移相关的最主要的是 .vmx 文件和 .vmdk 文件。
- .vmx 文件:包括虚拟机所有配置信息与硬件设置。不管你对虚拟机的设置做了何种编辑,所有的信息都会以文本形式保存在这个文件里。如特殊硬件配置(例如 RAM 大小,网络接口信息,硬盘驱动信息,串行与并行信息),高级能源与资源配置、VMware 工具选项及能源管理选项。迁移虚拟机时,需要更改这个文件的格式到 KVM 支持的 xml 文件,并且重新确认文件信息的有效性。
- .vmdk 文件:包含虚拟磁盘的信息。虚拟机的文件系统就建立在 .vmdk 文件上。迁移时需要拷贝这个文件到 KVM 主机,并且转换成能够被 libvirt 识别的文件格式。
以下的虚拟机文件有些只在虚拟机处于的某种状态时出现,迁移过程中不会用到。例如当虚拟机开启时出现 .vswp 文件,当虚拟机暂停时出现 .vmss 文件。
- .nvram 文件:包括虚拟机启动过程一部分的 Phoenix BIOS。它类似于拥有 BIOS 芯片的物理服务器,能够设置硬件配置选项。如果删除的话,在虚拟机启动时会自动地重新创建。
- .vswp file:这些文件的大小等于分配给虚拟机的内存大小,再减去任何内存预留(默认是 0)。这些文件通常创建在虚拟机里,但是只有当 ESX 主机耗尽所有物理内存时才使用。当虚拟机关闭或暂停时,这些文件将删除。
- .vmss 文件:这个文件用于虚拟机暂停时,保存虚拟机的存储内容,以便在重新开始时继续运行。
- .vmsd 文件:这个文件与快照一起使用,用于存储元数据和其他活动在虚拟机里的每个快照的信息。这个文本文件在创建快照之前的初始大小是 0 字节,并在每次创建或删除快照时更新信息。
- .vmsn 文件:这个文件与快照一起使用,用于存储虚拟机在进行快照时的状态。每在虚拟机上创建一个快照就会生成一个 .vmsn 文件,在删除快照时,文件自动删除。
- .log 文件:这些文件创建来用于存储虚拟机的日志信息,并常常用于故障检查。在虚拟机目录里,有大量的这样的文件。当前的日志文件通常命名为 vmware.log。
- .vmxf 文件:这是一个附加配置文件,不用于 ESX,用于与 Workstation 兼容的目的。这个文件是文本格式,Workstation 用来聚合虚拟机(VM teaming),将多个虚拟机分配成一组,作为一个单一对象开启或关闭、暂停或恢复它们。
virt-v2v 迁移 VMware ESX 虚拟机
从 RHEL6(Red Hat Enterprise Linux 6)开始,RHEL 发行版中包含了 Red Hat 公司开发的 virt-v2v 工具。它是由 perl 语言编写的脚本,可以自动化的将创建在 Xen,KVM 和 VMware ESX 上的虚拟机拷贝到 virt-v2v 的主机,并且自动的更改配置,使之能够被 libvirt 进行管理。目前,virt-v2v 支持静态迁移下列虚拟机:RHEL4、RHEL5, RHEL6,Windows XP,Windows Vista, Windows 7, Windows Server 2003 和 Windows Server 2008。
图 2. virt-v2v 迁移 VMware/Xen/KVM 虚拟机示意图
本节中,将分别介绍如何使用 virt-v2v 工具迁移 Vmware ESXi 上的 RHEL 虚拟机和 Windows 7 虚拟机到 KVM 主机。
迁移前的环境设置
本文的 KVM 主机安装最新的 RHEL6.1 操作系统(发布于 2011 年 5 月 19 日)。这样,最基本的支持 KVM 虚拟机的软件 qemu-kvm、libvirt、virt-manager 和 virt-v2v 工具都在发行版中安装了。
清单 1. 支持 KVM 虚拟机的软件包
[root@localhost ~]# rpm -qa qemu-kvm
qemu-kvm-0.12.1.2-2.160.el6.x86_64
[root@localhost ~]# rpm -qa libvirt
libvirt-0.8.7-18.el6.x86_64
[root@localhost ~]# rpm -qa virt-manager
virt-manager-0.8.6-4.el6.noarch
[root@localhost ~]# rpm -qa virt-v2v
virt-v2v-0.7.1-3.el6.x86_64
为了使 virt-v2v 工具能够自动化的迁移 VMware ESX 虚拟机,尽量减少手动干预,还需要在 KVM 主机上做一些设置。
1. 安装支持 Windows 虚拟机迁移的软件。
对于 Windows 虚拟机的迁移需要安装 libguestfs-winsupport 包来支持 NTFS 文件系统和 virtio-win 包来支持 Windows para-virtualized 存储和网络设备驱动。
清单 2. 安装 Windows 虚拟机迁移的支持包
[root@victory4 v2v]# rpm -ivh libguestfs-winsupport-1.0-7.el6.x86_64.rpm \
virtio-win-1.2.0-1.el6.noarch.rpm
Preparing... ########################################### [100%]
1:virtio-win ########################################### [ 50%]
2:libguestfs-winsupport ########################################### [100%]
2. 创建 KVM 主机存储域
virt-v2v 在迁移虚拟机的过程中,需要拷贝被迁移虚拟机到 KVM 主机预先定义的存储池中。存储池可以用 libvirt 工具创建。最简单的方法就是使用 virt-manager 来创建新的存储池。本文中创建了一个文件目录类型的存储池,位置在 KVM 主机系统的 /home/images/migration 目录。
图 3. 使用 virt-manager 创建本地存储域
3. 创建 KVM 主机网络接口
虚拟机在迁移之后将连接 KVM 主机网络, 因此主机必须有一个与之相匹配的网络接口,比如说网桥。Linux 系统上有很多工具可以创建网桥,其中 RHEL6.1 发行版上的 virt-manager 已经支持创建和管理网桥。本文创建了网桥 br0,并且绑定在 eth0 的接口上,具体配置如下图。
图 4. 使用 virt-manager 创建网桥
\4. 创建配置文件 virt-v2v.conf
在 virt-v2v.conf 文件中设置 virt-v2v 迁移的规则,包括网络接口迁移后的映射,迁移的方式,存储的位置,输出的格式等等。这些规则也能以命令行参数的方式输入,如 - - network,-o,-os,-of 等。
virt-v2v 迁移 VMware 虚拟机的步骤
在 KVM 主机上完成上节的准备工作后,可以正式开始迁移 VMware ESX 上的虚拟机了。下面是迁移的具体步骤:
\1. 如果虚拟机上安装了 VMware Tools,必须先卸载它。因为 KVM 的虚拟机不支持 VMware Tools 里面的虚拟驱动。
\2. 在 VMware ESX 上停止等待迁移的虚拟机,因为 virt-v2v 只支持静态迁移。
\3. 为自动登录 VMware ESX 服务器创建 .netrc 文件。VMware ESX 服务器的连接需要授权,virt-v2v 支持密码方式的授权连接,可以从 $HOME/.netrc 文件中读取密码并自动登录。如果主机系统没有这个文件,就手动创建它。并且 .netrc 文件需要 0600 权限,使 virt-v2v 工具可以正确读取它。
清单 3. .netrc 文件的格式
machine esx.example.com login root password xxxxxx
\4. 使用 virt-v2v 命令进行迁移。VMware ESX 服务器采用 HTTPS 连接方式,连接时需要配置 SSL 证书。本文通过添加'?no_verify=1'; 到 VMware 服务器的 URI 连接中,来关闭证书检查。
清单 4. virt-v2v 迁移命令及参数
virt-v2v -ic esx://esx.example.com/?no_verify=1 -os pool --bridge brname vm-name
esx.example.com – 是 ESX 服务器主机名或 IP Address
pool – 本地主机存储池,用来保存镜像
brname – 本地主机网桥名字,用来连接迁移后的虚拟机网络
vm-name – 虚拟机的名字
\5. 迁移成功后,虚拟机出现在 virt-manager 管理的虚拟机列表中。通过 virt-manager 工具启动虚拟机。
\6. 检查迁移后的虚拟机的设备驱动。如果需要,重新安装虚拟设备驱动。
\7. 验证迁移后的虚拟机的配置和系统是否和迁移之前一致。
virt-v2v 迁移实例:Linux 虚拟机 RHEL5.5
本例将迁移创建在 VMWare ESXi 服务器上的 RHEL5.5 虚拟机到 KVM 主机上,并使迁移后的虚拟机被 libvirt 管理。本例的环境中,VMware ESXi 服务器和 KVM 主机通过网络连接,虚
拟机镜像被各自的存储管理。
图 5. virt-v2v 迁移 RHEL5 虚拟机的环境
下面就开始正式的迁移 :
\1. 在 VMware ESXi 上检测 RHEL5.5 虚拟机,如果安装了 VMware Tools,先卸载它。
\2. 在 VMware ESXi 上关闭 RHEL5.5 虚拟机。
\3. 在 KVM 主机上创建或修改 $HOME/.netrc 文件,添加 VMware ESXi 服务器的用户名和密码。
清单 5. 修改 .netrc 文件
[root@localhost home]# cat ~/.netrc
machine 9.123.99.913 login root password xxxxxx
[root@localhost home]# chmod 0600 ~/.netrc
\4. 开始迁移虚拟机。KVM 的存储是迁移前准备好的存储域 migration,文件格式采用 libvirt 支持的 qcow2,网络连接方式与 VMware 虚拟机相同,采用网桥。
清单 6. 迁移 RHEL5.5 虚拟机
[root@localhost ~]# virt-v2v -ic esx://9.123.99.193/?no_verify=1 \
-os migration -of qcow2 --bridge br0 RHEL5.5
Using CPU model "cpu64-rhel6"
RHEL5.5_RHEL5.5: 100% [=============================================]D 0h22m52s
Using CPU model "cpu64-rhel6"
virt-v2v: RHEL5.5 configured with virtio drivers
参数说明
-os migration: 迁移虚拟机的镜像文件到主机上的存储池
-of qcow2: 转换迁移后虚拟机的文件格式
--bridge br0: 设置迁移后虚拟机的网络映射到网桥 br0
RHEL5.5: Vmware ESXi 上虚拟机的名字,迁移后保持名字一致
\5. 在 KVM 主机上启动 virt-manager 软件,就会发现迁移后的虚拟机已经被 libvirt 管理了。
图 6. virt-manager 管理迁移后的 RHEL5.5 虚拟机
\6. 深入比较迁移前在 VMware ESXi 上的虚拟机和迁移后在 KVM 上的虚拟机。
表 1. RHEL5.5 虚拟机迁移前后在 VMware ESXi 和 KVM 上的比较
RHEL5.5 | VMware ESXi | KVM/Libvirt | 结论 |
---|---|---|---|
CPUs | Intel Xeon 5160 x2 | QEMU vCPU (cpu64-rhel6) | 数量一致,类型和转化为虚拟 CPU,主频和支持的 flags 有变化 |
Memory | 1384M | 1384M | 数量一致 |
Hard Disk | 18GB,LSI Logic SCSIVMDK | 18GBvirtio SCSIqcow2 | 大小一致,总线接口和文件系统转换为适合 libvirt 的类型 |
CDROM | IDE | IDE | 类型一致 |
Network Adaptor | MAC 00:0c:29:a9:7b:83Type: e1000vSwitch0DHCP | MAC 00:0c:29:a9:7b:83Type: virtiobridge br0DHCP | Mac 相同,网卡类型和连接方式转换为适合 libvirt 的类型 |
Video Card | Vmware SVGA4M Video RAM | Model: Cirrus9M RAM | 转换为 libvirt 支持的类型 |
系统用户 | root/admin001 | root/admin001 | 一致 |
磁盘分区 | VolGroup00/dev/sda | VolGroup00/dev/vda | 逻辑卷一致,物理盘符有变化。 |
从表中的比较看出,RHEL5.5 从 VMware ESXi 服务器迁移到 KVM 主机上后,由于 Hypervisor 的不同,硬件发生了很大的变化。但是 virt-v2v 工具很好的解决的这个问题,使用 virtio 虚拟设备驱动使 RHEL5.5 系统迁移后能够流畅的运行。除了 RHEL5,virt-v2v 还支持 RHEL4 及 RHEL6 版本的迁移。
virt-v2v 迁移实例:Windows 虚拟机 WinXP,Win7
本例中将介绍如何使用 virt-v2v 工具迁移创建在 VMware ESXi 上的 Windows 虚拟机,包括 Windows XP SP3 32bit 中文版和 Windows 7 Professional 32bit 中文版。本节的环境中,KVM 主机上安装了 virt-v2v 及相应的支持包 libguestfs-winsupport 和 virtio-win。VMware ESXi 服务器和 KVM 主机通过网络连接,虚拟机镜像被各自的存储管理。
图 7. virt-v2v 迁移 Windows 虚拟机的环境
下面是正式的迁移步骤:
\1. 在 VMware ESXi 上检测 WinXP 和 Win7 虚拟机,如果安装了 VMware Tools,先卸载它。
\2. 在 VMware ESXi 上关闭 WinXP 和 Win7 虚拟机。
\3. 在 KVM 主机上创建或修改 $HOME/.netrc 文件,添加 VMware ESXi 服务器的用户名和密码。
\4. 开始迁移虚拟机。KVM 的存储是迁移前准备好的存储域 migration,文件格式采用 libvirt 支持的 qcow2,网络连接方式与 VMware 虚拟机相同,采用网桥。
清单 7. 迁移 WinXP 虚拟机
[root@localhost ~]# virt-v2v -ic esx://9.123.99.193/?no_verify=1 \
-os migration -of qcow2 --bridge br0 WinXP
Using CPU model "cpu64-rhel6"
WinXP_WinXP: 100% [=========================================================]D 0h11m13s
Using CPU model "cpu64-rhel6"
virt-v2v: WARNING: There is no virtio net driver available in the directory
specified for this version of Windows. The guest will be configured with
a rtl8139 network adapter, but no driver will be installed for it.
If the rtl8139 driver is not already installed in the guest, you must install
it manually after conversion.
virt-v2v: WinXP configured with virtio storage only.
清单 8. 迁移 Win7 虚拟机
[root@localhost ~]# virt-v2v -ic esx://9.123.99.193/?no_verify=1 \
-os migration -of qcow2 --bridge br0 Win7
Using CPU model "cpu64-rhel6"
Win7_Win7: 100% [====================================
===================================
=======================================]D 0h35m41s
Using CPU model "cpu64-rhel6"
virt-v2v: Win7 configured with virtio drivers
[root@localhost ~]#
\5. 迁移完成后,在 KVM 主机上启动 virt-manager 软件,会发现迁移后的 Windows 虚拟机已经被 libvirt 管理了。
\6. 在 KVM 上启动虚拟机后,由于更新了一些虚拟硬件设备,可能需要重新安装驱动程序和重启系统。
\7. 深入比较迁移前在 VMware ESXi 上的虚拟机和迁移后在 KVM 上的虚拟机,
表 2. WinXP 虚拟机迁移前后在 VMware ESXi 和 KVM 上的比较
WinXP | VMware ESXi | KVM/Libvirt | 结论 |
---|---|---|---|
CPUs | Intel Xeon 5160 | Intel Pentium II 处理器 | 数量一致,类型和转化为虚拟 CPU,主频和支持的 flags 有变化 |
Memory | 1256M | 1256M | 数量一致 |
Hard Disk | 8GB,Vmware Virtual IDEVMDK | 8GBVirtio SCSIqcow2 | 大小一致,总线接口和文件系统转换为适合 libvirt 的类型 |
CDROM | VMware IDE | IDE | 类型一致 |
Network Adaptor | MAC 00:0c:29:83:86:d7Type: PCNETvSwitch0DHCP | MAC 00:0c:29:83:86:d7Type: rtl8139bridge br0DHCP | Mac 相同,网卡类型和连接方式转换为适合 libvirt 的类型 |
Video Card | Vmware SVGA4M Video RAM | Model: Cirrus9M RAM | 转换为 libvirt 支持的类型 |
系统 | Administrator/admin001 | Administrator/admin001 | 一致 |
磁盘分区 | C:\D:\ | C:\D:\ | 一致 |
表 3. Win7 虚拟机迁移前后在 VMware ESXi 和 KVM 上的比较
Win7 | VMware ESXi | KVM/Libvirt | 结论 |
---|---|---|---|
CPUs | Intel Xeon 5160 x 2 | X86 family 6 x 2 | 数量一致,类型和转化为虚拟 CPU,主频和支持的 flags 有变化 |
Memory | 1024M | 1024M | 数量一致 |
Hard Disk | 24GB,LSI Logic SCSIVMDK | 24GBVirtio SCSIqcow2 | 大小一致,总线接口和文件系统转换为适合 libvirt 的类型 |
CDROM | VMware IDE | IDE | 类型一致 |
Network Adaptor | MAC 00:0c:29:64 |