Username: Password:

深入学习Xen新起点 全面介绍Xen虚拟机
来源:linuxsky作者:linuxsky 发布时间:2008-04-07 02:56:06

您的位置: Linux时代 > 技术文档 > 系统安全 >

深入学习Xen新起点 全面介绍Xen虚拟机

日期:2006-07-27  来自:linuxsky


Xen VMM(virtual machine monitor)是由剑桥大学电脑实验室研发的一个开源项目,他能够让我们创建更多的虚拟机,每一个虚拟机都是运行在同一个操作系统上的实例。
这些客户OS能够是修补过的Linux内核2.4或2.6,也能够是修补过的NetBSD/FreeBSD内核。用户应用程式就运行在这些客户OS上,并无需修改任何代码。
我曾紧密跟踪Xen项目一年多。对Xen产生兴趣是在读了2004年的OLS(Ottawa Linux Symposium)论文集之后。
完全虚拟化已被一些硬件仿真程式实现了。硬件仿真器的不利因素是他们的性能。
Xen项目(半虚拟化)的思想已不是很新鲜了。性能度量和他达到的高效性,能够被看作是个突破,运行Xen的系统开销确实很小,大约占3%。
就像刚才所说的那样,现在的Xen要为内核打补丁,但是,将来的处理器能支持虚拟化,内核也就无需打补丁了。比如说,Intel的VT和AMD的Pacifica处理器都将包括这种支持。
XenSource公司2005年8月在Intel研发者论坛(IDF)上发表声明说,他已利用Intel的VT-Enabled平台和Xen技术虚拟化了Linux和Windows XP SP 2。
假如没有其他虚拟化方法的话,Intel的VT和AMD的Pacifica将会在对Xen的支持上展开竞争。
同时参和竞争的更有VMWare公司的ESX Server,他不是基于Xen的虚拟化解决方案。VMWare公司2005年8月初声明,他将通过一个叫VMware Community Source的计划允许他的合作伙伴使用VMware ESX Server的源代码和接口。
VMware的一个显著优势就是他无需在客户OS上打补丁。VMware可能比Xen运行地慢一些,因为他使用影子页表(shadow page tables),而Xen同时使用直接和影子页表。
Xen已在像Fedora Core 4、Debian和SuSE Professional 9.3这些产品中捆绑发行了,他也将被包含在RHEL 5中。
针对其他处理器的支持正在有条不紊地进行着。Xen小组致力于x86_64 port,同时IBM着手于提供Power 5芯片的支持。
保护环
在Xen中,一个“系统管理程式”运行在0环,客户OS运行在1环,应用程式运行在3环。这种关系对于x64/64有一点不同,就是客户内核和应用程式都运行在3环上。
Xen自身被称为“系统管理程式”,是因为他比客户OS的系统管理代码运行所需的特权级还高。
当系统引导的时候,Xen被装载到0环的内存中。他在1环上启动修补过的内核,这被称作是domain 0(译者注:domain是指一个运行中的虚拟机,在其上有一个guest OS在执行)。从这个domain开始,您能够创建更多的domain,也能够销毁他们,能够进行domain的迁移、配置参数等等。您创建的那些 domain也运行在1环他们的内核中。用户应用程式运行在3环。

现在,修补过的Linux内核2.4和2.6能够作为domain 0。据Xen研发者所说,将来domain 0仅支持2.6的内核补丁。构造domain 0的大部分工作是在xen/arch/x86/domain_build.c中的construct_dom0()方法中实现的。
物理设备驱动程式只能运行在特权级,也就是domain 0上。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。他需要Python2.3的支持。
Xend daemon的工作是建立在和XCS server(the control Switch)的交互上。所以,当我们启动Xend daemon时,需要检查一下XCS是否已启动和运行了。假如没有,我们将试着去启动他。
Srv Daemon是Xend的主要程式,启动Xend daemon就会创建一个Srv Daemon类的实例。
接下来在createFactories()方法中创建一个Channel Factory。Channel Factory有一个隐含的notifier对象。Xend daemon的大量工作都是基于这个notifier接收的消息的。这个factory创建一个线程,在一个无限循环中读取这个notifier。
创建domain
创建一个domain是通过使用一个hypercall(DOM0_CREATEDOMAIN)来完成的。Hypercall是Linux内核中的一个系统调用,通过他,用户空间能够调用内核中的方法,他通过一个中断(Int 0x80)来完成。在Xen中,类似的系统调用就是hypervisor,通过他,domain 0 调用hypervisor中的方法,他也是通过中断(Int 0x82)来完成的。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 0运行后端驱动,同时最新创建domain运行前端驱动。许多消息在后端和前端驱动之间传送。前端驱动感觉上是虚拟的,他无需使用特定硬件的周详信息。
联系虚拟设备的中断是虚拟中断。
结论
Xen项目是个很有趣同时充满了希望的项目。他的代码很复杂,特别是虚拟内存管理、活动域合并工具和授权表机制。本文仅仅是介绍性的,并不涉及这些话题。然而,我希望他能够成为想要了解和深入研究代码的一个出发点。

喜欢本文,那就收藏到:

    Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网
相关评论  我也要评论
还没有关于此文章的相关评论!
  • 昵称: (为空则显示guest)
  • 评论分数: ★ ★ ★★★ ★★★★ ★★★★★
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
  • 导航
    赞助商
    文章类别
    订阅