迁移 VMware ESXi 上的 Windows 虚拟机到 KVM

我们发现 VMware vShpere 私有云成本太高,比如我们实验室随便一台服务器就有 512GB 内存,按照 VMware vSphere Standard(标准版)的授权我们需要 512/32=16 个授权,每个授权1293.5美元(又涨价了),1台服务器就需要约2万美元(16个授权),这个授权只是版权价格(LICENSE PRICE),还不包括每年的 1 YEAR SUPPORT & SUBSCRIPTION(419.9美元),这是在抢钱不~,今年初我们买了3个授权来评估和测试,但是按照这个授权方案只能用在2台服务器上(1台 24GB 内存,1台 64GB 内存),VMware 的产品实在不适合我们,我们打算把 VMware ESXi 上现有的一些虚拟机迁移到 OpenNebula/KVM 上。

最先迁移的是一台 Windows Server 2008 R2 虚拟机,这台虚拟机跑在 VMware ESXi 上专门用来运行 VMware vCenter Server(vCenter Server 只能安装在64位的 Windows 系统上),有些现成迁移工具比如 virt-v2v 等,不过个人还是喜欢自己动手,那些工具有时候不太好用。下面的步骤应该对其他的 Windows 版本也有效。

首先用 vShpere Client 登陆到 VMware ESXi 5.0 上打开防火墙设置,允许 ESXi 上的 ssh server 和 ssh client 可用,否则不能 ssh 登陆到 ESXi 也不能从 ESXi 上 scp 镜像到 KVM 服务器,设置具体在 Configuration > Software > Security Profile > Firewall > Properties … > SSH Client 里:

vmware esxi 5.0 enable ssh client

然后 ssh 登陆 VMware ESXi 5.0 服务器(172.16.39.100)后,scp 所需要的镜像文件(后缀名为 .vmdk)到 KVM 服务器(172.16.39.101)上

$ ssh root@172.16.39.100
Password: 
The time and date of this login have been sent to the system logs.

VMware offers supported, powerful system administration tools.  Please
see www.vmware.com/go/sysadmintools for details.

The ESXi Shell can be disabled by an administrative user. See the
vSphere Security documentation for more information.

~ # scp /vmfs/volumes/localstore/vcenter/vcenter-flat.vmdk root@172.16.39.101:/root

把 VMware 的 vmdk 格式转化成 KVM 的格式,因为从 v0.12 开始 qemu-kvm 已经支持 VMware 的硬盘格式 v6 和 v7,所以这一步其实是可以省略的,换句话说 kvm 可以直接启动 vmdk 格式的虚拟机。

$ ssh root@172.16.39.101
# qemu-img convert vcenter-flat.vmdk vcenter.img

最后用 virsh create vcenter.xml 的时候记得 vcenter.xml 文件里面关于硬盘的部分是如下设置,还有记得打开 vnc 设置(别忘了 Windows 是图形界面的):

# vi vcenter.xml
...
 <disk type='file' device='disk'/>
      <driver name='qemu' type='raw'/>
      <source file='/root/vcenter.img'/>
      <target dev='hda' bus='ide'/>
      <address type='drive' controller='0' bus='0' unit='0'/>
    </disk>
    <controller type='ide' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
...
    <graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
...

# virsh create vcenter.xml

Troubleshooting

如果启动 Windows 后用 vnc 客户端连接 KVM 服务器,Windows 启动过程中可能出现蓝屏 Stop 0x0000007B 错误,这是因为硬盘控制器驱动变了:

windows blue screen

解决办法是在迁移前下载 MergeIDE.zip 后解压,双击运行 MergeIDE.bat 文件,然后关闭 Windows 重新按照上面的步骤走一遍。

评论 (9 Comments)

  1. 问一下,你们用Xen Server么?KVM用起来方便吗如果没有很好的管理软件的话?如果VMWare转Xen Server,那么vmdk怎么转到Xen上可以用的虚拟机,谢谢

  2. 感谢分享。这个很有用。
    对于vmware我也很不感冒,收费太高了。我们学校本来打算用它的桌面云,结果发现授权和买台配置低端的pc差不多了
    kvm总觉得没有xen好用,尤其是找不到类似xen shell的管理程序。
    如果用kvm虚拟化,怎么分配给给用户,让用户可以自己关闭、开启、重启虚拟机呢?

  3. Linux 的虚拟机可以这样做吗?

  4. @ vpsee 问个问题,esxi5 我已经开启了ssh server 的22端口,但是ssh client显示为不可用,我SCP到KVM主机(22端口是正常的,通的)老是超时,不知道是何原因,好像出去的22端口不通,另外是否有命令可以关闭ESX的防火墙?

  5. @babo
    有一些类似 xen shell 的 kvm shell 工具可用。

  6. @Frankie
    嗯,方法是一样的。

  7. ovirt批量管理。
    virt-manager 管理少量也还不错。

  8. 你好,我将ESXi5.0下的WINDOWS虚拟机通过以上方法迁移到OPENSTACK平台中,在启动Windows虚拟机的过程中出现蓝屏 Stop 0x0000007B 错误,即使在迁移前运行 MergeIDE.bat 文件,然后关闭 Windows 重新按照上面的步骤走一遍仍然报该蓝屏错误,WIN2008R2和WIN7都是这样,请问如何处理呢,谢谢。

  9. 你好,请问下,我做xp镜像时:
    sudo kvm -m 1024 -cdrom windowsxp.iso -drive file=windowsxp.img,if=virtio,boot=on -fda virtio-win-1.1.16.vfd -boot d -nographic -vnc :0
    做完这第一步后再重启就直接蓝屏了,错误代码:0x0000007B,请问这是怎么回事呀?

发表评论