本文的核心思想是在KVM客户机中安装Xen Hypervisor,也就是在在虚拟机中做Xen相关的实验,而这涉及到了虚拟化中再进行虚拟化——嵌套虚拟化,过程中由于没想明白就匆忙动手,遇到了很多问题,这里提出来供大家参考和交流。目前,只是在KVM客户机RHEL6.2中成功安装了Xen 4.2,并成功启动了Dom0,并没有再进一步用xen创建虚拟机进行实验。
本文的基石是
Run Xen as a KVM guest(
https://rwmj.wordpress.com/2010/10/07/tip-run-xen-as-a-kvm-guest/ 网页简单粗暴,全是有用的信息),通过Google搜install xen on kvm搜到的,Google就是这么强大,随便输的关键字就解决了困扰我四五天的难题,早干嘛去了?
好吧,最初是没想到嵌套虚拟化的问题,认为kvm客户机里面再装一层虚拟化应该没问题,这当然是可行的,但当时没明白前提条件,随便找了个virsh定义kvm虚拟机的xml文件,稍微改了改就启动了一台RHEL 6.2的虚拟机。然后装支持xen dom0的内核kernel-xen,安装xen 4.2,虽然都装成功了,也修改了grub,好嘛,reboot以后报错FATAL: Module scsi_wait_scan not found。起初,认为这是内核模块的问题,直接用yum install kernel-xen安装的3.14.40内核,我也不知道怎么修改他,于是还尝试了其他方法,譬如参考
http://wiki.xen.org/wiki/RHEL6_Xen4_Tutorial编译jeremy/xen.git支持xen的2.6.32内核(和wiki中的版本有出入),单启该Linux内核没问题,换成编译安装的xen.gz以后启动报错直接看不懂,无奈消耗了不少时间。最终还是回归到了通过install kernel-xen这种方法
how-to-install-xen-on-rhel6,毕竟有物理机上的成功案例(
http://blog.host4offshore.com/how-to-install-xen-on-rhel6-scientific-linux-6-centos-6.html),那么就得解决在kvm虚拟机中启动xen dom0报的Module的错误。
上面只是一个混乱的引子,按照起因、经过、结果来讲述故事让听故事的人更容易接受。
起因就是Run Xen as a KVM guest,我需要在一个kvm虚拟机中编译安装xen hypervisor,然后用xen再启动DomU,也就是嵌套虚拟化。我并不是为了研究虚拟化中的虚拟化,在一个完全虚拟化的虚拟机中,虚拟机并不知道自己是虚拟机,在这样一台没有修改操作系统源码的机器中安装虚拟化软件,是完全可行的。起因的起因是不想在物理机上安装Xen,我们的物理机操作系统是RHEL 6.2,不支持Xen Dom0,所以需要在其上安装其他版本的支持Xen的内核,一旦操作失败,就得跑到机房去重启物理机(空调,噪音,辐射。。。有可能反复去机房操作),事实上是我已经伤害了它2次,跑去机房1次,第2次不想去了,才想到Xen on KVM。
为了完成这个目标,还补了补Xen虚拟化基础知识。而解决问题的关键就是全虚拟化和半虚拟化,Xen起初是半虚拟化PV,后来有了全虚拟化HVM,以及PV+HVM等等优化性能的方法;而KVM原本是借助QEMU模拟设备的全虚拟化方案,后来有了virtio驱动实现半虚拟化目的是加速I/O吧,如果创建KVM虚拟机时用的驱动是virtio,那么这个虚拟机就不是全虚拟化的,安装了新内核启动时有可能报SCSI模块错误也就合乎情理了。当然,这都是后话,后知后觉!
最初,我的kvm虚拟机配置文件中硬盘是这样配置的,也就是传说中的virtio:
![](https://img-my.csdn.net/uploads/201505/11/1431342039_7642.png)
启动虚拟机rhel-6.2-1是没有问题的。然后开始安装支持xen 的Linux内核以及xen。这两个东西都可以选择yum install或者源码编译。
首先看支持Xen dom0的内核安装。
方法1:根据Xen 的wiki(
http://wiki.xen.org/wiki/RHEL6_Xen4_Tutorial)中的
Installing upstream Xen dom0 capable kernel,我们可以git clone一下jeremy的适合xen的内核,切到xen/next-2.6.32分支,下载包含一些XEN配置的config文件wget -O .config
http://pasik.reaktio.net/xen/kernel-config/config-2.6.32.25-pvops-dom0-xen-stable-x86_64 (还有其他版本的),然后按照wiki编译内核。编译没有问题,但最后发现我们的版本是2.6.32.57,并不是wiki中的2.6.32.25,配置grub然后重启,这个内核可以正常启动。然后尝试了编译安装xen 4.5以及直接yum安装xen 4.2,重启后选择xen启动都报错,有点难为我这小白,于是我就放弃了这种方法:
![](https://img-my.csdn.net/uploads/201505/11/1431342049_8376.png)
方法2:根据
How to install Xen on RHEL6, Scientific Linux 6, CentOS 6(
http://blog.host4offshore.com/how-to-install-xen-on-rhel6-scientific-linux-6-centos-6.html)这篇文章,在RHEL 6.2中按部就班操作:
# yum install bridge-utils
# yum install kernel-xen
这里安装了支持xen dom0的3.24.40-1版本内核,先不安装xen,试试能不能启动,一试便报出了SCSI模块错误:
![](https://img-my.csdn.net/uploads/201505/11/1431342325_7127.png)
百度一下该错误,有大神这样解决:
![](https://img-my.csdn.net/uploads/201505/11/1431342069_4291.png)
于是进原来的RHEL 6.2系统,重新生成我们用的3.14.40-1的initfamfs。重启,尽然真的可以进入3.14.40了。这里也看出了端倪,3.14.40内核目测原本没有使用virtio驱动访问硬盘,因此报错,而添加virtio_blk驱动重新生成initramfs后,就可以进入该版本系统了。
继续我们的Xen安装:
# yum install xen
安装了xen 4.2 rpm包,xen.gz也有了,从xen源码编译安装xen 4.5可以参考文章
http://ju.outofmemory.cn/entry/83798。grub中检查启动项:
![](https://img-my.csdn.net/uploads/201505/11/1431342057_2093.png)
第一个便是我们的最终目标,支持Xen 的Dom0。重启后竟然又报出了SCSI的模块错误。分析一下发现,没有Xen时,Linux 3.14.40内核通过添加virtio_blk驱动重新生成initramfs后正常启动,而用xen内核启动时,并不能给xen内核使用virtio_blk驱动。那么问题来了:为什么需要virtio_blk驱动?现在看来,似乎已经明了,由于创建KVM虚拟机时配置文件中硬盘驱动用的是virtio而不是ide之类的,也就是说KVM虚拟机(Xen 的host)是半虚拟化的,对Linux 3.14.40内核添加了virtio驱动以后,Linux没事了,但是Xen内核可不知道自己的host是半虚拟化,该怎么访问硬盘。
因为一开始没能将问题落实到“在KVM虚拟机上安装Xen(Run Xen as a KVM guest)”,没有明白前提条件是KVM全虚拟化,导致KVM虚拟机创建时就出了问题,到最后只能以失败告终。
我们来看看Run Xen as a KVM guest 的解决方案,直译如下:
“ 我们可以在一个KVM客户机中运行一个旧版的Xen hypervisor,这对于测试和开发是有用的。由于Xen HV没有硬件访问权(特别地,hardware virt 访问权),因此在这种环境下只能运行Xen半虚拟化客户机,也就是Linux XenPV客户机。但也有可能,如果由AMD硬件支持嵌套虚拟化,就可以运行Xen全虚拟化方式下的客户机。
准备工作:
1. 用kvm安装一个RHEL 5 客户机,安装Xen变成一个Xen host。(注,RHE6 安装Xen参考本文 方法2)
2. libguestfs工具,用virt-edit修改kvm客户机RHEL 5中的/boot/grub/grub.conf,变成xen启动 kernel /xen.gz-2.6.18-194.17.1.el5 noapic。。。(虚拟机可启动,可以直接在虚拟机中修改grub)
另外,需要修改这个kvm虚拟机的配置,virsh edit RHEL5,使用仿真设备IDE、rtl8139等(全虚拟化)而不能使用virtio。
virsh edit RHEL5,把<target dev='vda' bus='virtio />改成<target dev='sda' bus='ide' />并且移除它的已分配的地址,同样如果由一张网卡,也不要使用virtio,而是用rtl8139仿真。”
至此,终于雨过天晴,修改完KVM虚拟机的配置,虚拟硬盘使用ide,重启之后便可以正常启动Xen Dom0了。
![](https://img-my.csdn.net/uploads/201505/11/1431342068_2046.png)
没想到,原本并不难的问题,却绕了不少弯。。
觉得混乱的读者,可以直接查阅
Run Xen as a KVM guest以及
How to install Xen on RHEL6两篇参考文献即可,都非常简短。