Xen 的性能为什么能够这么好? Xen 在使用上面有什么样的限制?我的一部主机最多可以支持几个 Xen 的仿真环境?
Xen 的仿真环境有几种类型? 这些疑问我们都得要先知道一下才好!
当然,最好能够有个简单的小例子来处理 Xen 的仿真环境啰。
Xen 这套自由软件在虚拟机的仿真类型方面主要分为
半虚拟化
(Para-virtualization) 及全虚拟化 (Full
virtualization) 两种,其中半虚拟化主要是通过修改 Linux 内核来达成的虚拟技术。
半虚拟化技术所产生的虚拟机需要与原本的操作系统相同较佳。使用半虚拟化的环境所具备的特色有:
(
注5)
- 虚拟机的运作效率与实体机器的性能相当;
- 最多可支持到具有 32 颗以上 CPU 的主机环境;
- 支持 x86/32, x86/32 含 PAE 技术, 及 x86/64 的硬件平台环境;
- 良好的硬件驱动程序支持,几乎支持所有的 Linux 设备之驱动程序;
Xen 的半虚拟化技术主要是用在相同版本的 Linux 上面,也就是说,如果妳想要使用半虚拟化的方式启动多个虚拟机,
那么那些虚拟机全部都必须是相同的操作系统,甚至要求相同版本与相同内核的 Linux distribution 喔。
如果妳想要安装不同版本的 Linux 或者是其他的 OS (例如 Windows XP) 时,就得要使用全虚拟化技术了。
但是全虚拟化技术是有其限制的,当你的硬件满足下列需求时,全虚拟化技术才能够动作:
- 你的硬件支持 Intel 的 VT 技术 (Virtualization Technology, Intel-VT);
- 你的硬件支持 AMD 的 SVM 技术 (Secure Virtual Machine, AMD-SVM or, AMD-V)。
此外,上面提到的 PAE 指的是 Intel 的实体地址延伸技术 (Physical Addressing Extensions, PAE),
这项技术可让原本仅支持到 4GB 物理内存的 32 比特硬件平台,可支持到最大 64GB 的内存喔!
而且, Xen 几乎可以在所有的 P-II 以上等级的硬件平台上面跑半虚拟化任务,如果不跑全虚拟化的话,其实性能确实是
OK 的啦!
近来由于虚拟机软件的流行,加上 x86 电脑性能与 CPU 运算内核单元的增加,两大 x86 CPU 制造商 Intel/AMD
都发表了新的集成到 CPU 的虚拟技术,分别是 Intel 的 Vanderpool 虚拟技术以及 AMD 的 Pacifica 技术。
这些技术有的也支持 Xen ,这让 Xen 的性能增进不少呢! ^_^
在
基础学习篇里面我们曾经谈过硬件、内核与应用程序的关系,
所有的应用程序都是在内核层之上来完成的 (
注6)。
然后
通过内核功能去调用与使用硬件组件的命令。好了,
现在来仔细想一想,既然我有多个虚拟机,每个虚拟机的环境各别有自己的操作系统内核,
也就是有多个操作系统同时存在。
如果所有的操作系统都能够完整的控制硬件的话,
那么硬件到底该接受谁的指令来运作?那个系统的指令会先被运行?这是很重要的问题,
因为如果这边搞不定,那么妳的硬件系统就只有当机一途。
为了解决这个问题,Xen 也分成多个层级 (layer) 来运行。他将 Linux 的内核修改过后,
再使用这个修改过后的内核开机,而开机后先加载 Xen 的监督器 (Hypervisor) ,
并且启动第一个在上头的操作系统,我们称他为 domain-0。
(
在 Xen 上面所谓的一个 domain 就是一个虚拟机啰!)
Domain-0 之所以要先被加载是因为 Domain-0 含有其他虚拟机启动所必须的控制指令,
并且 domain-0 也是控制虚拟设备的重要主控系统。
在 domain-0 上头最重要的就是一个 xend 的常驻程序,其他的 domain 都是由这个 xend 来管理的。
至于命名方面,除了 domain-0 之外的其他虚拟机就依序被称为 domain-1, domain-2 等等,
我们通称为 domain-U 啰。这些咚咚的相关性有点像这样:

图 2-1、Xen Hypersvisor 的功能示意图(注7)
由上图我们知道 domain-0 真的是很重要的,因为他直接控制 Xen 的监督器 (Hypervisor),而且掌握了实际的
Linux 驱动程序 (drivers)。而其他的虚拟机 (domain-U) 则是通过 Xen 监督器来与实际的硬件以及 domain-0
达成沟通。而为了让 domain-0 能够与 Xen 结合,我们
必须要修改 domain-0
的内核才能够顺利运作。并且需要使用 domain-0 的内核来开机才可以。
domain-0 是所有虚拟机的来源,所以他可以尽量简单一点,其他的个别服务则可以放置到不同的 domain 当中了。
那个 xend 也是很重要的咚咚,他可以管理 domain-0 与其他 domain 之间的启动与沟通,
可以提供一个终端机 (console) 接口来让 domain-0 登录其他的 domain ,所以我们也必须要启动这玩意儿才行。
早期 Xen 尚未被各 distribution 集成到各自的版本中时,用户必须要由 Xen 的官方网站下载原代码,
然后自行重新编译内核以及编译 Xen 软件才行。说实在的,玩个 Xen 这么麻烦,倒不如不要玩!^_^。
然而在 RHEL 5 (CentOS 5) 以后, Xen 已经包含在原始发布的套件中了,所以我们直接用 yum 就能够安装妥当!
所以要搞定一部 Xen 的 domain-0 已经不再是不可能的任务啰!^_^
对于 Xen 的基本原理有一些认识之后,接下来就让我们开始在 CentOS 5 上面进行一个小小的实验吧!
虽然说目前的硬件都很新了,不过有的朋友使用的是旧的主机来安装 Linux ,所以我们必须要留意你的硬件是否支持
xen 的运作。而我们知道 Xen 支持半虚拟化与全虚拟化两种模式,两种模式的需求为:
半虚拟化 (Para-virtualization) 硬件需求:
只要是 64 比特的 x86 主机 (x86_64) 都能够支持半虚拟化的环境。如果是 32 比特的主机 (x86) 时,
该主机必须要支持的实体地址延伸技术 (PAE) 才能够使用 xen 喔!那如何确认呢?很简单,检查 CPU 的参数即可:
[root@linux ~]# cat /proc/cpuinfo | grep flags
flags : fpu tsc msr pae mce cx8 mtrr mca cmov pat pse36 mmx fxsr sse up
|
嘿嘿!这一部主机是鸟哥的 P-III 800 主机,看吧!确实有支持 PAE 喔!所以当然可以玩 Xen 啰。
全虚拟化 (Fully-virtualization) 硬件需求:
如果妳需要全虚拟化的技术支持时,此时需要硬件有支持虚拟化技术才行。
目前在 x86 的主机当中, Intel 提供 VT 技术, AMD 则提供 SVM 技术。
这两种技术在 CPU 的旗标分别是:
Intel (vmx) 与 AMD (svm) 。
鸟哥在 Core Duo 主机上面的测试可以发现:
在 Intel Core 2 Duo 的 CPU 主机上面测试 CPU 旗标:
[root@linux ~]# cat /proc/cpuinfo | grep flags
flags : fpu tsc msr pae mce cx8 apic mtrr mca cmov pat pse36 clflush dts
acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc up pni
monitor ds_cpl vmx est tm2 cx16 xtpr lahf_lm
# 瞧!是有那个 vmx 的支持啦!
|
至于 AMD 的主机旗标则是:(下表感谢
donyingle兄的提供!)
在 AMD Athlon(tm) 64 X2 的 CPU 主机上面测试 CPU 旗标:
[root@linux ~]# cat /proc/cpuinfo | grep flags
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov
pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt
rdtscp lm 3dnowext 3dnow pni cx16 lahf_lm cmp_legacy svm extapic
cr8legacy 3dnowprefetch ts fid vid ttp tm stc 100mhzsteps
# 瞧!是有那个 svm 的支持啦!
|
如果确定你的 CPU 有支持上述的条件后,嘿嘿!那我们就可以开始底下的游戏啦!如果没有支持呢?
那很抱歉,底下的数据看看就好!
注意:
在开始安装之前,请先参考
前一小节以确定你的硬件已经支持 Xen 的半虚拟化功能了!
约略谈了一下 Xen 的原理、特色之后,在开始玩弄 Xen 之前,我们得了解运作 Xen
所需要的各项套件,并且顺利安装后,才能够使用的啊! ^_^。如同前一小节提到的,
要使用 Xen 半虚拟化 (Para-virtualization) 必须要修改内核才能够顺利的运作。
在以前的版本妳需要重新编译内核,不过,在新的版本,例如 CentOS 5.x 底下,就已经将
Xen 的内核帮妳编译好了!妳可以直接安装即可。所以,妳需要安装的套件主要有:
- kernel-xen:修改的 Linux 内核,使可以跑 Xen 的环境;
- xen:主要的 xen 套件,包括设置档、启动脚本、所需的基本函数库等;
- xen-libs:Xen 所需要的函数库等;
- python-virtinst:提供终端机安装的软件;
- virt-manager:为一个图形用户接口软件,可在图形接口管理 xen 喔!
在 CentOS 5.x 的环境下,妳可以使用 yum 直接来安装这几个套件。安装完毕后请务必使用新的内核开机!
以鸟哥的例子来说,我安装了数个内核,包括 kernel-2.6.18-8.1.14.el5 及 kernel-xen-2.6.18-8.14.el5 ,
所以在 grub 的设置档当中会像这样:
[root@linux ~]# vi /boot/grub/menu.lst
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-8.1.14.el5xen)
root (hd0,0)
kernel /boot/xen.gz-2.6.18-8.1.14.el5
module /boot/vmlinuz-2.6.18-8.1.14.el5xen ro root=/dev/hda1 rhgb quiet
module /boot/initrd-2.6.18-8.1.14.el5xen.img
title CentOS (2.6.18-8.1.14.el5)
root (hd0,0)
kernel /boot/vmlinuz-2.6.18-8.1.14.el5 ro root=/dev/hda1 rhgb quiet
initrd /boot/initrd-2.6.18-8.1.14.el5.img
|
妳必须要注意到,鸟哥使用的开机菜单为第0个,亦即是 2.6.18-8.1.14.el5xen 那一个!
然后重新启动这部 Linux 主机喔!启动完成后,应该再次的确认一下是否为 xen 的内核才行!
[root@linux ~]# uname -r
2.6.18-8.1.14.el5xen
# 仔细看,鸟哥的内核为新的 xen 的内核喔!
[root@linux ~]# chkconfig --list | grep xen
xend 0:off 1:off 2:on 3:on 4:on 5:on 6:off
xendomains 0:off 1:off 2:off 3:on 4:on 5:on 6:off
# Runlevel 3/5 的 xen 相关服务是有启动的才行!
[root@linux ~]# pstree -p | grep xen
| |-xenbus(10)
| `-xenwatch(9)
|-xenconsoled(2348)---{xenconsoled}(2349)
|-xenstored(2340)
# 这样看来,应该确实是有启动的样子喔!继续最后一个确认!
[root@linux ~]# xm list
Name ID Mem(MiB) VCPUs State Time(s)
Domain-0 0 462 1 r----- 49.2
# xm 为 Xen 的重要指令,list 为列出已经在跑的 xen 系统,缺省有 domain-0 存在!
|
通过上面的测试,我们会知道 xen 确实已经顺利的启动,而且也启动前面谈到的那个重要的 domain-0 啰!
接下来我们再来聊一聊那 xen 的设置档在哪里?
xen 的套件结构
我们前面谈到过, Xen 在 domain-0 是由一个 xend 的服务所管理的,他可以用来启动、关闭与链接到其他的
domain-U 当中。此外, Xen 亦提供许多的指令来让系统管理员管理他们的 domain-U 啊!这些重要的启动运行档为:
- /usr/sbin/xend:就是 xend 的启动脚本,使用 python 编程语言写成的;
- /usr/sbin/xm:重要的管理 xen 的指令,可输入 xm help 查找用法。
至于与 xen 有关的设置档,包括一些仿真组件的启动脚本都在 /etc/xen 底下,在这个目录下的许多数据为:
- /etc/xen/xend-config.sxp:这个重要!是 xend
的设置档!内容包括 domain-0 的类型、网络的链接方式、
domain-0 的内存与CPU等资源配置、是否使用 vnc 作为 domain-U 的连接方式等等。
不过,鸟哥觉得,这个文件不太需要更动,使用默认值就很够用了。
- /etc/xen/:里面含有数个 domain-U 的设置档范本,包括:xmexample1, xmexample.hvm。
其中,那个 xmexample.hvm 可作为完整仿真的参考范本喔!
- /etc/xen/auto:如果妳想要在系统开机时就自动启动某个
domain-U 的话,可以将该设置档指定链接到这个目录中。
举例来说,如果妳要在开机后立即使用 /etc/xen/xmexample.hvm 设置档来启动某个 domain-U ,
那可以这样做:
[root@linux ~]# cd /etc/xen/auto
[root@linux auto]# ln -s ../xmexample.hvm .
# 这只是个范例,妳可不要跟着做!因为 xmexample.hvm 还需要修改才能运作!
|
- /etc/xen/scripts:这目录有趣了!包括虚拟设备的启动、虚拟网络的启动、
虚拟桥接器的启动等等,都是通过这目录底下的所有文件来达成的!
在妳安装完毕,并且使用新内核启动后,接下来让我们开始来处理一个小案例吧!
就如同
图 2-1 的样子,在主机上的所有 Linux OS 都需要自己能够开机,
而开机流程通常是这样的:(
注8)
- step 1: 按下电源,主机开始读取 BIOS 数据;
- step 2: 取得开机的设备顺序,并由 MBR 取得开机菜单与开机管理程序;
- step 3: 由开机管理程序加载 Linux kernel 及虚拟磁盘 (initrd);
- step 4: Kernel 侦测硬件加载适当的驱动程序,并挂载根目录以读取内核模块;
- step 5: 开始由 /sbin/init 程序设置主机的环境。
由上述的动作,我们可以知道 Linux 开机的重点在于
1.
内核 2. 虚拟磁盘 (initrd) 及 3. 根目录 (/) 了。
虽然内核与虚拟磁盘我们的 CentOS 5 已经提供了,但是缺省的虚拟磁盘好像并未主动的加入 Xen 的某些驱动程序,
因此我们得需要针对虚拟磁盘进行设置才好。此外,每个 Xen domain
的根目录也很伤脑筋的!因为根目录需要很多数据,而且还需要挂载类似 /sys, /proc, /dev, /selinux 等特殊的文件系统哩!
那该如何处理根目录呢?底下就让我们来处理处理:
硬件支持性
就如同前面几个小节谈到的,如果我们的硬件并不支持 xen 所必须要的功能,那么妳是无法创建好你的 domain-U 的!
在这个泛用案例当中我们的重点是测试半虚拟化,因此妳只要具有 PAE 的支持即可。
鸟哥以较低级的 P-III 800 来进行测试,硬件检查的结果是这样的:
[root@linux ~]# cat /proc/cpuinfo | grep flags
flags : fpu tsc msr pae mce cx8 mtrr mca cmov pat pse36 mmx fxsr sse up
|
妳可以发现确实存在那个 pae 的关键字,因此我们这个系统是可以玩 Xen 的半虚拟化技术的!
所以让我们继续进行工作吧!
根目录所需磁盘槽
根目录所需磁盘槽的来源可以有两个,一个是实体硬盘,一个是利用 dd 创建一个大文件来使用。
鸟哥比较倾向利用 dd 来处理你的根目录喔!妳可以这样做:
范例:创建一个 5GB 的大文件
[root@linux ~]# mkdir -p /disk2/xen
# 因为鸟哥的 /disk2 为一颗额外的硬盘,所以容量比较大啦!
[root@linux ~]# cd /disk2/xen
[root@linux xen]# dd if=/dev/zero of=xen.img bs=1M count=5000
5000+0 records in
5000+0 records out
5242880000 bytes (5.2 GB) copied,178.482 秒,29.4 MB/s
# 这个时候会开始创造一个 5GB 左右的文件,由于硬盘速度快慢的关系,
# 这个动作可能会消耗数分钟到数十分钟不等。
[root@linux xen]# ll /disk2/xen
-rw-r--r-- 1 root root 5242880000 Oct 10 00:30 xen.img
|
文件是创建起来了,不过如果你的 Linux 有启动 SELinux 的话,还需要一些类型的改变才可以!
其实动作也不难,这样做就对了!
[root@linux xen]# chcon -t xen_image_t -R /disk2/xen
[root@linux xen]# ll -aZ /disk2
drwxr-xr-x root root user_u:object_r:xen_image_t .
drwxr-xr-x root root system_u:object_r:file_t ..
-rw-r--r-- root root user_u:object_r:xen_image_t xen.img
# 如果妳有启动 SELinux 才需要这么做,否则就略过。
# 反正你要记得 Xen 的文件必须要是 xen_image_t 的安全内容类型。
|
文件创建起来后,就需要进行格式化啰~格式化的方法为:
范例:将刚刚创建的大文件格式化为 ext3 的文件格式
[root@linux xen]# mke2fs -j /disk2/xen/xen.img
mke2fs 1.39 (29-May-2006)
/disk2/xen/xen.img is not a block special device.
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
....底下省略....
|
由于这是文件不是磁盘分区,所以会有上述的警告消息,妳按下『y』就对啦!
拷贝或安装根目录
由于 domain-U 与 domain-0 其实是一样的系统,因为是半虚拟化嘛!所以,
最简单的根目录制作方法,
就是将原本的 domain-0 的根目录拷贝到新的分区内就对了!
以鸟哥的例子来说,妳可以简单的这样做:
[root@linux ~]# mount -o loop /disk2/xen/xen.img /mnt
# 先将刚刚制作出来的数据给他挂载起来,这是特殊挂载法喔!
[root@linux ~]# cp -ax /{root,dev,var,etc,usr,bin,sbin,lib} /mnt
# 这几个目录的数据是一定需要拷贝的!粉重要!。
[root@linux ~]# mkdir /mnt/{proc,sys,home,tmp,selinux}
# 这几个目录与虚拟文件系统有关,包括进程、内核数据等目录,所以要先创建
[root@linux ~]# vi /mnt/etc/fstab
/dev/sda1 / ext3 defaults 1 1
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs defaults 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
# 我这里假设我的根目录所在磁盘槽为 SATA 硬盘的第一个分区,
# 所以是 /dev/sda1 。此外,其他的文件系统如 proc, sysfs 都必须要写入!
# 至于原本在 domain-0 的其他设备,就给他拿掉吧!
[root@linux ~]# vi /mnt/etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=xen.test.hostname
# 这里设置一下妳的主机名称啦!
[root@linux ~]# vi /mnt/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
IPADDR=192.168.0.123
NETMASK=255.255.255.0
ONBOOT=yes
# 建议将 IP 也设好。但是要注意那个 HWADDR 最好能够拿掉不设置!
[root@linux ~]# umount /mnt
# 记得将挂载的数据给他卸载掉
|
基本上,根目录的设置到这里就算结束了!不过,妳会发现由于 domain-U 的数据都是由 domain-0 来的,
而不同的主机其实设置不会相同,所以使用上述的作法妳会发现有几个小问题:
- 妳必须要手动处理一些小设置,包括主机名称, /etc/fstab, IP 参数等等;
- 即使手动处理过上述的数据,还是很可能会无法成功的启动 domain-U ;
- 由于 domain-0 可能会安装比较多的套件,这些数据又在 domain-U 当中用不着,徒然造成硬盘容量的浪费。
所以,虽然这个方法最简单,不过通常鸟哥不是很建议您使用啦! ^_^
设置虚拟磁盘镜像档以及终端机接口
由于缺省的 CentOS 虚拟磁盘 (Initial Ram Disk) 并不包含一些 Xen 的相关驱动程序,
因此搞了老半天也是无法驱动 Xen 的 domain-U ,给他气死!
所以,我们得先就 initrd 来进行一些额外的设置才行。
这个地方非常的重要!因为鸟哥卡在这里好几天~最后才发现原来是 initrd 的问题啊~
[root@linux ~]# mount -o loop /disk2/xen/xen.img /mnt
[root@linux ~]# cd /boot
[root@linux boot]# mkinitrd -v -f --fstab /mnt/etc/fstab --with xenblk \
> --with xennet --preload xenblk --preload xennet \
> initrd-2.6.18-8.1.14.el5xen.vbird.img `uname -r`
[root@linux boot]# umount /mnt
# 详细的各项参数请 man mkinitrd ,上述的范例仅是利用 /etc/fstab 的设备来设置,
# 并且加上一些 xen 相关的驱动程序而已。这个过程非常的重要!
# 最终会制作出一个 initrd-2.6.18-8.1.14.el5xen.vbird.img 文件
|
除了这个虚拟磁盘之外,为了要方便我们登录 domain-U 的环境,我们需要产生一个终端机接口才行。
因为每个 domain-U 会使用到终端接口,然而我们知道 tty1 ~ tty7 缺省给 domain-0 使用掉了。
为此,我们必须得要制作出一个虚拟的终端接口,那就是 xvc0 这个终端接口啰。如何产生呢?
简单的流程是这样:
[root@linux ~]# vi /etc/inittab
# 大约在第 51 行的地方加入底下特殊字体的部分:
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
co:2345:respawn:/sbin/agetty xvc0 9600 vt100-nav
# 意思是使用 agetty 创建 xvc0
[root@linux ~]# init q
# init q 这个指令可以让 /etc/inittab 的设置立刻生效而不需要重新开机!
[root@linux ~]# ln -s /dev/console /dev/xvc0
# 如果 xvc0 没有主动创建的话,我们需要手动来创建链接才可以喔!
|
做完这一步之后,接下来就是可怕的设置档啰~
编辑 xen 虚拟数据的设置档
接下来就是重头戏啦!因为我们必须要指定 domain-U 的相关虚拟设置值,包括使用几颗 CPU 、使用多少内存容量,
以及所使用的内核与根目录的所在等等。如前所述,这些设置档主要都在 /etc/xen 底下,
尤其里面的 xmexample1, xmexample2 等文件就是很好的说明文档档,很有参考价值。
鸟哥先说一下我的设置是这样的:
[root@linux ~]# vi /etc/xen/centos5
# 这个文件的文件名可以随便你取,不过设置档最好是在 /etc/xen 这个目录下才好!
name = "centos5"
kernel = "/boot/vmlinuz-2.6.18-8.1.14.el5xen"
ramdisk = "/boot/initrd-2.6.18-8.1.14.el5xen.vbird.img"
memory = "128"
vcpus = 1
vif = [ '' ]
disk = [ 'tap:aio:/disk2/xen/xen.img,sda1,w' ]
root = "/dev/sda1 ro "
# name: 只是一个显示的名称,一般建议与文件名相同即可;
# kernel: 在 domain-0 上面的文件,用来进行 domain-U 的开机!非常重要!
# ramdisk: 就是 initrd 那个文件啰~刚刚我们才做出来的文件名
# memory: 分配给这个 domain-U 的内存有多少?如果没有图形,96 MB 也可以!
# vcpus: 使用多少颗 CPU 的意思;
# vif: 是否需要网络卡,如果需要网络卡,至少要有设置!但内容可用缺省!
# disk: 用来作为根目录的是那个磁盘,这个最重要啦!语法为:
# tap:aio:/完整/路径/文件名,设计为domain-U的磁盘代号,可否写入
# 以我们这个例子来说,我将之前创建的大文件仿真成为 domain-U 的
# /dev/sda1 ,并且该 partition 为可写入 (w)。
|
特别特别留意的是,上面的设置档当中的 kernel, ramdisk 以及 disk 都是以原本的主机 (domain-0) 的角度来思考的,
也就是说,实际上我们是
以 domain-0 的内核文件来进行
domain-U 的开机,因此妳会发现在 domain-U
当中并不存在 /boot 这个目录喔!因为实际上用来开机的是 domain-0 的文件嘛!
至于另一个重点就是那个 disk 参数。我们可以使用仿真的方式也可以使用实际的 partition 来给予设置。
如果是『用文件来仿真成为 partition』时,使用两个逗号 (,) 隔开成为三个字段,分别为:
tap:aio:/完整路径/文件的名称,设备代号名称,写入与否
- [tap:aio:]:为较新的文件处理模式,旧的方式为使用:[file:]
- [设备代号名称]:就是仿真的设备,请与 domain-U 内的 fstab 对应起来喔!
- [w]:就是设置可否写入,若唯读则为[r]
如果使用实体 partition 来仿真的话,那么开头的部分会以『phy:』来取代。举例来说,如果我们以 /dev/hda5
来作为 domain-U 的 /dev/sda1 的话,那就会变成:
disk = [ 'phy:/dev/hda5,sda1,w' ]
如果一切都搞定之后,接下来让我们来启动 Xen 的 domain-U 吧!
利用 xm 指令启动与管理 domain-1
在 domain-0 可以使用 xm 这个指令来启动、关闭、删除某个 domain-U , xm 的指令用法是这样的:
[root@linux ~]# xm [动作] [设置文件名] [-c]
参数:
[动作]:要某个设置档内的 domain-U 作何动作之意,常见的动作有:
create :启动这个 domain-U 的意思,例如启动 centos5 这个设置档时,使用:
xm create centos5
destroy :立即由内存中,将这个 domain-U 给删除,常用于 domain-U 出问题时
list :将目前已经启动的 domain 都列出来之意;
console :若有已创建的 domain-U 时,可用 console 来取得 domain-U 的终端接口
shutdown :关闭某个已启动的 domain。如果想要关闭全部的 domain-U ,可用
xm shutdown -a
[设置文件名]:亦即在 /etc/xen/ 目录下的文件名啰;
-c :同时创建到该设置档的终端接口 (console)
|
如果想要启动我们刚刚创建的 centos5 这个设置档内的 domain 时,妳可以使用『xm create -c centos5 』即可。
那个 -c 的作用是可以让妳直接取得 domain-U 的终端机接口。鸟哥在 pietty 上面连接到 domain-0 ,
然后启动 centos5 这个 domain 的情况如下所示:

图 2-2、启动 xen domain-U 的示意图
在图 2-2 当中,输入指令后 domain-U 的开机流程就会依序的显示在妳的终端机上,
感觉上就好像坐在电脑前面看 Linux 主机开机一样!实在是很不赖!最后如果开机顺利成功的话,
结果会像下图所示这样:

图 2-3、启动 xen domain-U 的示意图
在图 2-3 当中,最上方圈起来的开机消息是错误消息。由于我们是拷贝 domain-0 的所有数据,
因此连同原本写在 /etc/rc.d/rc.local 文件内的运行过程也会被运行。但是 domain-U 的状况与
domain-0 并非完全相同,所以就会如上所述出现一些错误消息啦!这也是我们需要额外处理的部分喔。
当你以 root 的身份登录后 (这个真的是终端机,并非是 ssh 的画面喔!),会发现多了一个 xvc0 的终端接口,
这个接口得先在 /etc/inittab 里面设置好才行!如果一切都 OK 了!恭喜您,你已经登录 domain-U 啰!
接下来请妳自行根据妳的需要来设置好妳的 domain-U 吧!让这两个 domain 并行呢!
好了,现在我如何注销 centos5 这个 domain-U 呢?妳可以这样做的:
- 直接在 domain-U 的环境中按下 [ctrl]-] 这个组合键来回到 domain-0 的环境;
- 直接关闭 pietty 等连接的软件;
- 利用其他 bash 来结束 (kill) 掉使用 xm 所创建的连接进程
有趣的是,即使妳使用上述的方法来离开 domain-U 时,
也不会影响到 domain-U 的继续运作!而且 root 也不会注销,等到妳下次再以『 xm console centos5 』时,
会继续取得 root 的动作继续处理刚刚未完成的工作呢!很神奇吧~
现在,请跳回 domain-0 的地方,或者是利用另外一条 pietty 的连接连入 domain-0 ,我们使用 xm list
来察看一下各个 domain 的状况吧!
[root@linux ~]# xm list
Name ID Mem(MiB) VCPUs State Time(s)
Domain-0 0 366 1 r----- 735.2
centos5 42 127 1 ------ 52.4
# 妳会发现多了一个 domain 出现!名称为 centos5 啦!
# 妳也会发现有个 State 吧!那个 State 的意义是这样的:
# r :该 domain 正在使用 CPU 资源在运作中;
# b :这个 domain 目前被悬置(blockded),很可能由于这个 domain 在等待较长时间
# 的输入输出 (I/O) 之故。
# p :该 domain 处于暂停的状态,通常由于管理员使用 xm pause 之故。
# 当 domain 在此状态时, Xen 的监督器将不会处理该 domain 的动作;
# s :这个 domain 正在关机当中
# c :这个 domain 已经 crash 了,但是却没有自动的关掉。通常是因为没有设置
# on_crash 的相关动作所致。
# d :该 domain 正在死亡中...因为该 domain 无法正确的 shutdown/crashed 之故。
|
很简单吧!这样就完成你的 Xen domain 啰~开始将妳所想要的网络服务分门别类的放到不同的 domain-U 中吧!
加油!
例题:关于如何登录 domain-U我在启动 domain-U 的时候,使用指令为『 xm create domain-U 』导致我使用 xm list
可以看到新的 domain-U 在运作,但我还是在 domain-0 。请问此时我该如何登录 domain-U 呢?
答:
有两种方式,如果想要取得 domain-U 的终端机模式,请使用:
如果妳知道 domain-U 的 IP,并且 domain-U 有启动类似 ssh/telnet 的服务时,可使用网络服务登录。举例来说
domain-U 的 IP 为 192.168.100.100,且有启动 ssh ,则妳可以使用:
ssh username@192.168.100.100
|
例题:关于如何关闭 domain-U
我使用 xm list 时,发现 domain-U 已经启动了,我该如何关闭这个 domain 呢?
答:
如果妳在 domain-0 上头的话,可以使用: 来关闭这个 domain-U ,
如果极端一点,妳想要关闭所有的 domain-U (除了 domain-0 之外),则可以下达: 那如果妳是在 domain-U 里面呢?想关闭该 domain 就直接给他:
即可,就好像一般正常进程关机一样喔!
那如果万一 domain-U 无法顺利关机,则妳可以在 domain-0 上面直接下达删除的指令:
|
例题:关于重复登录的问题
我利用 xm create -c domain-U 的方式取得终端机来登录 domain-U 了,结果另外一个用户使用『xm console domain-U』也来登录该
domain,此时会发生什么问题?该如何解决?
答:
由于缺省情况下,一个 domain-U 仅有一个终端机,因此第二个登录者将不会询问帐号密码,
而是直接以第一个登录者的身份取得该终端接口,亦即两者将具有相同的终端接口与所有资源。
但如此一来会导致控制权的争夺效应,最终结果两者都无法控制该终端接口。此时建议两者均离开该终端接口,
然后让单一用户以 xm console 登录,另一用户则使用类似 ssh 的方式网络登录即可。
|
常见错误分析
Xen 的启动其实是颇不容易的,常常会有一些错误情况发生。底下我们来看看一些常见的错误情况,
让您了解到,您无法启动 Xen 的可能原因为何?
没有启动 Xen 的 xend daemon
[root@linux ~]# xm create -c centos5
Using config file "./centos5".
Error: Unable to connect to xend: Connection refused. Is xend running?
|
如上所述,肯定你没有启动 xend 这个 daemon 的啦!直接启动他即可:『/etc/init.d/xend start』
使用到错误的内核或者 domain-0 未以新 xen 内核开机
[root@linux ~]# xm create -c centos5
Using config file "./centos5".
Error: (22, 'Invalid argument')
|
然后请到注册表内看看,亦即是 /var/log/xen/xend.log 档内,如果出现如下的错误:
[root@linux ~]# cat /var/log/xen/xend.log
[2007-10-17 13:18:48 xend.XendDomainInfo 31254] ERROR
(XendDomainInfo:203) Domain construction failed
|
很有可能就是你的内核文件用错。此时请检查一下你的设置档,看看『kernel』的项目是否设置正确?
我们务必要使用 xen 相关的内核来开机才行啊!
SELinux 或者是文件权限的问题
[root@linux ~]# xm create -c centos5
Using config file "/etc/xen/centos5".
Error: Kernel image does not exist: /boot/vmlinuz-2.6.18-8.1.14.el5xen
|
但我看过 /boot/vmlinuz-2.6.18-8.1.14.el5xen 确实是存在的,可能原因为何?一般来说,这种问题应该是
SELinux 的影响所致。确定方法可以用『setenforce 0』然后再重新『xm create -c centos5』测试看看,
如果确定可以登录,那表示您的 /boot/vmlinuz-2.6.18-8.1.14.el5xen SELinux 安全格式内容不对。
正确的内核开机类型应该是:
[root@linux ~]# ll -Z /boot
-rw-r--r-- root root system_u:object_r:boot_t config-2.6.18-8.1.14.el5xen
-rw------- root root user_u:object_r:boot_t initrd-2.6.18-8.1.14.el5xen.vbird.img
-rw-r--r-- root root system_u:object_r:boot_t symvers-2.6.18-8.1.14.el5xen.gz
-rw-r--r-- root root system_u:object_r:system_map_t System.map-2.6.18-8.1.14.el5xen
-rw-r--r-- root root system_u:object_r:boot_t vmlinuz-2.6.18-8.1.14.el5xen
|
请自行使用 chcon 指令来处理 SELinux 的错误吧!
Kernel panic 的问题
如果出现如下的可怕画面时:
....前面省略....
Loading ext3.ko module
Creating root device.
Mounting root filesystem.
mount: could not find filesystem '/dev/root'
Setting up other filesystems.
Setting up new root fs
setuproot: moving /dev failed: No such file or directory
no fstab.sys, mounting internal defaults
setuproot: error mounting /proc: No such file or directory
setuproot: error mounting /sys: No such file or directory
Switching to new root and running init.
unmounting old /dev
unmounting old /proc
unmounting old /sys
switchroot: mount failed: No such file or directory
Kernel panic - not syncing: Attempted to kill init!
|
出现这个『Kernel panic』的问题非常的多且复杂,其实主要的原因就是
无法挂载根目录。
因为你内核文件已经进行侦测,并且虚拟磁盘文件 (initrd) 也已经加载啰!
那什么情况下会无法挂载根目录呢?妳应该要这样查阅:
1. 用来作为根目录的文件 SELinux 类型不对:
首先,请先到 /var/log/messages 里面察看一下,如果出现如下画面:
Oct 17 12:04:17 xen-test kernel: audit(1192593857.395:259): avc:
denied { search } for pid=29687 comm="tapdisk" name="/" dev=hdc1
ino=2 scontext=system_u:system_r:xend_t:s0
tcontext=system_u:object_r:default_t:s0 tclass=dir
# 上面是同一行,意思是说,该文件读取被拒绝了,因为进程的格式为:
# scontext=system_u:system_r:xend_t:s0 ,但是你的文件格式为特殊字体部分,亦即:
# tcontext=system_u:object_r:default_t:s0
# 所以这个文件的读取就被『deny』了!
|
这表示妳用来作为根目录的文件 SELinux 类型不对,正确的文件类型是这样的:
-rw-r--r-- root root user_u:object_r:xen_image_t xen.img
|
所以妳可以使用类似底下的方式来处理:
[root@linux ~]# chcon -t xen_image_t -R /disk2
|
似乎连同最顶层的 /disk2 都需要修改 SELinux 安全内容才行!所以妳可以加 -R 来让子目录生效!
2. initrd 虚拟磁盘没有加载正确的模块
另一个可能原因就是虚拟磁盘并没有加载 domain-U 需要的模块,所以妳必须要仔细看上面的输出消息有没有这个项目:
Creating block device nodes.
Loading xenblk.ko module
XENBUS: Timeout connecting to device: device/vbd/2049 (state 3)
Loading xennet.ko module
netfront: Initialising virtual ethernet driver.
netfront: device eth0 has flipping receive path.
Loading uhci-hcd.ko module
|
这表示已经加载了 xen 的相关模块,如果你的画面没有这个消息时,请参考前一小节关于虚拟磁盘的说明。并且更新你的 domain-U 设置档吧!
3. 设置档内容写错
很多时候我们都会打错字~实在很麻烦~所以如果上述两点妳都确认过了,接下来请检查一下你的打字有没有问题。
假设我的 xen 文件是放置到 /disk2/xen/xen.img 里头,那么两个地方要注意:
[root@linux ~]# vi /etc/xen/centos5
name = "centos5"
kernel = "/boot/vmlinuz-2.6.18-8.1.14.el5xen"
ramdisk = "/boot/initrd-2.6.18-8.1.14.el5xen.vbird.img"
memory = "128"
vcpus = 1
vif = [ '' ]
disk = [ 'tap:aio:/disk2/xen/xen.img,sda1,w' ]
root = "/dev/sda1 ro"
|
仿真的设备 (disk 项目内) 以及根目录的所在设备 (root 的项目) 需要配合成功,否则就会失败了!
当然啦,仿真的设备也必须要跟实际的文件相同才行喔!
domain-U 本身的问题
如果开机已经到达下面的状况时:
unmounting old /sys
INIT: version 2.86 booting
Welcome to CentOS release 5 (Final)
Press 'I' to enter interactive startup.
正在设置时钟 (localtime): 三 10月 17 13:24:28 CST 2007 [ 确定 ]
正在启动 udev: [ 确定 ]
....中间省略....
正在检查文件系统
Checking all file systems.
[/sbin/fsck.ext3 (1) -- /] fsck.ext3 -a /dev/hda1
fsck.ext3: No such file or directory while trying to open /dev/hda1
/dev/hda1:
The superblock could not be read or does not describe a correct ext2
filesystem. If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
e2fsck -b 8193
[失败]
*** 检查文件系统时发生错误。
*** 系统将带您进入 shell 模式; 然后重新开机
*** 当您离开 shell 时。
Give root password for maintenance
(or type Control-D to continue):
|
注意到上面特殊字体的部分,既然已经出现了 INIT 的字样,这表示 domain-U 已经通过了内核侦测、
根目录挂载等动作,且已经顺利的在运行 /sbin/init 这个指令了,因此我们可以确信所有的 Xen 设置都是正确的,
可能发生的错误就在 /disk2/xen/xen.img 这个文件内的配置了。妳可能需要依据开机流程一个一个的去处理相关的错误喔!
最可能发生的就是在 domain-U 的 /etc/fstab 啰~