Xen 支持的虚拟机类型

我们都知道 Xen 支持两种虚拟机类型:半虚拟化(paravirtualization)和全虚拟化(full virtualization),我们也知道 Xen 支持32位的和64位的虚拟机。决定 Xen 服务器是否能支持半虚拟化、全虚拟化、32位和64位的关键因素是处理器,即 CPU 的类型。

当 Xen 虚拟机运行在不支持虚拟化的硬件上的时候(CPU 不支持虚拟化),所有的内核和虚拟机(domains)都必须使用相同类型内存模型和指令大小。比如,如果使用的是 64位的 hypervisor 和 domain0,那么上面所有的 domainU 都必须是64位的或32位 PAE 的;同样,如果使用的是32位(带 PAE 内存扩展)的 xen 内核的话,那么所有在上面运行的 domainU 也都必须是32位(带 PAE 内存扩展)的。

当 Xen 虚拟机运行在支持虚拟化的硬件上、有了硬件的支持的时候(CPU 支持虚拟化),上面的限制就变得宽松多了,可支持的虚拟机类型范围要大多了。1个32位带 PAE 支持的 Xen 内核可以在上面运行1个不带 PAE 支持、全虚拟出来的 domainU;1个64位的 Xen 系统可以运行任何32位的 Linux domainU(包括半虚拟的 domainU 和全虚拟的 domainU);但是1个32位的 Xen 系统可以运行32位半虚拟的 domainU 而不能运行64位半虚拟的 domainU 了。所以 Xen 是向前兼容的,64位的 Xen 内核可以兼容运行32位PAE、纯32位的 domainU,但是不能反过来,32位的 Xen 内核不能运行64位的 domainU 等。

如果觉得上面的文字说明看得有点头昏,VPSee 整理了一个表格:

Hypervisor domain0 domainU (PV) domainU (HVM)
32bit 32bit 32bit 32bit
32bit PAE 32bit PAE 32bit PAE 32bit or 32bit PAE
64bit 64bit 64bit or 32bit PAE 32bit, 32bit PAE or 64bit

Intel VT(Virtualization Technology)和 AMD SVM(Secure Virtual Machine)是两大处理器生产商为了迎合虚拟化发展的趋势而在自己的处理器里直接增加对虚拟化技术的硬件支持。辨别自己的 CPU 是否支持虚拟技术很简单,只需要检查 cpuinfo 里面是否带有虚拟化标志,如果使用的是 Intel CPU,那么 flags 里应该有 vms 字样;如果使用 AMD CPU,那么 flags 里应该可以找到 svm,下面是 VPSee 在一台 SUN Fire X2100 服务器上打印的结果:

# cat /proc/cpuinfo | grep flags
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov
pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm
3dnowext 3dnow pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov 
pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm 
3dnowext 3dnow pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy

注意:如果已经启动到 Xen 系统中, cat /proc/cpuinfo | grep flags 将在默认情况下不会显示 vmx 或 svm 标志位,只有在安装 Xen 前的纯 Linux 内核下才可以看到。还有就是,确定 BIOS 中打开了 Intel VT 或 AMD SVM 虚拟化的支持。

通常安装完 Xen 后,Xen 就能自动识别出系统支持哪几种虚拟机类型。只需要简单打印出 Xen 虚拟机的兼容名单就可以看出来:

# cat /sys/hypervisor/properties/capabilities
xen-3.0-x86_64 xen-3.0-x86_32p hvm-3.0-x86_32 hvm-3.0-x86_32p hvm-3.0-x86_64

上面打印出来的内容表示这个系统可以运行 64位 domains(xen-3.0-x86_64)、32位带 PAE 的 domains(xen-3.0-x86_32p)、32位全虚拟化 domains(hvm-3.0-x86_32)、32位带 PAE 全虚拟化 domains(hvm-3.0-x86_32p)、64位全虚拟化 domains(hvm-3.0-x86_64).

在普通 Linux 下面的 /proc 里包含了一些运行时的 Linux 内核参数可以查看和修改,和 /proc 的作用类似,在 Xen 里面 /sys 里包含了 xen hypervisor 的一些参数。如果在你的 Xen 系统上没有发现 /sys/hypervisor,多半时因为在配置 Xen 内核的时候没有选择上 XEN_SYSFS,重新配置、编译和安装 带 Xen 的 Linux 内核就可以了。

在自己的 IT 环境里部署 Xen 虚拟化前需要了解一下自身 IT 环境的一些特点,比如:用户的使用类型(将在虚拟机上干什么?),需要运行的应用(是否某应用程序必须运行在老的32位的系统上?)等,这样方便选购服务器、迁移平台和应用以及部署虚拟化。

评论 (17 Comments)

  1. 怎么查看xen的vps是半虚拟化还是全虚拟化啊?

  2. 半虚拟化的 vps 可以查看 /sys/hypervisor/ 相关目录验证,全虚拟化的 vps 没有 /sys/hypervisor/ 目录。

  3. 半虚拟化的 vps ,这个目录可以删除不?

  4. /sys/hypervisor/ 的作用和 /proc 差不多,提供一个查看系统配置和运行时变量的地方。

  5. “比如,如果使用的是 64位的 hypervisor 和 domain0,那么上面所有的 domainU 都必须是64位的;”,不对啊,在64位xen和dom0里使用32位domu是可行的啊,我用过,dom0是debian lenny x64,domu是32位的lenny i386

  6. 用的服务器硬件确认不支持HVM

  7. 谢谢指出,你确定 domU 是 32位的而且不带 pae 吗?请问你的 xen 版本是多少?

  8. 不好意思我看错了,是带pae的

  9. 为什么安装windows的时候,添加vif字段,也就是添加网卡的时候就启动不了,不添加则可以启动,启动后里面仍然没有网卡。继续添加vif字段,仍然启动不了。
    请问如何是好?

  10. @zaka
    报错和日志是什么?是这样添加的吗,要用 Qemu 模拟出来的驱动,不能用半虚拟化的(paravirtualized)驱动哦。
    vif = [ ‘type=ioemu, bridge=xenbr0’ ]

  11. 是这样添加的。
    配置文件如下:
    import os, re
    arch = os.uname()[4]
    if re.search(’64’, arch):
    arch_libdir = ‘lib64’
    else:
    arch_libdir = ‘lib’

    kernel =”/usr/lib/xen-3.2-1/boot/hvmloader”
    builder=’hvm’
    memory = 512
    shadow_memory = 8
    name = “win2003″
    vif = [ ” ]
    disk = [ ‘file:/data/vm/win2003/win2003.img,ioemu:hda,w’,’file:/data/vm/win2003/win2003.iso,hdc:cdrom,r’ ]
    device_model =’/usr/lib/xen-3.2-1/bin/qemu-dm’
    boot=”dc”
    sdl=0
    vnc=1
    vnclisten=’127.0.0.1′
    vncviewer=1
    vncconsole=1
    vncpasswd=”
    serial=’pty’
    usbdevice=’tablet’
    on_poweroff=’destroy’
    on_reboot=’restart’
    nographic=0
    localtime=1

    报错如下:
    Watching /local/domain/0/device-model/37/logdirty/next-active
    Watching /local/domain/0/device-model/37/command
    -c config qemu network with xen bridge for
    tap0 xenbr0
    bridge xenbr0 does not exist!
    /etc/xen/scripts/qemu-ifup: could not launch network script
    Could not initialize device ‘tap’

  12. @zaka
    你上面配置文件的 vif 是空的,你是不是用的 Debian/Ubuntu?Debian/Ubuntu 把默认的 xenbr0 改成了 eth0,所以 Xen 找不到 bridge,你改成下面试试:
    vif=[ ‘type=ioemu,bridge=eth0’ ]

  13. 额。。这个其实之前已经试过了,不紧可以启动,网络还可以通。
    但是 关闭虚拟机 或者重启,真机网络有时会出现短暂的链接不通,过几秒钟自动好了,
    不知道是不是硬件问题。。我觉得xenbr0理论上来说应该是最安全或者最稳定的。
    所以一直在找问题。。求教!!!

  14. 请问xen 上运行windows 用nat方式,windows配置文件如何设置?
    linux系统可以通。windows通不了。

  15. 半虚拟化的 vps 可以查看 /sys/hypervisor/ 相关目录验证,全虚拟化的 vps 没有 /sys/hypervisor/ 目录。
    请问是在宿主机上查看还是在具体的虚拟机上查看呢?

  16. 博主,请教一下,我在自己的vmware上的一个centos的系统下弄了一个xen,安装好了,就是在创建虚拟机,安装系统的时候出问题了,我的只支持半虚拟化,我了解一下,要在半虚拟化下,必须要修改虚拟机的内核,但是找了半天,没这方面的资料,能说说吗?在此,先谢过了

  17. @teddy
    你可以搜索一下本站,已经有了这方面内容。

发表评论