作为秘籍,本文包含折腾Xen所必须了解,但是在一般能找到的教程里面都没提及的资料。这里不包含一些必须的步骤等,所以很可能你需要先浏览这些资料,并让浏览器同时开着这些页面随时查阅:
DebianWiki Xen
DebianWiki DebianInstaller/Xen
XenWiki HowTos
Ubuntu Doc/Xen
Ubuntu 9.04上的XEN虚拟服务器(一) 安装XEN
、(二) 安装虚拟机
在 Debian 上安装和配置 Xen
一:Xen工具及其关系
《在 Debian 上安装和配置 Xen
》一文把在Debian上安装Xen简化成一道命令:
apt-get
install
xen-hypervisor-3.2
-1
-amd64 /
xen-linux-system-2.6.26-2
-xen-amd64 xen-utils-3.2
-1
/
xenstore-utils xenwatch xen-shell xen-tools
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服务商提供给用户的操作界面,用户根据几个封装好的命令控制虚拟机如重启等工作。
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
文件里面有这么一行配置:
1
2
## Xen hypervisor options to use with the default Xen boot option
# xenhopt=
是预留来传hypervisor参数的,比如要限制dom0的内存使用,可以写成:
1
# xenhopt=dom0_mem=256M
修改后记得运行 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来做安装源:
1
2
3
4
mkdir
/
mnt/
isodir
mount
-o
loop /
path/
to/
the_iso_file.iso /
mnt/
isodir
cd
/
mnt/
isodir
python -m
SimpleHTTPServer
现在这个机器就在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是否正常读取到内核:
1
/
usr/
lib/
xen-3.2
-1
/
bin/
pygrub /
home/
xen/
domains/
lenny3/
disk.img
会出现菜单,选择后会退出,返回一段临时文件数据,内核文件的临时位置。
目前在Debian Squeeze内的Xen 4.0的pygrub有个小小的低级错误,运行后会报模块导入错误,其实只要编辑/usr/lib/xen-4.0/bin/pygrub
文件,把里面修改path的一行提前即可:
1
2
sys
.path
.insert
(
1
, sys
.path
[
0
]
+ '/../lib/python'
)
#这行原在30行左右,提前到这里
import
xen.lowlevel
.xc
#原本这里出错
典型的几种创建方法
1
2
3
4
5
xen-create-image --hostname
=my-lenny --dist
=lenny --mirror
=http://
mirrors.163.com/
debian --role
=udev --force
--verbose
xen-create-image --hostname
=my-ubuntu-vm --dist
=lucid --mirror
=http://
mirrors.163.com/
ubuntu --role
=udev --pygrub
--force
--verbose
xen-create-image --hostname
=my-xen-vm --dist
=squeeze --install-method
=tar
--install-source
=/
path/
to/
system_tared.tar.gz --pygrub
--force
--verbose
第五章:虚拟机的运行
关于虚拟机配置文件
完成创建虚拟机后,默认情况下在/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
再创建的虚拟机就没有这个问题了。
用了旧版工具但要修复这个问题也不算太麻烦:
1
2
3
4
5
6
xm shutdown <
NAME>
#确保关闭,运行xm list确保虚拟机已经没有运行
mount
-o
loop /
home/
xen/
domains/<
NAME>/
disk.img /
mnt
cp
/
mnt/
etc/
inittab /
mnt/
etc/
inittab.bak
sed
's/tty1/hvc0/'
/
mnt/
etc/
inittab.bak >
/
mnt/
etc/
inittab
umount
/
mnt
就是替换/mnt/etc/inittab
文件里面,把虚拟终端的交互设备从tty1改成hvc0。在新版的xen-tools里面,这个替换已经由安装脚本完成了。hvc0是Xen虚拟机的类终端设备,只有让虚拟终端的输出输入跟hvc0链接,才能通过xen的console方法登录虚拟机。
如果使用vnc连接虚拟机,又会发现vnc里面无法登录虚拟机,vnc是framebuffer驱动的图形,默认连接tty1设备,可以按上述方法打开虚拟机的/mnt/etc/inittab
文件,在getty那一段,写成这样:
1
2
0
:2345
:respawn:/
sbin/
getty 38400
hvc0
1
:2345
:respawn:/
sbin/
getty 38400
tty1
如果你安装的是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输出,只需在其配置文件内添加(望文生义即可):
1
2
3
vfb = [
'type=vnc'
]
#复杂点的:
vfb = [
'type=vnc,vncdisplay=10,vncpasswd=s3cr3t'
]
vncdisplay的值加上5900,得到的就是最终vnc服务所监听的端口。
更复杂的配置选项看xm create --help_config
。
关于虚拟机的自动启动
让虚拟机跟随dom0启动的方法有很几种,比如在/etc/xen/auto/
目录里面放虚拟机配置文件的链接。但似乎更好的做法是在每个配置文件里面写上:
1
2
on_xend_start = 'start'
on_xend_stop = 'suspend'
这样的好处是当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最有价值的地方。
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com