Linux中国论坛's Archiver

神奇小猪 发表于 2007-4-25 15:14

全面介绍Xen虚拟机

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的源代码和接口。
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类的子类中实现,这个方法把前端和后端联系了起来。图2展示了设备的层次,图3展示了设备控制器的层次。
[attach]462[/attach]

[attach]463[/attach]

Domain 0运行后端驱动,同时最新创建domain运行前端驱动。许多消息在后端和前端驱动之间传送。前端驱动感觉上是虚拟的,它不需要使用特定硬件的详细信息。

  联系虚拟设备的中断是虚拟中断。

结论

  Xen项目是一个很有趣同时充满了希望的项目。它的代码很复杂,特别是虚拟内存管理、活动域合并工具和授权表机制。本文仅仅是介绍性的,并不涉及这些话题。然而,我希望它能够成为想要了解和深入研究代码的一个出发点。


感谢[url]www.vmware.cn[/url] Redant

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.