迁移 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 重新按照上面的步骤走一遍。

VMware ESXi 上使用内存预留减少 vswap 文件大小

VMware ESXi 上创建的虚拟机会自动根据虚拟机的内存大小创建一个同等大小的 swap 文件,这个文件通常和虚拟机镜像文件在同一个目录,文件名以 .vswp 结尾。比如创建一个内存为 8GB 的虚拟机,那么 .vswap 就会自动创建,并且大小也是 8GB,保存在同一个 datastore 里。现在问题来了,如果我要创建一个内存为 512GB 的虚拟机,那么 VMware ESXi 就会自动创建一个 512GB 的 .vswap 文件,本地硬盘(datastore)只有 500GB 容不下 .vswap 文件怎么办?前段时间 VPSee 就碰到这个 insufficient disk space on datastore 问题,原因是 VMware ESXi 企图创建一个大小为 512GB 的交换文件,结果 datastore 只有 500GB,所以硬盘空间不够,创建失败:

vmware esxi insufficient disk space

有两个解决办法:

  • 把 .vswap 文件从本机移到其他的 datastore 或者 NFS/SAN 存储上;
  • 修改内存预留值为最大值,点击左边列表的 host,选择右边 Resource Allocation 页面,右键点击 vpsee.com 这个虚拟机后选择 Edit Resource Settings… 出现如下对话框,然后调整 Memory Resources 栏的 Reservation 至最大值 501760MB.

vmware esxi memory reservation

修改后可以在上面这张图的 Resource Allocation 页面的 Memory 部分看到 Reserved Capacity 由 0 变成了 505531 MB,再次启动虚拟机就应该会得到一个内存大小为 500GB 的虚拟机了(host 需要一点内存,所以 512GB 的 host 不能创建 512GB 的虚拟机哦)。

VMware vSphere 标准版1个授权可以用在1个物理 CPU 和 32GB VRAM 上,每台虚拟机最多支持8个 VCPU。这台 512GB 服务器虽然只有4个物理 CPU 却需要 512/32=16 个授权(VMware 新的授权政策是按照 VRAM 算而不是 RAM)。每个标准版授权995美元,16个授权需要约1.6万美元,可能比这台服务器还贵。

在 VMware ESXi 5.0 上安装网卡驱动

昨天刚发现新购的 Dell PowerEdge R710 服务器上配的 Intel Ethernet Server Adapter X520-T2 万兆网卡居然在 VMware ESXi 里找不到,查了一下有 VMware 的官方驱动,不过需要另外安装。

到 VMWare 官方网站下载网卡驱动,然后上传到 VMware ESXi 服务器的一个临时目录 /tmp(用 scp 上传的话当然首先要开启 VMware ESXi 的 SSH 服务):

$ scp ixgbe-3.4.23-458775.zip root@192.168.2.8:/tmp

ssh 登陆到 VMware ESXi 服务器后解压驱动包,解压后会得到后缀为 .vib 的驱动文件:

$ ssh root@192.168.2.8
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.
~ # cd /tmp/
/tmp # unzip ixgbe-3.4.23-458775.zip 
Archive:  ixgbe-3.4.23-458775.zip
  inflating: ixgbe-3.4.23-offline_bundle-458775.zip
  inflating: net-ixgbe-3.4.23-1OEM.500.0.0.406165.x86_64.vib
  inflating: doc/README.txt
  inflating: source/driver_source_net-ixgbe_3.4.23-1OEM.500.0.0.406165.tgz
  inflating: doc/open_source_licenses_net-ixgbe_3.4.23-1OEM.500.0.0.406165.txt
  inflating: doc/release_note_net-ixgbe_3.4.23-1OEM.500.0.0.406165.txt

使用 esxcli 命令行安装 vib 驱动并检查是否安装成功:

/tmp # esxcli software vib install -v /tmp/net-ixgbe-3.4.23-1OEM.500.0.0.406165.x86_64.vib 
Installation Result
   Message: The update completed successfully, but the system needs to be rebooted for the changes to be effective.
   Reboot Required: true
   VIBs Installed: Intel_bootbank_net-ixgbe_3.4.23-1OEM.500.0.0.406165
   VIBs Removed: 
   VIBs Skipped: 

/tmp # esxcli software vib list
Name                  Version                             Vendor  Acceptance Level  Install Date
--------------------  ----------------------------------  ------  ----------------  ------------
net-ixgbe             3.4.23-1OEM.500.0.0.406165          Intel   VMwareCertified   2012-02-24
...

安装成功后重启 VMware ESXi,然后查看一下 Intel Corporation 10-Gigabit 网卡驱动是否能被正确识别出来:

/tmp # lspci | grep 'Network controller'
000:001:00.0 Network controller: Broadcom Corporation Broadcom NetXtreme II BCM5709 1000Base-T [vmnic0]
000:001:00.1 Network controller: Broadcom Corporation Broadcom NetXtreme II BCM5709 1000Base-T [vmnic1]
000:002:00.0 Network controller: Broadcom Corporation Broadcom NetXtreme II BCM5709 1000Base-T [vmnic2]
000:002:00.1 Network controller: Broadcom Corporation Broadcom NetXtreme II BCM5709 1000Base-T [vmnic3]
000:007:00.0 Network controller: Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection [vmnic4]
000:007:00.1 Network controller: Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection [vmnic5]
000:008:00.0 Network controller: Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection [vmnic6]
000:008:00.1 Network controller: Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection [vmnic7]

使用 vSphere Client 客户端登入 VMware ESXi 以后,进入 Configuration 页面的 Network Adapters 应该会看到新安装的 vmnic4, vmnic5, vmnic6, vmnic7 4个网卡接口了,或者直接在 ESXi 上用命令行界面:

~ # esxcfg-nics -l
Name    PCI           Driver      Link Speed     Duplex MAC Address       MTU    Description                   
...
vmnic4  0000:07:00.00 ixgbe       Up   10000Mbps Full   90:e2:ba:05:2d:fc 1500   Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection
vmnic5  0000:07:00.01 ixgbe       Down 0Mbps     Half   90:e2:ba:05:2d:fd 1500   Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection
vmnic6  0000:08:00.00 ixgbe       Down 0Mbps     Half   90:e2:ba:05:29:98 1500   Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection
vmnic7  0000:08:00.01 ixgbe       Up   10000Mbps Full   90:e2:ba:05:29:99 1500   Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection

如何在 VMware ESXi 虚拟机上运行 KVM

记得以前就有人问过 “能不能在一个虚拟机上运行虚拟机”,答案当然是可以的,Xen HVM, KVM, VMware, Qemu 等 Hypervisor 都可以这样嵌套虚拟,不过由于性能低下实际用处不大。在 VMware ESXi 虚拟机上运行虚拟机,被称为多层虚拟或者嵌套虚拟机(Nested VMs)。如果只有一台电脑想测试多节点 OpenStack 环境的话,使用 VMware ESXi 虚拟几个运行 KVM Hypervisor 的 OpenStack 计算节点是个不错的办法。VMware ESXi 5.0 默认情况下不支持嵌套虚拟,所以在 VMware ESXi 虚拟机里安装完 KVM 以后会发现 KVM 虽然能装但不可用:

# kvm-ok 
INFO: Your CPU does not support KVM extensions
KVM acceleration can NOT be used

解决办法很简单:1、修改 VMware ESXi 的设置;2、修改对应虚拟机的设置。

登陆 VMware ESXi 控制台打开 VMware ESXi 5.0 的 SSH 服务(默认 SSH 服务是关闭的),然后用 ssh 登陆 VMware ESXi 后在 config 文件中最后加入 vhv.allow = “TRUE” 一行:

# vi /etc/vmware/config
libdir = "/usr/lib/vmware"
authd.proxy.vim = "vmware-hostd:hostd-vmdb"
authd.proxy.nfc = "vmware-hostd:ha-nfc"
authd.proxy.nfcssl = "vmware-hostd:ha-nfcssl"
authd.proxy.vpxa-nfcssl = "vmware-vpxa:vpxa-nfcssl"
authd.proxy.vpxa-nfc = "vmware-vpxa:vpxa-nfc"
authd.fullpath = "/sbin/authd"
authd.soapServer = "TRUE"
vmauthd.server.alwaysProxy = "TRUE"
vhv.allow = "TRUE"

重启 VMware ESXi 后编辑虚拟机选项(需要先关闭虚拟机),打开 Edit virtual machine settings 对话框,在 options 页面的 General Options 选项里把 Guest Operating System 的类型换成 Other 里面的 VMware ESxi 5.x,如图:

running nested vms on vmware esxi

最后启动虚拟机后再 kvm-ok 一下就可以看到 KVM 可以用了:

# kvm-ok 
INFO: /dev/kvm exists
KVM acceleration can be used

相关阅读:
在 CentOS 上安装和配置 KVM.
在 VMware ESXi 上安装 Minix.
在 VMware ESXi 虚拟机上运行不同的 Hypervisor 可以看看 VMware 的 Running Nested VMs.

VMware ESXi 上如何使用 CDROM

在 VMware ESXi 上安装操作系统的话一般通过 VMware vShpere Client 上传 iso 文件到 datastore,然后通过挂载 iso 后安装;而且如果 VMware ESXi 需要什么文件可以通过 ssh/scp 传文件,所以在 VMware ESXi 上很少需要用到 CDROM 的时候。不过 VPSee 昨天碰到一个需要用 CDROM 的情况,那么如何在 VMware ESXi 下挂载和使用 CDROM 呢?

加载 CDROM 模块和挂载 CDROM 后就可以和 linux mount 一样使用 CDROM 了,进入 VMware ESXi 控制台(如果想远程登录 VMware ESXi 的话需要先打开 SSH 服务):

~ # vmkload_mod iso9660
Module iso9660 loaded successfully

~ # /sbin/vsish -e set /vmkModules/iso9660/mount mpx.vmhba32:C0:T0:L0
~ # ls /vmfs/volumes/CDROM
A.Z           DRYRUN.CFG    INSTALL.VGZ   OPEN_SOU.TXT  VMKERNEL.GZ
BOOT.CAT      IENVIRON.VGZ  ISOLINUX.BIN  README.TXT
CIM.VGZ       IMAGEDD       ISOLINUX.CFG  SYS.VGZ
CIMSTG.TGZ    IMAGEDD.BZ2   MBOOT.C32     TBOOT.GZ
CUSTOM.CFG    IMAGEDD.MD5   MENU.C32      VMKBOOT.GZ

要卸载 CDROM 的话刚好和挂载相反:

~ # /sbin/vsish -e set /vmkModules/iso9660/umount mpx.vmhba32:C0:T0:L0
~ # vmkload_mod -u iso9660

开启 VMware ESXi 的 SSH 服务

昨天收到一位 VPS 客户邮件问到一个不相关 VPS 业务的问题(这个问题已经发到相关文章的评论里),请大家把与我们 VPS 业务不相关的技术问题直接发到博客上,这样大家都可以看见和搜索到,我们也不必重复回复类似的问题和邮件了:)问题是这样的,如何把 VMware ESXi 上的虚拟机镜像文件拷贝出来?一种简单的解决办法就是用 ssh 登录 VMware ESXi 服务器,然后到相关目录直接把镜像文件拷贝出来。VMware ESXi 默认是关闭 ssh 的,那么如何开启呢?

在 VMware ESXi 3.5 控制台上直接按 “ALT + F1″ 就可以到 console,输入 “unsupported” 后回车进入 Tech Support Mode 模式,输入 root 用户名和密码登录就进入 console 了,然后编辑 inetd.conf 文件、去掉 ssh 那行注释、保存、然后重启服务就可以了:

~# vi /etc/inetd.conf
ssh stream tcp ...

~# /sbin/services.sh restart

如果是 VMWare ESXi 3.5 Update 2 版本,需要找到 inetd 进程并用 kill 带上 -HUP 选项重启这个服务进程:

~ # ps | grep inetd
5031 5031 busybox              inetd

~# kill –HUP 5031

在 VMware ESXi 4.1 上开启 ssh 功能和 VMware ESXi 3.5 不同,如果直接按 “ALT + F1″ 的话会看见以下提示信息:

Tech support mode has been disabled by your administrator

所以需要先把 Tech support mode 打开,在 VMware ESXi 4.1 上输入密码后进入界面控制台,选择 “Troubleshooting Options”,继续选择 “Enable Local Tech Support” 和 “Enable Remote Tech Support (SSH)”,这样就可以同时开启本地 console 和远程 ssh 登录。

在 VMware ESXi 5.0 上开启 ssh 功能就简单多了,直接在操作界面里 enable 就可以了。

用 ssh 登录 VMware ESXi 后就可以随心所欲了,根目录下就这么些文件和目录,层次清晰,很容易找出虚拟机镜像文件在哪,需要的话把这些镜像文件 scp 拷出来就可以了。

~ # ls /vmfs/volumes/datastore1/minix01/
minix01-d76c0df1.vswp  minix01.nvram      minix01.vmsd       minix01.vmxf
minix01-flat.vmdk      minix01.vmdk       minix01.vmx        vmware.log

用 VNC 访问 VMware ESXi 虚拟机控制台

在 VMware ESXi 上安装 Minix 以后可以通过 ssh/telnet 来访问 Minix,大部分时候这样做都足够了,但是如果我们想做一些 Minix 内核上的修改和实验就要面临内核和系统编译后启动不了的情况,这个时候就需要直接进入 VMware ESXi 控制台来手动启动备用内核。那么有没有可能像 Xen 那样在虚拟机配置文件中加入 vnc 选项让用户可以通过 vnc 客户端来访问自己的虚拟机终端呢?作为虚拟技术的领导产品 VMware ESXi 4.1 当然也有类似的办法。有了 vnc 的支持以后我们就可以在校内的任意一台电脑或者 SunRay 瘦客户端上登录自己的 Minix 虚拟机了,这样就会非常方便我们的操作系统课程教学和学生的实验,这比以前讨论的 SunRay 在 GDM 里直接启动 VirtualBox 那种连接和使用虚拟机的方法要更好一些。VMware ESXi 提供了免费的图形化客户端工具 VMware vShpere Client,很容易操作,用 vShpere Client 连接 VMware ESXi 后关闭虚拟机,然后按照下面步骤编辑虚拟机的配置文件:

  1. 鼠标右击选择 “Edit settings”;
  2. 选择 “Options” 标签页;
  3. 在 “Advanced” 下选择 “General”;
  4. 点击 “Configuration Parameters” 按钮;
  5. 最后加入如下配置参数:
RemoteDisplay.vnc.enabled = "true"
RemoteDisplay.vnc.password = "vpsee.com"
RemoteDisplay.vnc.port = "5900"

vnc setup on vmware esxi

重新启动虚拟机后就可以通过任意一个 vnc 客户端连上虚拟机的控制台了,这样就可以看到整个系统启动过程,可以自己启动和关闭虚拟机。Minix 3 一般会有2个内核,一个是当前内核,一个是备用内核,当修改编译当前内核失败以后可以用第2个选项(2 Start Custom MINIX 3)启动,非常方便修改和开发内核。关闭 Minix 以后可以通过 menu 命令选择内核:

connect vnc to minix

在 VMware ESXi 上安装 Minix

VMware ESXi 是业界领先的 hypervisor,更重要的是它现在是免费的,只要在 VMware 上注册一个账号就可以拿到一个免费的 license,下载 iso 后刻盘启动,安装过程非常简单,安装完后界面如下,可以修改的东西不多,可修改管理员密码和网络配置。主要操作和配置需要在一个另外一台机器上(安装 VMware vShpere 客户端)完成。需要注意的是 VMware ESXi 对硬件设备要求很高,好像一般的桌面 PC 都安装不了,VMware ESXi 4.0 Hardware Compatibility List这里给出了能运行 VMware ESXi 的兼容硬件设备列表。

vmware esxi installation

在主控台配置完 ESXi 的网络后在另外一台机器上打开 http://your-ip-address/ 就会看到一个页面,下载和安装 VMware-viclient.exe 客户端工具后就可以用来管理 VMware ESXi. 启动 VMware vShpere Client 后就会发现是个60天试用版本,需要输入 license(虽然是免费的)。VPSee 找了半天才找到输入 license 的地方,不在菜单上,在右边页面的 Configuration tab 下的 Software->Licensed Features:

vmware esxi installation

VMware ESXi 安装成功后就是创建虚拟机、安装 Minix 了,原以为会很顺利,结果昨天因为网卡驱动问题折腾了一上午。安装 Minix 时候会碰到如下问题:

Probing for disks. This may take a short while... AT0-D0: controller not ready
AT0-D0: controller not ready
AT0-D0: reset failed, driver busy
AT0-D1: controller not ready
AT0-D1: controller not ready
AT0-D1: reset failed, driver busy
......
Found no drivers - can't partition.
Autopart tool failed. Trying again.

原因是 VMware ESXi 默认创建的虚拟硬盘设备是 SCSI 的,Minix 不支持 SCSI 只支持 IDE 的,解决办法是 Power Off Minix 虚拟机,在 Edit virtual machine settings 中 Add 一个 Hard Disk 设备并在 Virtual Device Node 中选择 IDE (0:0),然后再启动虚拟机后就可以顺利安装 Minix 了。要注意的是,安装 Minix 一定要安装 Minix 3.1.6 或以上版本,不然就会遇到烦人的网卡驱动问题,昨天花了很长时间才找到问题所在,压根就没有想到会是驱动有 bug,驱动完全不工作也好说,至少可以马上定位问题所在,最怕这种有时候工作有时候不工作的情况,anyway,安完 Minix 后需要配置一下 Minix 环境以便以后操作。

设置静态 IP 地址:

# vi /etc/rc.net
ifconfig -l /dev/ip0 -n 255.255.255.0 -h 172.16.20.201
add_route -g 172.16.20.1
daemonize nonamed -L

在系统启动的时候就启动 telnet 和 ftp 服务:

# vi /etc/rc.net
intr -d tcpd telnet in.telnetd &
intr -d tcpd ftp in.ftpd &

如果要安装很多 Minix 的话,可以在安装和配置好一个 Minix 后导出为一个虚拟机通用模版(VMware ESXi 主菜单上的 File->Export OVF Template… ),然后再利用这个模版(File->Deploy OVF Template… )部署多个 Minix 虚拟机器。下图是刚创建的20个 Minix 虚拟机:

vmware esxi installation