在CentOS 7.x上源码安装Xen 4.5

截止目前为止Xen4CentOS只有Centos6版本可以用,所以Centos7只能编译源码的方式安装。

安装需要的软件包

yum update
yum groupinstall "Development Tools"
yum install -y gcc gcc-c++ git patch texinfo python-devel acpica-tools libuuid-devel ncurses-devel glib2 glib2-devel libaio-devel openssl-devel yajl-devel glibc-devel glibc-devel.i686 pixman-devel bc
rpm -ivh  http://mirror.centos.org/centos/6/os/x86_64/Packages/dev86-0.16.17-15.1.el6.x86_64.rpm

安装 Xen

git clone git://xenbits.xen.org/xen.git
cd xen/
./configure
make dist
make install

安装 dom0 内核

wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.18.tar.gz
tar zxf linux-3.18.18.tar.gz
cd linux-3.18.18
make menuconfig

vim .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
make modules

make modules_install
make install

配置 GRUB

grub2-mkconfig -o /etc/grub2.cfg

#查看grub2.cfg相关配置
cat /etc/grub2.cfg

#静态文件系统信息,定义了存储设备和分区整合到整个系统的方式
cat /etc/fstab 

#复制grub2.cfg里第一个引导配置到下面的文件,添加一行 multiboot /xen.gz,linux16、initrd16修改为module
vi /etc/grub.d/40_custom

    #!/bin/sh
    exec tail -n +3 $0
    # This file provides an easy way to add custom menu entries.  Simply type the
    # menu entries you want to add after this comment.  Be careful not to change
    # the 'exec tail' line above.
    menuentry 'CentOS Linux 7 (Core), with Linux 3.18.18 Xen' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.18.18-advanced-dfad9c15-962d-492d-b83a-31d22a5f0eec' {
        load_video
        insmod gzio
        insmod part_msdos
        insmod xfs
        set root='hd0,msdos1'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1'  8089210c-1bb3-4589-b18d-cc5b2b97774e
        else
          search --no-floppy --fs-uuid --set=root 8089210c-1bb3-4589-b18d-cc5b2b97774e
        fi
        multiboot /xen.gz
        module /vmlinuz-3.18.18 root=/dev/mapper/centos-root ro rd.lvm.lv=centos/root rd.lvm.lv=centos/swap crashkernel=auto rhgb quiet
        module /initramfs-3.18.18.img
    }


#重新生成菜单
grub2-mkconfig -o /etc/grub2.cfg

可能出现的错误和解决办法

重启后,选择 CentOS Linux, with Linux 3.15.4 Xen 进入 Xen 系统,使用 xl info 命令发现有错,这是因为 Xen 相关的软件库被安装到了 /usr/local/lib 目录,系统找不到。所以做一些链接就可以了:

xl info

    xl: error while loading shared libraries: libxlutil.so.4.3: cannot open shared object file: No such file or directory

cd /usr/lib/
ln -s /usr/local/lib/libxlutil.so.4.3.0 libxlutil.so.4.3
ln -s /usr/local/lib/libxlutil.so.4.3.0 libxlutil.so
ln -s /usr/local/lib/libxenlight.so.4.5.0 libxenlight.so.4.5
ln -s /usr/local/lib/libxenlight.so.4.5.0 libxenlight.so
ln -s /usr/local/lib/libxenctrl.so.4.5.0 libxenctrl.so.4.5
ln -s /usr/local/lib/libxenguest.so.4.5.0 libxenguest.so.4.5
ln -s /usr/local/lib/libxenguest.so.4.5.0 libxenguest.so
ln -s /usr/local/lib/libxenstat.so.0.0 libxenstat.so.0
ln -s /usr/local/lib/libxenstat.so.0.0 libxenstat.so
ln -s /usr/local/lib/libxenstore.so.3.0.3 libxenstore.so.3.0
ln -s /usr/local/lib/libxenstore.so.3.0.3 libxenstore.so
ln -s /usr/local/lib/libxenvchan.so.1.0.0 libxenvchan.so.1.0
ln -s /usr/local/lib/libxenvchan.so.1.0.0 libxenvchan.so
ln -s /usr/local/lib/libblktapctl.so.1.0.0 libblktapctl.so.1.0
ln -s /usr/local/lib/libblktapctl.so.1.0.0 libblktapctl.so

ldconfig

再次运行 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

# 一劳永逸的办法修改fstab文件
vim /etc/fstab

    #追加如下一行
    none                  /proc/xen               xenfs   defaults        0 0

xl info

    host                   : localhost.localdomain
    release                : 3.18.18
    version                : #1 SMP Thu Jul 16 17:43:05 CST 2015
    machine                : x86_64
    nr_cpus                : 2
    max_cpu_id             : 7
    nr_nodes               : 1
    cores_per_socket       : 2
    threads_per_core       : 1
    cpu_mhz                : 3192
    hw_caps                : bfebfbff:20100800:00000000:00000900:0400e3bd:00000000:00000001:00000000
    virt_caps              : hvm
    total_memory           : 8091
    free_memory            : 127
    sharing_freed_memory   : 0
    sharing_used_memory    : 0
    outstanding_claims     : 0
    free_cpus              : 0
    xen_major              : 4
    xen_minor              : 6
    xen_extra              : -unstable
    xen_version            : 4.6-unstable
    xen_caps               : xen-3.0-x86_64 xen-3.0-x86_32p hvm-3.0-x86_32 hvm-3.0-x86_32p hvm-3.0-x86_64
    xen_scheduler          : credit
    xen_pagesize           : 4096
    platform_params        : virt_start=0xffff800000000000
    xen_changeset          : Fri Jun 26 18:24:22 2015 +0100 git:c40317f
    xen_commandline        :
    cc_compiler            : gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9)
    cc_compile_by          : root
    cc_compile_domain      :
    cc_compile_date        : Thu Jul 16 13:03:35 CST 2015
    xend_config_format     : 4

记得启动 xencommons,以前旧版本的 xend 已经被 xencommons 替代了:

/etc/init.d/xencommons start

#开机启动xencommons
/sbin/chkconfig --add xencommons
/sbin/chkconfig --add xendomains
/sbin/chkconfig xendomains on
/sbin/chkconfig xencommons on


xl list
    Name                                        ID   Mem VCPUs    State    Time(s)
    Domain-0                                     0  7870     2     r-----     213.0

Xen 从 4.1 版本开始引入了新版工具集 xl/libxl,并在后续的版本中逐步替代旧的 xm/xend,在 4.5 版本中已经完全删除了 xm/xend.

每次启动菜单有很多选项,进去把除当前版本以外的删除掉

# !!! 保留vmlinuz-3.18.18、initramfs-3.18.18.img
cd /boot/
rm -fr 
vmlinuz-*
initramfs-*.img        

#重新生成菜单
grub2-mkconfig -o /etc/grub2.cfg

创建虚拟机

创建映像

#创建一个 20G 的镜像文件
# 你希望在文件增长时才配置数据块,可以用迟缓的方式来配置
dd if=/dev/zero of=/ROOT/xen/web_1.img oflag=direct bs=1M seek=20479 count=1
# 如果你想立即配置所有数据块,你亦可以这样做:
dd if=/dev/zero of=/ROOT/xen/web_1.img oflag=direct bs=1M count=20480

Xen配置文件

#可以到这里选一个配置文件
https://github.com/frederickding/xenserver-kickstart

关闭虚拟机:

/usr/sbin/xl shutdown vm01

给虚拟机镜像文件(.img)追加 4GB 空间:

dd if=/dev/zero bs=1024k count=4096 >> /vm/vm01.img

扫描检查镜像文件:

/sbin/e2fsck -f /vm/vm01.img

这个时候只是增加了镜像文件(硬盘)的大小,这个镜像文件不是普通的文件,里面包含可 mount/umount 的 loop 文件系统,所以需要调整文件系统大小,不然的话进入虚拟机后 df 会发现硬盘大小没变:

/sbin/resize2fs /vm/vm01.img

重新启动 Xen 虚拟机:

/usr/sbin/xm create vm01

进入虚拟机后查看硬盘大小:

/usr/sbin/xm console vm01
df -h