虚拟化技术始于20世纪60年代 IBM 大型机,算是历史悠久的一项技术,通过分区(partition)的功能拆分硬件资源来分配使用。而如今在 x86 平台上由 VMware 等厂商的努力发扬光大。x86 平台的虚拟化技术是将原本必须直接安装在个人计算机硬件上面的 OS 转换成为虚拟机,我们可以在一台实体机器上面同时运行多种不同的操作系统,而这些 OS 都是实实在在可顺畅运行的,与一般直接安装在硬件上面的 OS 并没有两样。x86 平台的虚拟化技术有三种模式:硬件虚拟化(hvm),半虚拟化(pvm)以及带半虚拟化驱动的硬件虚拟化(pv-hvm),这三种模式详细的特性和区别,我就不在这里介绍了,不是太了解的同学可以参考这里

Xen 虚拟化技术最开始只能以半虚拟化模式运行,虽然这要求所有的 Guest OS 的内核都要有针对性的修改,但这大大提高了性能。当然,这种半虚拟化的模式也需要修改 Host OS 的内核来支持。很多虚拟化厂商都针对自己的产品修改 Guest OS 内核来实现半虚拟化技术,并积极地申请把添加的功能添加到主线内核中去,主线内核的开发人员很快意识到了这个问题,paravirt_ops 诞生了,它是通用的半虚拟化内核接口,下面是它的英文官方介绍:

paravirt_ops (pv-ops for short) is a piece of Linux kernel infrastructure to allow it to run paravirtualized on a hypervisor. It currently supports VMWare’s VMI, Rusty’s lguest, and most interestingly, Xen.

The infrastructure allows you to compile a single kernel binary which will either boot native on bare hardware (or in hvm mode under Xen), or boot fully paravirtualized in any of the environments you’ve enabled in the kernel configuration, and lately also as Xen dom0.

pv-ops 正式加入到 2.6.26 主线内核中,对于 XenParavirtOps 则至少需要 Xen 4.0 作为支持(请参考这里)。Xen 在 4.3 版本推出了 PV in an HVM Container (PVH) 模式,感兴趣的朋友可以参考这里

最近,我使用 Oracle VM(3.2.2)以及 Oracle Linux 和 RHEL 产品针对 pv-ops 模块做了相关实验,通过实验结果可以得出如下结论:

首先针对 RHEL 5 来说,RHEL 5 同时提供了 Xen 虚拟化技术,但如果想用 RHEL 5 做 host OS 的话,需要重新编译个 Xen 版本的内核并以该内核启动,但 RHEL 5 的内核是以 2.6.18 为基础修改而来的,所以 RHEL 5 的内核没有集成 pv-ops 模块,所以在 Oracle VM 下,以 PVM 来安装 RHEL 5.5 的话,安装过程会自动选择 Xen 版本的内核,通过这种 Xen 内核的模式来实现半虚拟化,如果以 HVM 模式来安装 RHEL 5.5,那么安装过程会选择常规内核,但这个内核没有带任何形式的 pv driver,也就是说即使用户选择了 pv-hvm 模式,系统运行起来依然是 HVM 模式,这就需要手动安装半虚拟化驱动(kmod-xenpv),针对 RHEL 5 半虚拟化驱动的安装和启用以及注意事项,请感兴趣的朋友参考这里

针对 RHEL6 来讲,情况就不同了,它是基于 2.6.32 主线内核的,集成了 pv-ops 模块,所以它不需要一个单独的 Xen 版本内核,就可以支持 pvm 和 pv-hvm,而在 RHEL 6 guest OS (host 是 RHEL 5)下,开启 Xen 半虚拟化驱动的方法,请参考这里, 简单的说就是在内核启动命令中添加如下选项:

xen_pv_hvm=enable

不过,这个功能默认已经开启了,所以禁用自启动半虚拟化驱动的方法,请参考这里, 其实就是在内核启动命令中添加如下选项:

xen_emul_unplug=never

而针对 Oracle Linux 来说,从 5.5 开始添加 UEK1 内核,它是基于 2.6.32 主线内核的,所以集成了 pv-ops 模块。从 5.9 开始,UEK2 内核是基于 2.6.39 主线内核的。这样较新版本的 Oracle Linux 系统都会在 hvm 和 pv-hvm 模式下自动搜索 pv driver,即使用户在 Oracle VM 界面下已经指定它的虚拟化模式是 hvm,这是个 Known Issue,关闭方法和在 RHEL 6 下的方法相同。

最后,多说一点,之前提到了修改内核启动参数的解决方法,其实有很多内核参数我们可以修改,感兴趣的朋友请参考这里

Tagged with: