在 Debian 上源码安装 Xen

博客上有位网友遇到源代码安装的问题,留了不少评论。源代码安装不难就是麻烦,如果不是特别需要还是选择二进制安装比较方便,直接用 yum install,apt-get install 或者 emerge 轻松搞定。源代码安装有两个好处,一个是可以定制 Linux 内核,这样可以删除网卡、无线、USB、蓝牙、多余的文件系统等 n 多服务器不需要的硬件驱动和模块,得到一个最小而且针对硬件编译过的内核,性能会好很多;第二个就是二进制发布往往滞后,所以如果想尝鲜新功能的话就只能源码安装。安装服务器前对每台服务器的硬件都做记录是个好习惯,特别是服务器多的时候,方便以后需要的时候查阅,VPSee 在内部使用 Wiki 记录服务器硬件信息,用源代码控制工具来追踪系统配置文件的更改。以下的操作记录使用最新的 Xen 4.0.0 源代码版本和 Debian 5.04,这里有在 CentOS 下源码安装 Xen 和 在 Ubuntu 上源码安装 Xen 的过程。

安装需要的软件包

首先最小化安装 Debian,然后安装编译 Xen 和 Linux xen kernel 所需要的软件包:

# apt-get install bcc bin86 gawk bridge-utils iproute libcurl3 \
libcurl4-openssl-dev bzip2 module-init-tools transfig tgif texinfo \
pciutils-dev mercurial build-essential make gcc libc6-dev \
zlib1g-dev python python-dev python-twisted libncurses5-dev \
patch libvncserver-dev libsdl-dev libjpeg62-dev uuid-dev iasl

# apt-get build-dep linux

如果是64位系统的话,还需要安装:

# apt-get install gcc-multilib

安装 Xen hypervisor 和 tools

到 http://www.xen.org/products/xen_source.html 下载最新的 Xen 源代码,然后解开、编译、安装,标准的 Linux 软件源码安装动作:

$ tar zxvf xen-4.0.0.tar.gz
$ cd xen-4.0.0/
$ make xen tools stubdom
# make install-xen install-tools install-stubdom

上面 make stubdom 的时候会从网上自动下载一些东西,所以如果是用代理上网的话需要在自己根目录下的 .wgetrc 里加上代理服务器,以便 wget 能通过代理正常下载:

$ vi .wgetrc
http_proxy = http://proxy.vpsee.com:3128/
use_proxy = on

加入到自动启动脚本中:

# update-rc.d xend defaults 20 21
# update-rc.d xendomains defaults 21 20

安装 Xen 内核

下载 xen 内核,给内核打补丁:

$ cd
$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.31.8.tar.bz2
$ tar -xjf linux-2.6.31.8.tar.bz2

$ wget http://gentoo-xen-kernel.googlecode.com/files/
xen-patches-2.6.31-10.tar.bz2
$ mkdir xenpatch-2.6.31.8
$ cd xenpatch-2.6.31.8
$ tar -xjf ../xen-patches-2.6.31-10.tar.bz2
$ cd ..

$ cd linux-2.6.31.8
$ for i in `ls ../xenpatch-2.6.31.8/`; \
do patch -p1 < ../xenpatch-2.6.31.8/"$i"; done

配置内核,直接把系统已经存在的配置文件拷过来然后在此基础上修改:

$ cp /boot/config-2.6.31-14-server .config
$ make menuconfig

Processor type and features --->
  [*] Enable Xen compatible kernel
Networking support --->
  Networking options --->
    <*> 802.1d Ethernet Bridging
Device Drivers --->
  XEN --->
    [*] Privileged Guest (domain 0)
     Backend driver support
       Block-device backend driver
       Block-device tap backend driver
       Block-device tap backend driver 2
       Network-device backend driver
       PCI-device backend driver
       SCSI backend driver
       USB backend driver
    <*> Block-device frontend driver
    <*> Network-device frontend driver
     SCSI frontend driver
     USB frontend driver
    <*> Framebuffer-device frontend driver
    <*>   Keyboard-device frontend driver
    [*] Disable serial port drivers
    <*> Export Xen attributes in sysfs
        Xen version compatibility (3.3.0 and later) --->
           3.3.0 and later

配置好内核参数以后,保存配置文件、退出配置界面就可以开始编译 Linux 内核了:

$ make
# make install
# make modules_install
# update-initramfs -c -k 2.6.31.8
# depmod 2.6.31.8

如果 Xen 加了内核模块的话加入 /etc/modules 文件以便启动时候自动加载:

# vi /etc/modules
...
netbk
blkbk

更新 grub:

#  update-grub
#  vi /boot/grub/menu.lst

重新启动系统,就应该可以进入 dom0 了:

# reboot

# uname -a
Linux debian 2.6.31.8 #1 SMP Sat Apr 17 09:26:20 SAST 2010 x86_64 GNU/Linux

# xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0   3713     4     r-----     48.7

评论 (27 Comments)

  1. vpsee,在你的描述中,在最小化安装完Debian后,你安装了Linux xen kernel 所需要的软件包。
    我的问题是:你是如何知道需要哪些依赖包的?

    另一个问题,就是 你是如何知道哪个patch + 哪个kernel版本是当前最稳定的搭配呢?

  2. 当你在编译源代码不通过的时候,错误提示会显示缺少哪个软件包,而且很多书上都有对 xen 所需依赖包的介绍和参考,比如这本 wrox 出的 Professional Xen Virtualization 第3章第81页。当然你也可以 xen 源代码包里的工具检查:xen-4.0.0/tools/check/chk build

    这篇文章用的是 xen 4.0.0,是最新的发行版本,不是最稳定的版本。那要靠平时的经验了,我们有 n 多服务器都在运行不同版本的 xen 和 linux,哪个运行好哪个搭配不好,都会有记录。就像出去吃饭一样,哪家餐馆好吃哪家不好吃都很明白,不过也和个人口味有关,所以我们认为很稳定的版本其他人可能觉得不好。

  3. 谢谢vpsee,本周再次进行源码安装时,在编译这一步出错,环境为CentOS5.4(32位)最小化安装+Xen3.4.2
    按要求把依赖包都安装上,在编译时出现如下错误
    [root@dell xen-3.4.2]#make dist
    …..
    make[4]: *** [qemu-dm] Error 1
    make[4]: Leaving directory `/xen/xen-3.4.2/tools/ioemu-qemu-xen/i386-dm’
    make[3]: *** [subdir-i386-dm] Error 2
    make[3]: Leaving directory `/xen/xen-3.4.2/tools/ioemu-qemu-xen’
    make[2]: *** [subdir-install-ioemu-dir] Error 2
    make[2]: Leaving directory `/xen/xen-3.4.2/tools’
    make[1]: *** [subdirs-install] Error 2
    make[1]: Leaving directory `/xen/xen-3.4.2/tools’
    make: *** [install-tools] Error 2
    make: *** Waiting for unfinished jobs….
    include2/asm/byteorder.h:5:28: error: linux/compiler.h: No such file or directory
    查找资料说linux/compiler.h:这个错误可以忽略不计,但是我忽略后安装
    [root@dell xen-3.4.2]#make install -j 8
    安装完成,结果没有异常信息
    修改grub.conf文件后,运行命令测试
    [root@dell ~]# uname -a
    Linux dell.2850.2 2.6.18.8-xen #1 SMP Mon Apr 19 12:47:22 CST 2010 i686 i686 i386 GNU/Linux
    ————————-
    [root@dell ~]# xm info
    Traceback (most recent call last):
    File “/usr/sbin/xm”, line 5, in ?
    from xen.xm import main
    ImportError: No module named xen.xm
    请问是否安装过程中缺少什么依赖包吗?

  4. 看看少了 python-xml, python-devel, python 没?

  5. 在检查依赖包这一步如下,应该是不缺少啥包了吧?
    [root@centos check]# ./chk build
    Xen CHECK-BUILD Tue Apr 20 21:55:13 CST 2010
    Checking check_crypto_lib: OK
    Checking check_curl: unused, OK
    Checking check_openssl_devel: OK
    Checking check_python: OK
    Checking check_python_devel: OK
    Checking check_x11_devel: OK
    Checking check_xgettext: OK
    Checking check_xml2: unused, OK
    Checking check_zlib_devel: OK
    Checking check_zlib_lib: OK

  6. 没有看到 Checking check_uuid_devel: OK,编译 xen 的时候 uuid-devel 是必须的啊,你是怎么通过编译 make xen 和 make tools 的啊?请问你的 xen 和 xen tools 都安装完整了吗?

  7. 回vpsee,我是按照这篇文章来进行编译的http://hi.baidu.com/%B7%E3%BE%ED%B2%D0%D4%CF/
    blog/item/06032797f8b7796155fb96c0.html
    昨天再次重装系统然后再次编译Xen出现另外错误:
    [root@dell2850 check]# xm
    Traceback (most recent call last):
    File “/usr/sbin/xm”, line 5, in ?
    from xen.xm import main
    File “usr/lib/python2.4/site-packages/xen/xm/main.py”, line 53, in ?
    File “usr/lib/python2.4/site-packages/xen/xm/console.py”, line 19, in ?
    ImportError: /usr/lib/python2.4/site-packages/xen/lowlevel/xs.so: undefined symbol: xs_set_target

  8. 呵呵,你真不顺啊,我写了一篇在 centos 上编译的,明天或者后天发,你到时候可以参考一下:)

  9. 谢谢VPsee的热心指导

  10. 请教楼主
    我按照centos编译xen的帖子去编译,也遇到了三天的情况:
    [root@dell2850 check]# xm
    Traceback (most recent call last):
    File “/usr/sbin/xm”, line 5, in ?
    from xen.xm import main
    File “usr/lib/python2.4/site-packages/xen/xm/main.py”, line 53, in ?
    File “usr/lib/python2.4/site-packages/xen/xm/console.py”, line 19, in ?
    ImportError: /usr/lib/python2.4/site-packages/xen/lowlevel/xs.so: undefined symbol: xs_set_target
    请问如何解决 谢谢

  11. VPsee你好
    我有个问题想请教一下,现在我在Debian Squeeze/Sid上安装Xen 4.0.0, 用的内核是2.6.32.15,编译和安装的过程都没有问题,但是启动的时候,总是停留在”Xen Trace Buffer Disabled”的地方,然后就自动重启了,我想问问你有没有什么建议,谢谢了

  12. 你把 linux 内核降个版本、改成 linux-2.6.31.8 试一下,我以前在 Debian 上遇到过类似问题用的是 linux-image-2.6.16-2-xen,结果是 Debian 有名的未解决的 Debian Bug (#384638),后来改成 linux-image-2.6.16-1-xen 就好了。

  13. 十分感谢你的建议!
    昨天我尝试了不同版本的Xen(3.4.2 and 4.0.0),以及不同版本的内核2.6.31.13,2.6.32.5,2.6.32.15。在GRUB中加入了所有debug参数,结果还是出现了以上问题。

    现在严重怀疑是Squeez/sid的问题,或者是GRUB2的问题,我会试一试你提到的2.6.31.8内核,再次感谢!

  14. 嗯,我不确定 Debian squeez/sid 也用 grub2,这篇 在 Ubuntu 上源码安装 Xen 提到了 grub2 导致的 bug:

    Ubuntu 9.10 默认用的是 grub 2.0,被证实一些 bug 会导致 Xen 不能正常启动,删除 grub 2.0 换成老版本的 grub.

  15. Vpsee,你好
    我测试了2.6.31.8这个版本,还是不行,另外,我把Grub2降到了Grub,问题依然存在,最后找到一个连接,致命性地说Squeeze不支持啊
    http://publications.jbfavre.org/virtualisation/migration_form_xen3_to_xen4_lvm_drbd_debian.en
    只能换系统了,谢谢你的帮助和建议

  16. 谢谢vpsee, 我终于成功了。
    在安装debian之前,试过Fedora 12和CentOS 5.5,结果都不能成功引导系统。
    以前曾想试用debian,但一看那复杂的安装界面就立即放弃了。这次非常感谢vpsee,安装说明详细准确。
    我的安装环境如下,请还没有试过的朋友参考。
    主板:P5K-E,CPU:Core 2, ChipSet: P35 (ICH9R), 硬盘:Western Digital SATA 640 x 2
    debian 5.04
    Software RAID — 比Fake RAID速度还快 — 安装比较复杂
    # apt-get build-dep linux — 这步没找到linux,不过没有任何影响。
    加载内核模块 /etc/modules — 这步不大明白,省略了,不过没有任何影响。

  17. 根据官方这篇 Xen on Testing/Squeeze and on Unstable/Sid Wiki,Squeeze 应该是支持的,问题可能出在其他地方。

  18. 在Debian Lenny 5.0.5 (内核2.6.26-2)64位系统下源安装Xen 3.1.0时,会下载2.6.18内核,如何让Xen使用当前linux版本的内核?Xen的版本必须是3.1.0。

    另外我看安装说明时发现,要先安装一个Xen内核包,名为linux-image-2.6.26-2-xen-amd64,装上之后menu.lst就多出该项,但不能启动该项,然后再装Xen3.1,这个比较奇怪。

  19. Xen 只能使用个别 Linux 几个版本号的内核,所以说不是所有版本的 Linux 内核都可以用的。为什么这样?因为 Xen 开发团队赶不上 Linux kernel 的更新速度,所以 Xen 只能锁定某个版本的 Linux kernel 然后在它基础上开发。

    你安装的这个 linux-image-2.6.26-2-xen-amd64 应该是二进制安装,看这篇:在 Debian 上安装和配置 Xen

  20. 主要是我看的那个安装说明写得的确奇怪。因为我要安装的是基于Xen的一个工具,这个工具要求使用源码安装,但又要安装linux-image-2.6.26-2-xen-amd64包。源码安装又要求使用跟当前linux版本一致的内核。我整个人糊涂了。

    如果您有时间,不妨看一下这个:http://ether.gtisc.gatech.edu/source.html。尤其是其中这句让我崩溃的话:Keep in mind that you will not be using the 2.6.18 kernel that the Xen 3.1.0 installation will try to use by default. Double check any /boot/grub/menu.lst entries to ensure they point at the Xen kernel in the Debian package you installed earlier.

  21. 简单看了一下,那篇文章没有说错,Ether 需要在 Xen Hypervisor 上打补丁,而不是在 Linux Xen Kernel 上打补丁。所以你只需要编译 Xen Hypervisor 就可以了,不用编译 Linux Xen Kernel(也就是说你可以直接用 linux-image-2.6.26-2-xen-amd64 这个已经编译好的 Linux Xen kernel)。

  22. 呵呵,谢谢。现在找到另一篇文章,按那上面的说法成功了。只编译xen hypervisor和tools就行了,我make all就编译内核,这时需要下载2.6.18的内核源文件。实际上根本用不到。我一开始还以为是要在安装Xen时手工指定内核版本呢。
    我是个Xen新手,对Xen这种架构还不是很理解,估计慢慢就好了。
    再次感谢。

  23. 有没有人试过在debian lenny上面成功安装(二进制或源代码编译)xen3.4.3?
    dom0用的内核是?

  24. 问一下Cedric,你是怎么安装成功的?我现在也需要安装ether,已经被xen整的不行了,能不能推荐一下你找的那篇文章?

  25. hi ,vpsee 请教一下

    为啥我在内核打xen补丁的时候,就不动了(像卡住了一样),
    屏幕没输出,貌似时间也很久,用的是下面这个命令 :

    for i in `ls ../xenpatch-2.6.31.8/`; \
    do patch -p1 < ../xenpatch-2.6.31.8/"$i"; done

  26. 。。。。。我是2.6.32.4的内核 ,下载的xen-patches-2.6.32-4.tar.bz2 的xen内核补丁
    也顺利打上去了, make menuconfig进去 为什么【 Device drivers】 里没XEN 选项啊 ?
    我搜索菜单,显示有XEN 啊 ! 可进去配置就是看不到,搞了好多次

  27. 我在debian squeeze下编译打补丁的内核,但是使用给出的编译选项[*] Enable Xen compatible kernel出问题了,提示是在spinlock.h上出错的;但是,使用Paravirtualized guest support则没有问题;我想请教的是:这两个编译选项有什么不同呢?是不是说半虚拟化就应该选择后者?选择后者还需要选择哪些内核编译选项呢?

发表评论