京山游侠

专注技术 拒绝扯淡
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

虚拟机体验之 Xen 篇 —— 令人脑洞大开的奇异架构

Posted on 2015-03-08 09:49  京山游侠  阅读(19817)  评论(2编辑  收藏  举报

这一篇我要体验的虚拟机系统是 Xen。在虚拟机领域,Xen 具有非常高的知名度,其名字经常在各类文章中出现。同时 Xen 也具有非常高的难度,别说玩转,就算仅仅只是理解它,都不是那么容易。之所以如此,那是因为 Xen 采用了和我前面介绍的那几个虚拟机完全不同的架构。在这里,我称之为令人脑洞大开的奇异架构。

比如说在经典的虚拟机架构中,虚拟机软件运行于 Host System 之中,而 Guest System 运行于虚拟机软件之中。为了提高 Guest System 的运行速度,虚拟机软件一般会在 Host System 中使用内核模块开一个洞,将 Guest System 的运行指令直接映射到物理硬件上。但是在 Xen 中,则根本没有 Host System 的概念,传说它所有的虚拟机都直接运行于硬件之上,虚拟机运行的效率非常的高,虚拟机之间的隔离性非常的好。

当然,传说只是传说。我刚开始也是很纳闷,怎么可能让所有的虚拟机都直接运行于硬件之上。后来我终于知道,这只是一个噱头。虚拟机和硬件之间,还是有一个管理层的,那就是 Xen Hypervisor。当然 Xen Hypervisor 的功能毕竟是有限的,怎么样它也比不上一个操作系统,因此,在 Xen Hypervisor 上运行的虚拟机中,有一个虚拟机是具有特权的,它称之为 Domain 0,而其它的虚拟机都称之为 Domain U。

Xen的架构如下图:

从图中可以看出,Xen 虚拟机架构中没有 Host System,在硬件层之上是薄薄的一层 Xen Hypervisor,在这之上就是各个虚拟机了,没有 Host System,只有 Domain 0,而 Guest System 都是 Domain U,不管是 Domain 0 还是 Domain U,都是虚拟机,都是被虚拟机软件管理的对象。

既然 Domain 0 也是一个虚拟机,也是被管理的对象,所以可以给它分配很少的资源,然后将其余的资源公平地分配到其它的 Domain。但是很奇怪的是,所有的虚拟机管理软件其实都是运行在这个 Domain 0 中的。同时,如果要连接到其它 Guest System 的控制台,而又不是使用远程桌面(VNC)的话,这些控制台也是显示在 Domian 0 中的。所以说,这是一个奇异的架构,是一个让人很不容易理解的架构。

这种架构桌面用户不喜欢,因为 Host System 变成了 Domain 0,本来应该掌控所有资源的主操作系统变成了一个受管理的虚拟机,本来用来打游戏、编程、聊天的主战场受到限制了,可能不能完全发挥硬件的性能了,还有可能运行不稳定了,自然会心里不爽。(Domain 0确实不能安装专用显卡驱动,确实会运行不稳定,这个后面会讲。)但是企业级用户喜欢,因为所有的 Domain 都是虚拟机,所以可以更加公平地分配资源,而且由于 Domain U 不再是运行于 Domian 0 里面的软件,而是和 Domain 0 平级的系统,这样即使 Domain 0 崩溃了,也不会影响到正在运行的 Domain U。(真的不会有丝毫影响吗?我表示怀疑。)

下面开始在 Ubuntu 系统中体验 Xen。使用如下命令可以在 Ubuntu 的软件源中搜索和 Xen 相关的软件包以及安装 Xen Hypervisor:

sudo aptitude search xen
sudo aptitude install xen-hypervisor-4.4-amd64

传说在旧版本的 Xen Hypervisor 上只能运行经过修改过的 Linux 内核。但是在目前的版本中不存在该问题。我机器上的 Ubuntu 14.10 系统不经任何修改,就可以当成 Domain 0 中的系统运行。至于是否让该系统运行于 Xen Hypervisor 上,在启动时可以选择,如下图:

通过查看 Grub 的配置文件,可以看到通过 Xen 虚拟机启动 Ubuntu 系统时,Grub 先启动的是 /boot/xen-4.4-amd64.gz,然后才把 Linux 内核以及 initrd 文件作为模块载入内存。也就是说,Grub 启动 Xen Hypervisor,然后 Xen Hypervisor 运行 Domian 0。

前面提到 Host System 一下子变成了 Domain 0 中的操作系统是让桌面用户比较不爽的事,这里详细论述。虽然说目前的 Xen 同时支持全虚拟化和半虚拟化,支持操作系统不经任何修改就运行于 Xen 虚拟机上(全虚拟),但是系统是否稳定还是和内核有很大关系的。比如说我在 Ubuntu 14.04 刚推出的那段时间,在 Ubuntu 14.04 中使用 Xen 是没有什么问题的,但是经过几次系统升级后,Xen 就出问题了,没办法成功进入 Domain 0 中的 Ubuntu 14.04。现在我用的是 Ubuntu 14.10,已经升过好几次级了,目前使用Xen还是很稳定的。其次就是显卡驱动的问题,我的 Ubuntu 当主系统用时,使用的是 NVIDIA 的显卡驱动,但是当 Ubuntu 运行于 Domain 0 中时,就不能使用 NVIDIA 的显卡驱动了,否则无法进入图形界面。

下面来测试一下 Xen 虚拟机的运行效果。通过前文的探讨,可以看出一个虚拟机的运行需要两个要素:一是一套虚拟的硬件系统,二是一个包含了操作系统的磁盘镜像。QEMU 虚拟机关于硬件的配置全由命令行指定,VirtualBox 虚拟机的硬件配置存在于配置文件中,而 Xen 呢,它也存在于配置文件中,这个配置文件要我们自己写。至于磁盘镜像,还是复用我之前创建的那个 WinXP.img 吧,记住,它是 qcow2 格式的。

先进入我主目录的 virtual-os 目录,ls 看一下,里面有我之前创建的 WinXP.img。然后,我们创建一个 WinXP_Xen.hvm 配置文件,其内容如下:

builder = "hvm"
name = "WinXP_Xen.hvm"
memory = 2048
vcpus = 2
disk = [ '/home/youxia/virtual-os/WinXP.img, qcow2, hda, rw' ]
sdl = 1

这段配置文件很简单,也很容易懂。 hvm 代表这是一个全虚拟化的虚拟机,和全虚拟化相对的是半虚拟化,半虚拟化只能运行经过修改的内核,但是可以获得更高的性能。为该虚拟机分配 2 个 CPU 和 2G 内存,并指定硬盘镜像文件。最后一个 sdl=1 表示使用 SDL 图形库显示虚拟操作系统的界面,如果不想用 SDL,也可以写成  vnc=1,这样需要使用 vncviewer 才能连接到虚拟机操作系统的桌面。

至于 Xen 的配置文件怎么写,管理命令怎么用,这个必须得有学习资料。通过 man xl 和 man xl.cfg 查看手册页是可以的,但是最全面的资料还是在Xen的官网 http://www.xenproject.org 上。

使用 sudo xl list 命令可以看到系统中只有一个Domain 0在运行,然后使用 sudo xl create -c WinXP_Xen.hvm 即可运行一个 Domian U 虚拟机,该虚拟机使用 WinXP_Xen.hvm 配置文件。 xl 命令的 -c 选项表示把 Domain U 的控制台显示在 Domain 0 中,如果不用  -c  选项而使用  -V  选项,则创建虚拟机后使用 vncviewer 进行连接。新建的虚拟机运行起来后,再次使用 sudo xl list 命令,可以看到除了Domain 0,还多了一个名称为“WinXP_Xen.hvm”的虚拟机。运行效果如下图:

关于 Xen 更多更高级的功能,比如动态迁移什么的,我这里就不试了。至于说到 Xen 虚拟机的隔离性,如果一个 Domain U 崩溃了,肯定是不会影响到 Domain 0和其它 Domain U 的,但是如果 Domain 0 崩溃了,Domain U 真的不会受到任何影响吗?Domain 0 崩溃了怎么重启它呢?这都是我没想明白的问题。在折腾 Xen 的过程中,我曾多次重启过机器,重启后一看,WinXP_Xen.hvm 还在继续运行,似乎是没有受到 Domain 0 的影响,但是我就想,我机器都重启了,电源都断了,Domain U 它真的能丝毫不受影响吗?

 

总结:

1.Xen 虚拟机不应该是桌面用户的首选,因为它架构比较奇异不容易理解,可能因内核升级而出现不稳定,不能充分发挥桌面硬件的性能,比如显卡;桌面用户还是应该首选 VirtualBox。

2.企业及客户可以考虑 Xen,因为它可以提供较好的性能和隔离性,企业级用户不需要桌面用户那么多的功能,所以可以把 Domain 0 做到很薄,可以完全不要图形界面,也不用经常升级内核,甚至可以选择一个经过修改优化的内核,这样就可以在一套硬件上运行尽可能多的虚拟机。

关于 Linux 下虚拟机相关的内容,就写到这里吧。欢迎大家批评指正。

 

(京山游侠于2015-03-08发布于博客园,转载请注明出处。)