本文主要是写给新接触Xen的开发者及想深入了解Xen的人 Xen VMM(virtual machine monitor)是由剑桥大学计算机实验室开发的一个开源项目它能够让我们创建更多的虚拟机每一个虚拟机都是运行在同一个操作系统上的实例 这些客户OS可以是修补过的Linux内核或也可以是修补过的NetBSD/FreeBSD内核用户应用程序就运行在这些客户OS上并不需要修改任何代码 我曾经紧密跟蹤Xen项目一年多对Xen产生兴趣是在读了年的OLS(Ottawa Linux Symposium)论文集之后 完全虚拟化已经被一些硬件仿真程序实现了硬件仿真器的不利因素是它们的性能 Xen项目(半虚拟化)的思想已经不是很新鲜了性能度量和它达到的高效性能够被看作是一个突破运行Xen的系统开销确实非常小大约占% 就像刚才所说的那样现在的Xen要为内核打补丁但是将来的处理器能支持虚拟化内核也就不需要打补丁了比如说Intel的VT和AMD的Pacifica处理器都将包括这种支持 XenSource公司年月在Intel开发者论坛(IDF)上发表声明说它已经利用Intel的VTEnabled平台和Xen技术虚拟化了Linux和Windows XP SP 如果没有其它虚拟化方法的话Intel的VT和AMD的Pacifica将会在对Xen的支持上展开竞争 同时参与竞争的还有VMWare公司的ESX Server它不是基于Xen的虚拟化解决方案VMWare公司年月初声明他将通过一个叫VMware Community Source的计划允许他的合作伙伴使用VMware ESX Server的源代码和接口 VMware的一个显着优势就是它不需要在客户OS上打补丁VMware可能比Xen运行地慢一些因为它使用影子页表(shadow page tables)而Xen同时使用直接和影子页表 Xen已经在像Fedora Core Debian和SuSE Professional 这些产品中捆绑发行了它也将被包含在RHEL 中 针对其它处理器的支持正在有条不紊地进行着Xen小组致力于x_ port同时IBM着手于提供Power 芯片的支持 保护环 在Xen中一个系统管理程序运行在环客户OS运行在环应用程序运行在环这种关系对于x/有一点不同就是客户内核和应用程序都运行在环上 Xen自身被称为系统管理程序是因为它比客户OS的系统管理代码运行所需的特权级还高 当系统引导的时候Xen被装载到环的内存中它在环上启动修补过的内核这被称作是domain (译者注domain是指一个运行中的虚拟机在其上有一个guest OS在执行)从这个domain开始你可以创建更多的domain也可以销毁它们可以进行domain的迁移设置参数等等你创建的那些domain也运行在环它们的内核中用户应用程序运行在环 目前修补过的Linux内核和可以作为domain 据Xen开发者所说将来domain 仅支持的内核补丁构造domain 的大部分工作是在xen/arch/x/domain_buildc中的construct_dom()方法中实现的 物理设备驱动程序只能运行在特权级也就是domain 上Xen依靠Linux或其它修补过的OS内核对它所有的设备提供虚拟化支持这样的好处就是Xen的开发者不必再去开发设备驱动程序 在一个有标签TLB的处理器上使用Xen能够大大提高性能标签TLB能够把ASID(address space identifier)放在TLB入口处有了这个特性当处理器在系统管理程序和客户OS之间切换时就不需要刷新TLB了这大大减少了系统开销 Xend Deamon 首先我们介绍一下Xend它是Xen控制器daemon意思是说它负责处理创建销毁迁移以及其它许多domain管理的任务它很大一部分动作是基于一个HTTP服务器的大量对domain的控制请求都是通过发送HTTP请求来实现的 我们在引导进入Xen后通过命令行命令xend start来启动Xend daemon它需要Python的支持 Xend daemon的工作是建立在与XCS server(the control Switch)的交互上所以当我们启动Xend daemon时需要检查一下XCS是否已经启动和运行了如果没有我们将试着去启动它 Srv Daemon是Xend的主要程序启动Xend daemon就会创建一个Srv Daemon类的实例 接下来在createFactories()方法中创建一个Channel FactoryChannel Factory有一个隐含的notifier对象Xend daemon的大量工作都是基于这个notifier接收的消息的这个factory创建一个线程在一个无限循环中读取这个notifier 创建domain 创建一个domain是通过使用一个hypercall(DOM_CREATEDOMAIN)来完成的Hypercall是Linux内核中的一个系统调用通过它用户空间可以调用内核中的方法它通过一个中断(Int x)来完成在Xen中类似的系统调用就是hypervisor通过它domain 调用hypervisor中的方法它也是通过中断(Int x)来完成的hypervisor通过它的虚拟CPU访问每一个domain XendDomain类和XendDomainInfo类在创建和销毁domain中扮演着非常重要的角色我们通过调用XendDomain中的domain_create()方法创建一个新的domain XendDomainInfo类和它的方法主要用于一个domain的实际构造 XCS Server XCS server有两个TCP套接字分别是控制连接和数据连接它们不同的地方在于前者是同步的后者是异步的前面提到的notifier对象就是XCS服务器的一个客户端 创建虚拟设备 XendDomainInfo中的create()方法启动一个创建domain的动作链首先被创建的是这个domain的虚拟设备这个create()方法调用create_blkif()创建一个块设备接口(blkif)即使VM不需要磁盘它也是必须被创建的另一个虚拟设备通过create_configured_devices()创建 所有的设备类都从Dev继承Dev是一个联系设备控制器的抽象类它的attach()抽象方法在每一个Dev类的子类中实现这个方法把前端和后端联系了起来图展示了设备的层次图展示了设备控制器的层次 Domain 运行后端驱动同时最新创建domain运行前端驱动许多消息在后端和前端驱动之间传送前端驱动感觉上是虚拟的它不需要使用特定硬件的详细信息 联系虚拟设备的中断是虚拟中断 结论 Xen项目是一个很有趣同时充满了希望的项目它的代码很复杂特别是虚拟内存管理活动域合并工具和授权表机制本文仅仅是介绍性的并不涉及这些话题然而我希望它能够成为想要了解和深入研究代码的一个出发点 |