我们都知道 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 整理了一个表格:

Hypervisordomain0domainU (PV)domainU (HVM)
32bit32bit32bit32bit
32bit PAE32bit PAE32bit PAE32bit or 32bit PAE
64bit64bit64bit or 32bit PAE32bit, 32bit PAE or 64bit

Intel VT(Virtualization Technology)和 AMD SVM(Secure Virtual Machine)是两大处理器生产商为了迎合虚拟化发展的趋势而在自己的处理器里直接增加对虚拟化技术的硬件支持。辨别自己的 CPU 是否支持虚拟技术很简单,只需要检查 cpuinfo 里面是否带有虚拟化标志,如果使用的是 Intel CPU,那么 flags 里应该有 vmx 字样;如果使用 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 cmovpat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm3dnowext 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/capabilitiesxen-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位的系统上?)等,这样方便选购服务器、迁移平台和应用以及部署虚拟化。


plus:

Q:怎么查看xen的vps是半虚拟化还是全虚拟化?

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

/sys/hypervisor/ 目录。