本文以常见的Fedora Core 6为例,介绍Xen的安装方法,至于在其他操作系统上的安装过程与之类似,读者可以触类旁通。在Fedora Core 6上安装Xen后,Xen将位于Fedora Core 6的底层,直接位于机器硬件之上,也就是说Xen将具有比Fedora Core 6更高的权限,这时Fedora Core 6就变成了Xen的Domain0(实际上就是具有管理权限的虚拟机)了。有了Domain0,我们就可以用它创建多个客户domain(就是没有管理权限的虚拟机)来运行不同的操作系统了。如果只用文字说明,不容易说清楚,通过图1,能够更好的帮你理解它们之间的关系:

 
图1 Xen架构示意图

下面开始介绍Xen的安装过程,不过这里有一个前提,就是您已经安装好了Fedora Core 6。我们先从二进制的安装方法下手。

一、从二进制程序包安装Xen

当前,几乎所有主要linux发行版,例如Red Hat、Debian、Ubuntu 、SUSE 和Gentoo等都已提供了Xen的二进制安装程序包。这样,我们就可以直接用linux发行版所带的安装包来安装Xen。当然,不同的发行版本使用的打包格式可能不太一样,好在它们都有相应的程序包管理器,所以这不会有问题。

需要说明的是,我们这里安装的不仅有Xen 内核,还有相应的程序库、Python模块以及从用户空间跟Xen打交道的应用程序。

◆具体操作

对于Fedora系统,它的程序包管理器是yum,我们将用它从预编译好的程序包来安装Xen。实际上,使用yum安装Xen是一件相当轻松的工作,具体过程如下所示:

1、通过下列命令来安装Xen 内核和有关软件:

yum install kernel-xen xen

这一命令将下载并安装以下程序包及其依赖包:

l  kernel-xen:该程序包存放的是主机操作系统和客户操作系统以及系统管理程序所用的Xen内核。

l  xen:该程序包存放的是跟Xen系统管理程序交互的用户空间工具。

l  bridge-utils :该程序包存放的是用于配置以太网桥的实用程序,以太网桥的作用是将多个以太网设备连在一起。

l  libvirt :该程序包存放的是一个C库,它提供了使用Xen框架所需的应用编程接口API

l  libvirt-python :该程序包存放的是一个Python 模块,有了它就可以让Python 应用程序使用libvirt提供的Xen框架应用编程接口。

l  Python-virtinst :该程序包存放的是一个Python 模块,该模块使用libvirt在虚拟机内安装Fedora /Red Hat Enterprise Linux

l  Xen-libs :该程序包存放的是Xen的管理程序所需的程序库。

2、上面讲了Xen的安装,我们再来看看它的引导配置问题。我们知道,Fedora Core 6的系统引导管理器是grub,所以要在其配置文件即/boot/grub/grub.conf文件中添加一个引导Xen内核的条目。执行安装命令后,grub.conf将变成如图2所示:

 
图2 修改前的grub.conf文件

从上图可以看到,Xen内核已经在grub.conf中了,但它并不是默认引导的内核。因为default=1,也就是说默认引导的内核是第二个内核,即常规的Linux内核。这样,要想使用Xen内核,要么在引导期间通过grub的菜单手工引导它,或者干脆在grub.conf文件中将它设为默认引导的内核,这样可以一劳永逸。我们选择第二种方式,这种方法需要修改/boot/grub/grub.conf,将default=1改为default=0。这样就把系统默认引导的内核从Fedora内核改成了Xen内核。注意,执行这步时,需要具有root权限。

3、到目前为止,Xen内核的安装已经告一段落。但是,现在我们仍然在使用常规内核,而非刚安装的Xen内核。为了启用新的内核,我们需要重新启动系统。

4、机器重启后,在硬件平台上运行的已不是原来的Fedora Core 6,而是我们新安装的Xen系统管理程序。如若不信,可以用以下命令查看正在运行的内核的版本,如下所示:

 
图3 查看当前的内核版本

5、Xen中用来管理Domain的是守护进程xend,我们可以使用/etc/rc.d/init.d/xend 脚本来启动和停止该守护进程。Fedora Core 6在引导时会自动启动该守护进程。执行以下命令:

pidof xend

该命令将列出当前在系统上运行的进程,以便检查Xend是否正在运行。

6、Xend运行后,它会启动一个具有特权的Domain:Domain0,它实际上就是原先的Fedora Core 6,只不过它现在是在一层软件即Xen系统管理程序上而非硬件之上运行。若要查看Domain0是否已经创建好,并已经运行,可以使用xm 命令,如下所示:

 

 
图4 查看Domain0的运行情况

7、用ifconfig命令检查所有网络接口是否已经可用,包括常规网络接口例如eth0 和lo,以及Xen有关的接口。如果一切正常的话,现在Xen已在运行了。

◆相关说明

我们使用yum安装的软件有:Xen系统管理程序、Dom0内核、Xen使用的程序库和各种Python模块、从Dom0跟Xen交互的用户空间工具等。

在安装的过程中,会自动修改grub的配置文件,即自动在其中添加一些引导Xen系统管理程序和Dom0内核的内容。通过阅读这些内容,能帮我们更好的理解Xen系统的引导过程。下面对在/boot/grub/grub.conf文件中为Xen 内核添加的内容分别加以解释:

title Fedora Core (2.6.19-1.2911.6.5.fc6xen)

上面这一行定义了内核的名称。在引导时,grub会给出一个菜单,让您从中选择要引导的内核,这里定义的内核名称将出现在这个菜单中。

root (hd0,1)

上面这一行定义了引导系统时所用的根分区。

kernel /xen.gz-2.6.19-1.2911.6.5.fc6

上面这一行指定了要引导的内核。对Xen来说,该行要指定Xen系统管理程序的内核,而非Dom0的内核。对于常规的Linux来说,引导的是实际的Linux内核。

module /vmlinuz-2.6.19-1.2911.6.5.fc6xen ro root=/dev/VolGroup00/ LogVol00 rhgb quiet

上面这一行用于指定用于dom0的内核,其中的“root”选项用于规定存放根文件系统的分区,剩下的那些其他选项,并非只针对Xen来的,而是将应用于所有的Linux内核。

module /initrd-2.6.19-1.2911.6.5.fc6xen.img

上面这一行的作用是定义了存放内核在初始化时首先装入的初始RAM磁盘镜像的文件。这个initrd 镜像仅适用于宿主机,而不能用于客户机。

当计算机引导时,它会载入系统管理程序来完成Xen的初始化。这时,会看到屏幕上有许多消息一闪而过。然后,xen系统管理程序会引导Dom0内核。具体过程是,Dom0内核使用的操作系统中有一个名为init的脚本,该脚本会启动Xen的守护进程Xend,然后该守护进程开始创建并加载Dom0。

Dom0包含许多Xen程序库,它们提供客户端和用户级应用程序用来跟Xen框架通信的应用程序接口。我们知道,Xen使用Python脚本语言,因此Python模块将这些功能打包,以便用Python 编写的应用程序能够使用他们。这里,我们要用到Xend管理器:xm,来查看有没有Xen Domain正在运行。xm是管理各种Xen客户Domain的主要工具。它可用于创建、暂停和关闭Domain,以及显示当前的Domain。限于篇幅,我们不对xm的用法详细介绍。最后,一定确保网络接口已经可用。

现在,我们已经利用Fedora Core 6所带的预编译好的二进制程序包成功安装了Xen,并且已经正常运行了,剩下的事就是安装其它操作系统了。

二、从源代码安装Xen

上面,我们介绍了利用二进制程序包来安装Xen的过程。就像您看到的那样,这种方法是相当简单和快捷的,但是,凡事有利皆有弊,它的缺点是必须依赖预编译好的Xen程序包,但是,Xen总是处在不断的发展进化之中,比如它会不断修复bug,不断添加新的特性。那么,预编译好的程序包就无法享用这些变化所带来的好处了。

要想使用最新功能吗?想使用最新的修正版吗?那好,跟我来吧!让我们自己动手,从源代码来构建我们中意的Xen版本。下面我们将介绍如何从头开始编译Xen,并将其安装在Fedora系统。

◆具体操作

从源代码安装Xen的过程是:检索源代码,安装所有的依赖包,编译源代码,最后编译好的Xen安装到Fedora Core 6机器上。下面介绍具体操作方法:

1、为了存放Xen的源文件,我们先创建一个目录并切换至该目录下:

mkdir ~/xen-source

cd ~/xen-source

2、Xen项目使用的源代码控制系统称为Mercurial,我们这里通过mercurial来获取源代码,如果您还没有安装其客户端的话,可以通过yum来完成其安装过程。具体命令如下所示:

yum install mercurial

在mercurial仓库中会有许多不同的版本,并且不同的版本放在不同的“储藏室”(即目录)中,名称通常为Xen-×.×.×-testing.hg,这表示Xen下一个×.×.×版本的预览版。我们可以使用mercurial 客户端hg获取相应的源代码,命令格式如下所示:

hg clone http://xenbits.xensource.com/储藏室名 本地储藏室名

比如,下列命令

hg clone http://xenbits.xensource.com/xen-3.0.4-testing.hg

将本地创建一个名为xen-3.0.4-testing.hg 的目录,并将远程xen-3.0.4-testing.hg 的目录中的源文件下载到本地创建的目录中。同时显示一些状态消息:

requesting all changes

adding changesets

adding manifests

adding file changes

added 13140 changesets with 91364 changes to 9471 files

3087 files updated, 0 files merged, 0 files removed, 0 files unresolved

3、源文件已经下载好了,但是要编译的话,我们还需要安装编译器、程序库以及设置Xen开发环境所需的一些头文件。下表是需要在 Fedora Core上安装的一些程序包。如果您之前曾经编译过C代码的话,那说明这些软件您之前就安装过了,可以略过这一步。

 

程序包

 

作用

gcc

这是编译C 代码所需的GNU编译器工具集。

xen-devel

包含从源代码编译Xen需要的程序库和头标文件。

tetex-latex

包含为Xen制作文档时使用的TeX 文本格式化系统的latex 前端。

python-devel

包含开发python 扩展所需的头标文件和程序库。

xorg-X11-proto-devel

开发X11应用程序所需的所有包含文件和程序库。

zlib-devel

开发使用zlib压缩和解压缩库的程序时所需的头标文件和程序库。

openssl-devel

包含开发支持各种密码算法和协议的应用程序时所需的静态库和包含文件。

ncurses-devel

利用ncurses终端处理库开发应用程序时所需的头标文件。

glibc-headers

包含开发使用标准c库的程序所需的头文件。

libgomp

包含GCC 共享辅助程序库,它是OpenMP2.5所需要的。

glibc-devel

包含开发使用标准c库的应用程序时所需的目标文件。

我们可以使用yum安装这些程序包,具体命令如下所示:

yum install gcc glibc-devel xen-devel libgomp glibc-headers

ncurses-devel openssl-devel zlib-devel xorg-X11-proto-devel

python-devel tetex-latex

4、编译内核之前,首先要对它进行正确的配置。使用以下命令:

make linux-2.6-xen0-config

这会产生Linux 内核配置会话。根据您的的需要,进行相应的配置,然后退出会话,并在询问时选择保存所作修改。

5、配置后,用下列命令编译内核和相关模块:

make linux-2.6-xen0-build

6、以上所述命令的编译结果被放进dist/install 目录。其中dist/install/boot目录包含Xen内核的配置、内核镜像和内核调试符号文件,而dist/install/lib 目录包含所有内核模块和驱动程序。

7、以 root 身份运行以下命令,将上述内容安装到系统上。这不仅安装内核模块,还会把内核镜像和符号文件复制到/boot 。

make linux-2.6-xen0-install

8、运行depmod 命令来读取/lib/modules/2.6.16.38-xen0下的所有模块来创建一个模块依赖性列表:

depmod -a 2.6.16.38-xen0

9、在boot 目录下创建Xen 内核引导时使用的initrd,例如:

mkinitrd –v –f  –with=sd_mod  --with=scsi_mod  /boot/initrd-2.6.16.38-xen0.img 2.6.16.38-xen0

确保此前没有安装Xen 工具二进制文件程序包,这样就可以编译并安装所需的Xen工具、程序库和Python模块了:

make install KERNELS="linux-2.6-xen0"

10、修改grub ,在其中添加一个条目来引导这个新的Xen内核。这一步可以参考前面介绍的方法。

11、重新启动以进入新的Xen系统。进行适当的检查,看看是否所有东西都已正常运行,尤其是网络接口,必须确保他们全部就位并正常运转。

好了,我们已经成功编译并安装了Xen的开发版本,如果一切正常,那么现在它应该已经开始运行了。

◆相关说明

虽然,上文使用的是mercurial 客户端来检索Xen的源代码,但是我们还可以从http: //xenbits.xensource.com下载Xen的源代码。这里有Xen的各种开放源代码版本,既有稳定版本,也有处于开发中的版本。我们前面使用的预编译好的程序包,通常就是从稳定版本编译而来的。

为了给编译源码做好准备,我们介绍了编译C 代码所需的工具,包括gcc 编译器,的安装过程。另外,像openssl和zlib这些程序库也是编译Xen时所需要的。还有,Xen发行版本的Makefile给出了几个预定义的标记,在编译时要用到,下面简单介绍一下:

1)Linux-2.6-xen0-config :这个标记用于配置Dom0内核。默认时,使用menuconfig选项来配置Linux 内核,该选项会产生一个配置会话。配置过程中,可以通过各种选项来调整Dom0内核,以满足您的特定需要。我们还可以使用其它的接口进行配置。第一次运行这个标记时,将从http ://kernel.org 下载Linux-2.6.16.38到当前目录,这个未修改的内核称为“远古内核”。

它将被下载并存储在本地的pristine-linux 目录中,并被打包成bzip文件。同时,它还会创建一个名为Linux-2.6.16.38-Xen的Dom0目录,并将Xen的补丁施加到这个目录中的“远古内核”上,以创建Dom0内核。

2)Linux-2.6-Xen0-build :这个标记使用上一步的配置编译内核和模块。编译得到的内核和模块安装到当前目录内的dist/install 目录。

3)Linux-2.6-Xen0-install :这个标记将dist/install目录中的内容安装到本地系统上。内核和内核配置文件随同帮助调试的内核符号文件一起被复制到/boot 目录。为了完成此任务,您必须具有管理特权。所以,执行这个标记之前,需要使用su 或者sudo 命令变成root用户。

4)Install KERNELS ="linux -2.6-Xen0":这个标记将编译Xen程序库和Python模块,并且把它们安装到系统上。这同样需要具有root权限。

编译好之后,我们还需要制作一个用于引导的initrd 镜像。当使用预编译好的程序包安装Xen时,它是自动安装的。但是这里的内核是由我们自己动手编译的,所以initrd 镜像也要我们自己下手,为此要用到mkinitrd命令。最后,在/boot/grub/grub.conf中加入一个条目,来引导我们自己的Xen版本。

三、结束语

本文中,我们向读者详细介绍了Xen的两种安装方式,一种使用Linux发行版本所提供的预编译好的二进制程序包安装Xen;另一种是从头开始编译和安装Xen。对于不同的安装方法,您可以根据您的具体情况加以选择——我想总有一种会适合您。