因为要修改Xen的源码,所以不得不要源码编译安装Xen,这真是体力活啊。其实编译一个 Xen 内核和编译一个普通 Linux 内核没有什么不同,如果发现编译后的内核启动不了,出现 kernel panic 的情况,多半是内核与机器的硬件没有配置好的原因,和 Xen 没有关系。
本文使用的环境是:CentOS 6.5 + linux-3.16.49内核 + xen-4.6.3
安装前的配置和安装需要的软件包
CentOS6.5系统安装以后,首先是要关闭SELinux的功能(缺省为enforcing状态):
[root@centos ~]# vi /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
也可以考虑配一个速度快的yum源。
之后,更新系统,并且安装编译 Xen 所需要的编译器、工具、软件库等:#yum update
# yum groupinstall "Development Tools"
# yum install transfig wget tar less texi2html libaio-devel dev86 glibc-devel e2fsprogs-devel gitk mkinitrd iasl xz-devel bzip2-devel
# yum install pciutils-libs pciutils-devel SDL-devel libX11-devel gtk2-devel bridge-utils PyXML qemu-common qemu-img mercurial texinfo
# yum install libidn-devel yajl yajl-devel ocaml ocaml-findlib ocaml-findlib-devel python-devel uuid-devel libuuid-devel openssl-devel
# yum install python-markdown pandoc systemd-devel glibc-devel.i686
安装Xen
到 Xen官网下载相应的源码包后编译、安装:# tar zxvf xen-4.6.3.tar.gz
# cd xen-4.6.3
# ./configure
# make -j4 dist
# make install
安装 dom0 内核
这一步其实就是安装一个支持Xen的内核,在安装Xen之前或者之后进行都可以,但因为要配置内核以支持Xen,所以应该只能通过编译的方式来安装内核了吧。下载相应的 Linux 内核源代码(从内核 2.6.39+ 开始 Linux 内核全面、正式的支持 Xen,但是一些必须的backend模块,直到linux3.0才加进来,也就是说3.0后的linux kernel对xen的支持才比较完美),配置 dom0 内核、编译、安装:
# tar xf linux-3.16.49.tar.xz
# cd linux-3.16.49
# make menuconfig
配置menuconfig选项:
1,进入 Processor type and features --->[*] Xen guest support
选择下面这些选项:
2,进入Device Drivers ---> Block devices ---> <*> Xen virtual block device support
<*> Xen block-device backend driver
3、 Device Drivers --->Xen driver support 把下面的都选上
4, Device Drivers ---> Network device support ---> <*> Xen network device frontend driver
<*> Xen backend network device
注意:
有的机器可能会遇到Device Drivers —> Xen driver support这个选项失踪的问题,这跟机器架构与系统配置有关,必须得打开处理器支持虚拟化的功能(进入BOIS),但有些机器太老可能没有这个功能。
还有就是配置完menuconfig后还是最后打开.config文件看一下,确保有以下模块(我就是安装完成后才发现缺少xenfs模块):
# vi .config
...
CONFIG_X86_IO_APIC=y
CONFIG_ACPI=y
CONFIG_ACPI_PROCFS=y (optional)
CONFIG_XEN_DOM0=y
CONFIG_PCI_XEN=y
CONFIG_XEN_DEV_EVTCHN=y
CONFIG_XENFS=y
CONFIG_XEN_COMPAT_XENFS=y
CONFIG_XEN_SYS_HYPERVISOR=y
CONFIG_XEN_GNTDEV=y
CONFIG_XEN_BACKEND=y
CONFIG_XEN_NETDEV_BACKEND=m
CONFIG_XEN_BLKDEV_BACKEND=m
CONFIG_XEN_PCIDEV_BACKEND=m
CONFIG_XEN_BALLOON=y
CONFIG_XEN_SCRUB_PAGES=y
...
然后是编译安装:
# make -j 4
# make modules_install
# make install
我安装的时候出现下面这些错误,
[root@bogon linux-3.16.49]# make install
sh ./arch/x86/boot/install.sh 3.16.49 arch/x86/boot/bzImage \
System.map "/boot"
ERROR: modinfo: could not find module freq_table
ERROR: modinfo: could not find module mperf
ERROR: modinfo: could not find module snd_page_alloc
ERROR: modinfo: could not find module output
但可以找到这些模块,我就直接忽视了,结果也可以成功启动内核。
[root@bogon linux-3.16.49]# lsmod |grep freq_table
freq_table 4936 2 cpufreq_ondemand,acpi_cpufreq
[root@bogon linux-3.16.49]# lsmod |grep mperf
mperf 1557 1 acpi_cpufreq
[root@bogon linux-3.16.49]# lsmod |grep snd_page_alloc
snd_page_alloc 8856 2 snd_hda_intel,snd_pcm
[root@bogon linux-3.16.49]# lsmod |grep output
output 2409 1 video
配置 Grub
在这之前安装的Xen和Linux内核是没有任何联系的,所以修改Grub使Linux内核以支持Xen的方式启动,其实就是添加一个含有Xen的启动项。[root@bogon ye]# cat /etc/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/mapper/centos-centos_root
# initrd /initrd-[generic-]version.img
#boot=/dev/sdb
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS-Xen (3.16.49-Xen)
root (hd0,0)
kernel /xen.gz dom0_mem=1024M,max:1024M loglvl=all guest_loglvl=all
module /vmlinuz-3.16.49 ro root=/dev/mapper/centos-centos_root rd_LVM_LV=centos/centos_root nomodeset rd_NO_LUKS rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_LVM_LV=centos/centos_swap KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
module /initramfs-3.16.49.img
title CentOS (3.16.49)
root (hd0,0)
kernel /vmlinuz-3.16.49 ro root=/dev/mapper/centos-centos_root rd_LVM_LV=centos/centos_root nomodeset rd_NO_LUKS rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_LVM_LV=centos/centos_swap KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-3.16.49.img
title CentOS (2.6.32-696.13.2.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-696.13.2.el6.x86_64 ro root=/dev/mapper/centos-centos_root rd_LVM_LV=centos/centos_root nomodeset rd_NO_LUKS rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_LVM_LV=centos/centos_swap KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-696.13.2.el6.x86_64.img
其中,下面就是要自己手动添加的启动项:
title CentOS-Xen (3.16.49-Xen)
root (hd0,0)
kernel /xen.gz dom0_mem=1024M,max:1024M loglvl=all guest_loglvl=all
module /vmlinuz-3.16.49 ro root=/dev/mapper/centos-centos_root rd_LVM_LV=centos/centos_root nomodeset rd_NO_LUKS rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_LVM_LV=centos/centos_swap KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
module /initramfs-3.16.49.img
重启选择带有Xen的内核进入系统
安装后的操作
重启运行xl info可能还是会报错的:
# xl info
xc: error: Could not obtain handle on privileged command interface (2 = No such file or directory): Internal error
libxl: error: libxl.c:99:libxl_ctx_alloc: cannot open libxc handle: No such file or directory
cannot init xl context
这是因为没有挂载 xenfs ,挂载一下就可以了:
# modprobe xenfs
# mount -t xenfs xenfs /proc/xen
# ls /proc/xen/
capabilities privcmd xenbus xsd_kva xsd_port
(我的xenfs模块没有编译进内核,希望不会有影响)
# /etc/init.d/xencommons start
将init.d下面的三个xen服务设成开机启动
# chkconfig xencommons on
# chkconfig xendomains on
# chkconfig xen-watchdog on
参考文献:
[1]. https://www.lvtao.net/server/574.html
[2]. http://blog.csdn.net/hustsselbj/article/details/45674159?readlog
[3]. http://bbotte.blog.51cto.com/6205307/1564187/