本文包含折腾Xen所必须了解,但是在一般能找到的教程里面都没提及的资料。这里不包含一些必须的步骤等,所以很可能你需要先浏览这些资料,并让浏览器同时开着这些页面随时查阅:
- DebianWiki Xen
- DebianWiki DebianInstaller/Xen
- XenWiki HowTos
- Ubuntu Doc/Xen
- Ubuntu 9.04上的XEN虚拟服务器(一) 安装XEN (二) 安装虚拟机
- 在 Debian 上安装和配置 Xen
一:Xen工具及其关系
《在 Debian 上安装和配置 Xen》一文把在Debian上安装Xen简化成一道命令:
On Debian Lenny 5.0 :
On Debian Squeeze 6.0
xen-hypervisor
主要只有一个文件:/boot/xen-3.2-1-amd64.gz
,就是宿主内核;xen-linux-system
则是打了Xen补丁的Linux内核,这个内核脱离hypervisor是无法启动的,只适用于虚拟机;dom0对hypervisor来说也是虚拟机之一,domU也可以直接用这个内核启动。xen-utils
则是运行在Dom0上的程序,比如xend、xm,作用是跟hypervisor通讯,是主要由Python编写的一系列程序。xen-tools
是如xen-create-image
的一系列工具,作为xm工具的前端,用以管理安装虚拟机;这是一套perl脚本,也有很灵活扩展性。xen-shell
是一个交互式的shell,常见用于VPS服务商提供给用户的操作界面,用户根据几个封装好的命令控制虚拟机如重启等工作。(Debian 6.0 下没有了。)xenstore-utils
、xenwatch
分别是虚拟机间数据共享和虚拟机监控的工具,不是必要组建,可不安装。
二: Dom0的启动
- grub2跟xen dom0目前关系不怎么所以如果你用grub2启动遇到挂掉xen启动不起来之类的,换回grub-legacy吧。
- 装完xen-hypervisor后可以打开
/boot/grub/menu.lst
看看,第一个选项应该是Xen 3.2-1-amd64
之类的,看他的启动参数,是先加载Xen内核/xen-3.2-1-amd64.gz,再按模块挂在Linux内核;如果没有出现,需要运行update-grub
。有这个后就可以放心重启了。 /boot/grub/menu.lst
文件里面有这么一行配置:
是预留来传hypervisor参数的,比如要限制dom0的内存使用,可以写成:
修改后记得运行
update-grub
才生效。
关于Dom0内存的占用可能导致虚拟机不稳定可参看:Dom0 mem allocation and domU network issues。
三:虚拟机的网络
无论是简单的桥接,安全的NAT子网,内部私有网,单双向网,利用内核的特性都可以做到: Xen Networking
四:虚拟机的安装
关于管理工具
有两套工具可以用来创建Xen虚拟机:xen-tools, libvirt-bin,从它们各自的主页很清晰看到它们的定位不同,前者主要用于本地管理Xen,由Debian支持,后者用于管理各种虚拟方案(xen,openvz,kvm,qeum,vbox,vmware….),由Redhat支持。虽然都支持跟兼容,但实际上前者有利于安装前者的系统,后者有利于安装后者的系统。这里只研究前者。
关于 xen-create-image
xen-tools是相当简单实用的一套脚本,教程里面一般提到使用的
xen-create-image
。
xen-tools有一个全局配置文件
/etc/xen-tools/xen-tools.conf
,里面写的参数会最终被xen-create-image
的命令行参数覆盖或补充。关于 –install-method
xen-tools的作用主要是控制怎么安装一个发行版,因为xen虚拟机的特殊方式,一般都不会启动该发行版的安装程序,而是用发行版的基础包管理来进行安装,安装参数
--install-method
负责这个过程,比如Debian/Ubuntu就要用debootstrap
方法安装,CentOS/Fedora用rinse
或rpmstrap
,另外还有copy
、tar
方法。安装好一个模板系统后对那个镜像手动挂载,tar压缩后来用部署其他虚拟机,是个好方法。关于 –dist
--dist
让你指定一个发行版的名字,你会发现并不是所有发行版都能被支持的,实际支持的可以看看/usr/lib/xen-tools
的内容,里面各个对应发行版的目录内都包含了一系列的脚本,如预先安装什么包,需要设置某个配置文件,比如说libc6-xen
,不过在64位机环境下这个是不需要的,脚本会自动判断。关于安装新版本系统
因为版本太旧,在Debian Lenny里面的xen-tools跟debootstrap不能直接支持比如Ubuntu Lucid(10.4)之类的较新的发行版的安装,倒是有比较曲折的方法Ubuntu upgrade to 9.10/10.04 for Xen DomU 。但其实有更好的方法:下载新版的Xen-tools跟debootstrap的deb回来装上。因为这些只是一些脚本,不会跟系统其他包有冲突。装完后就可以直接安装新版系统了。(dpkg安装新版xen-tool时候提示缺一个依赖,按名字装上即可)
关于 –mirror
安装教程里面一般都让你指定一个对应发行版的源,考虑到网速因素,这样安装一个虚拟机是很累的,虽然xen-create-image有个
--cache
可以在dom0上缓存deb包。其实如果你有相应发行版的iso文件,完全可以拿iso来做安装源:
现在这个机器就在8000端口上运行着一个HTTP源了,直接在mirror参数里面指定该地址即可,这样的安装过程很快。缺点是可能安装脚本有一些包在iso中没有提供而出错,建议加上
--verbose
参数查看整个安装过程。
安装过程的日至会被放在
/var/log/xen-tools/<NAME>.log
,如果安装过程出现什么问题可以直接看这个对应的文件。使用本地ISO做源虽然一般没什么问题,但如果缺了什么包之类的会在日志中提示。关于 –role
--role=udev
这个参数建议创建新虚拟机时候加上。--role
参数会让创建脚本在/etc/xen-tools/role.d/
目录下寻找相应名字的脚本运行,udev就是其中一个,作用是给虚拟机装上udev
包。udev是提供动态/dev
目录的机制,是提供内核对硬件识别的事件桥梁,对一般的xen虚拟机来说影响不算太大,如果不安装最显然的是会找不到/dev/shm
挂载点(启动过程有一个warnning),但一般来说还是推荐安装。/etc/xen-tools/role.d/
里面默认包含了以下一些有用的脚本,使用时可以逗号分隔,如--role=udev,minimal,cfengine
:builder
自动安装build-essential等编译链包,部署distcc集群有用。cfengine
CFengine是一个服务器自动化控制服务,对部署大量服务器很有用。会拷贝dom0上的配置。editor
自动根据dom0里面的sed脚本来配置domU内的配置文件,具体可以打开/etc/xen-tools/role.d/editor
看看说明。passwd
自动修改domU的密码。默认–passwd参数是会出现passwd的交互修改root密码的过程,用这个role脚本就可以实现自动应答。要使用--role-args=mYpassWd
传入相应密码。minimal
精简化domU系统。安装一些screen、vim等实用工具,卸除manpages等对虚拟机意义不大的包。udev
如前述,安装udev
包。xdm
安装X、xdm、icewm等GUI包。gdm
同上,登陆器换成gdm。
另外这些脚本默认都是针对Debian系系统设计的,Redhat系的应该用不了。
关于 –pygrub
最后有个
--pygrub
参数,关系到domU的引导过程。xen的半虚拟并没有从引导区的虚拟过程,而是直接读取内核文件运行。默认情况下是直接用dom0的内核的,如果domU的发行版跟版本跟dom0一致,这样处理倒是很方便,但是一旦不一致就容易出现找不到root分区等各种引导问题。如果安装的domU的系统跟dom0不一致的(包括amd64/i386这样的架构不同),就加上--pygrub
参数,这会让domU安装上它自己的内核,以及生成一个/boot/grub/menu.lst
文件,引导虚拟机时会根据这个文件模拟grub出现一个引导菜单,提出其自己的内核文件来启动虚拟机。
pygrub其实是xend的一个python工具,在
/usr/lib/xen-3.2-1/bin/pygrub
,可以直接这样运行来测试pygrub是否正常读取到内核:
会出现菜单,选择后会退出,返回一段临时文件数据,内核文件的临时位置。
目前在Debian Squeeze内的Xen 4.0的pygrub有个小小的低级错误,运行后会报模块导入错误,其实只要编辑
/usr/lib/xen-4.0/bin/pygrub
文件,把里面修改path的一行提前即可:典型的几种创建方法
第五章:虚拟机的运行
关于虚拟机配置文件
完成创建虚拟机后,默认情况下在
/home/xen/domains/<NAME>
下生成虚拟机的磁盘文件,在/etc/xen/<NAME>.cfg
生成相应虚拟机的配置文件。关于虚拟机配置的修改,只需直接打开这个cfg文件修改即可(如内存大小,CPU多少,使用VNC等)。配置文件其实是一个Python脚本,也就是说可以对虚拟机的参数进行创建时的动态调节。
配置文件的选项完整说明可以运行
xm create --help_config
查看。
启动虚拟机以Xen的术语来说是创建一个实例:
xm create -c /etc/xen/<NAME>.cfg
,-c参数可以马上进入虚拟机的console,使用pygrub的虚拟机只能通过这个方法看到grub菜单。关于虚拟机启动过程
本文成文时,使用Debian Lenny默认安装系统部署的domU似乎都有一个启动bug,即创建后使用
xm console <NAME>
仅能看到虚拟机启动的log信息,但是不出现shell,也无法登录,无法响应,只能按ctrl-]
返回dom0。如果按上述安装了新版的Xen-tools跟debootstrap再创建的虚拟机就没有这个问题了。
用了旧版工具但要修复这个问题也不算太麻烦:
就是替换
/mnt/etc/inittab
文件里面,把虚拟终端的交互设备从tty1改成hvc0。在新版的xen-tools里面,这个替换已经由安装脚本完成了。hvc0是Xen虚拟机的类终端设备,只有让虚拟终端的输出输入跟hvc0链接,才能通过xen的console方法登录虚拟机。
如果使用vnc连接虚拟机,又会发现vnc里面无法登录虚拟机,vnc是framebuffer驱动的图形,默认连接tty1设备,可以按上述方法打开虚拟机的
/mnt/etc/inittab
文件,在getty那一段,写成这样:
如果你安装的是Ubuntu,Ubuntu默认没有使用inittab来配置终端,而是使用了新的机制,使用目录
/etc/init/
里面的文件来控制,可以发现里面有tty1.conf之类的文件,可以cp /etc/init/tty1.conf /etc/init/hvc0.conf
,然后打开/etc/init/hvc0.conf
,把tty1那一段改成hvc0,保存即可。关于使用VNC查看虚拟机
关于VNC的设置在
/etc/xen/xend-config.sxp
和各个虚拟机的配置文件里面都有选项,关系是前者是全局配置。
要打开一个虚拟机的VNC输出,只需在其配置文件内添加(望文生义即可):
vncdisplay的值加上5900,得到的就是最终vnc服务所监听的端口。
更复杂的配置选项看
xm create --help_config
。关于虚拟机的自动启动
让虚拟机跟随dom0启动的方法有很几种,比如在
/etc/xen/auto/
目录里面放虚拟机配置文件的链接。但似乎更好的做法是在每个配置文件里面写上:
这样的好处是当dom0关机,Xen会先让虚拟机进入挂起状态(当然也可以改成shutdown直接关机),下次重启后虚拟机直接恢复。
第六章:其他问题
关于虚拟机的磁盘方式
使用xen-create-image工具创建的虚拟机,默认都是使用loop文件设备来映射,这样对io比较敏感的服务来说会有些影响。Xen3.3后引入了使用blktap驱动映射的磁盘设备,据称性能会有提高,不过根据试验好像跟pygrub配搭不怎么稳定(在xen-4.0下)。
觉得最靠谱的方式是使用lvm,xen-create-image工具也是支持直接创建lvm逻辑卷来安装的,这样即没有性能问题,也没有稳定问题。
全虚拟半虚拟与CPU支持VM指令集的关系
扫了一圈Google到的Xen资料,很多都让你检查
/proc/cpuinfo
里面有没有支持VM标记。其实CPU是否支持VM指令集,对xen来说只是能不能跑windows的问题,对于Xen的特色——半虚拟来说没什么影响,而且这才是xen最有价值的地方。