Xen虚拟机介绍

Xen虚拟机介绍

Xen 是一个开放源代码虚拟机监视器,由剑桥大学开发。它打算在单个计算机上运行多达100个满特征的操作系统。操作系统必须进行显式地修改(“移植”)以在Xen上运行(但是提供对用户应用的兼容性)。这使得Xen无需特殊硬件支持,就能达到高性能的虚拟化。

本文主要是写给新接触Xen的开发者及想深入了解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的源代码和接口。
  
  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
0×80)来完成。在Xen中,类似的系统调用就是hypervisor,通过它,domain 0
调用hypervisor中的方法,它也是通过中断(Int 0×82)来完成的。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展示了设备控制器的层次。
  
 

  

  Domain 0运行后端驱动,同时最新创建domain运行前端驱动。许多消息在后端和前端驱动之间传送。前端驱动感觉上是虚拟的,它不需要使用特定硬件的详细信息。
  
  联系虚拟设备的中断是虚拟中断。
  
  结论
  
  Xen项目是一个很有趣同时充满了希望的项目。它的代码很复杂,特别是虚拟内存管理、活动域合并工具和授权表机制。本文仅仅是介绍性的,并不涉及这些话题。然而,我希望它能够成为想要了解和深入研究代码的一个出发点。

1.获得源码

下载源码包 在http://xensource.com/download上下载得到最新版本xen-3.0.2-src.tgz

2.解压并修改

tar zxvf xen-3.2.2-src.tgz到解压后的目录下修改makefile中的一行为(大概是第一行)KERNELS ?= linux-2.6-xen0 linux-2.6-xenU

3.编译XEN和内核文件

命令make world这样就编译出来未经自定义的内核vmlinuz-2.6.16-xen0和vmlinuz-2.6.16-xenU

4.安装编译好的文件

make install

5.创建initrd-2.6.16-xen0.img

由于/boot/目录下没有initrd-2.6.16-xen0.img 文件,而XEN装在RHEL4中正常启动需要此文件因此需用mkinitrd命令创建若是使用SCSI硬盘安装的,则需要先修改/etc/modprobe.conf去掉其中包含字符串mpt* 和 ata*的所有行否则会出现缺少模块的错误创建文件mkinitrd /boot/initrd-2.6.16-xen0.img   2.6.16-xen0

6.修改grub.conf文件

加入以下行title Xen 3.0 / XenLinux 2.6      root (hd0,0)     kernel /xen-3.0.gz dom0_mem=262144     module /vmlinuz-2.6-xen0 ro root=/dev/sda2   console=tty0     module /initrd-2.6.16-xen0.img由于我系统的/ 分区是sda2硬盘分区所以写 root=/dev/sda2domain0 启动的内存设为256M

7.重新启动

进入grub选择XEN的标签,启动了domain0系统

8.主要遇到的问题

8.1 预编译的二进制文件不符和本系统要求不能直接装,rpm包只有32位的仍不能使用8.2   启动时遇到下列问题 VFS cannot open root device "LABEL=/" or unknown-block(0,0)Please append a correct "root=" boot optionKernel panic - not sysncing : VFS : unable to mount root fs on unknown-block(0,0)修改makefile文件kernel行,并且把root=LABEL=/ 改为root=/dev/sda2后解决8.3 再次启动后遇到问题Warning: unable to open an initial console因为尚未添加initrd文件initrd-2.6.16-xen0.img于是创建initrd文件后,加入grub后可通过8.4 创建initrd 文件错误由与modprobe.conf 的问题先后有错误 No module mptbase found for kernel 2.6.16-xen0, aborting.moudule ata_piix is not found for kernel 2.6.16-xen0是使用SCSI硬盘安装的,则需要先修改/etc/modprobe.conf去掉其中包含字符串mpt* 和 ata*的所有行mkinitrd /boot/initrd-2.6.16-xen0.img   2.6.16-xen0后成功另外在mkinitrd过程中出现的错误都可以把modprobe中相应模块删除来解决,但是否有不良后果我不知道 重启后便进入系统说明安装成功 原文地址: http://hi.baidu.com/swaintee/blog/item/87091b0f4ffe0c2b6059f32b.html
2008年8月25日 | 归档于 Linux桌面
标签:
本文目前尚无任何评论.

发表评论

XHTML: 您可以使用这些标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>