一、简介
Xen采用ICA协议,通过一种叫做准虚拟化的技术获得高性能,甚至在某些与传统虚拟技术极度不友好的架构上(x86),Xen也有上佳的表现。与那些传统通过软件模拟实现硬件的虚拟机不同,在Intel VT-X支持下3.0版本之前的Xen需要系统的来宾权限,用来和Xen API进行连接。到目前为止,这种技术已经可以运用在NetBSD, GNU/Linux, FreeBSD和Plan 9系统上。Sun微系统公司也正在积极地将Solaris移植到Xen平台之上。
Xen虚拟机可以在不停止的情况下在多个物理主机之间实时迁移。在操作过程中,虚拟机在没有停止工作的情况下内存被反复的复制到目标机器。虚拟机在最终目的地开始执行之前,会有一次60-300毫秒的非常短暂的暂停以执行最终的同步化,给人无缝迁移的感觉。类似的技术被用来暂停一台正在运行的虚拟机到磁盘,并切换到另外一台,第一台虚拟机在以后可以恢复。
Xen已经可以运行在x86系统上,并正在向x86_64、IA64、PPC移植。移植到其他平台从技术上是可行的,未来有可能会实现。
XEN 是一个基于X86架构、发展最快、性能最稳定、占用资源最少的开源虚拟化技术。Xen可以在一套物理硬件上安全的执行多个虚拟机,与 Linux 是一个完美的开源组合,Novell SUSE Linux Enterprise Server 最先采用了XEN虚拟技术。它特别适用于服务器应用整合,可有效节省运营成本,提高设备利用率,最大化利用数据中心的IT基础架构。
XEN 是英国剑桥大学计算机实验室开发的一个虚拟化开源项目,XEN 可以在一套物理硬件上安全的执行多个虚拟机,它和操作平台结合的极为密切,占用的资源最少。编写文档时稳定版本为XEN3.0。支持万贯虚拟化和超虚拟化。以高性能、占用资源少著称,赢得了IBM、AMD、HP、Red Hat和Novell等众多世界级软硬件厂商的高度认可和大力支持,已被国内外众多企事业用户用来搭建高性能的虚拟化平台。
二、虚拟化简介
半虚拟化
Xen通过一种叫做半虚拟化的技术获得高效能的表现(较少的效能损失, 典型的情况下大约损失 2%, 在最糟的情况下会有 8% 的效能耗损; 与其它使用完全的虚拟化却造成最高到 20% 损耗的其他解决方案形成一个明显的对比),甚至在某些与传统虚拟技术极度不友好的架构上(x86),Xen也有极佳的表现。与那些传统通过软件模拟实现硬件的虚拟机不同,在3.0版本及在Intel VT-X支援前的Xen需要让客户操作系统(guest operating systems)与Xen API进行连接。到目前为止,这样连结已经可以运用在NetBSD, GNU/Linux, FreeBSD和贝尔实验室的Plan 9系统上。在Brainshare 2005会议上,Novell展示了NetWare与 Xen的连通。与Windows XP连通的技术曾在Xen开发初期进行,但微软的协议未能允许它发布。Sun微系统公司也正积极研究Solaris与Xen的连结,使其能在Xen平台上运作。
全虚拟化
Intel对Xen贡献修改以支持其VT-X Vanderpool架构扩展。如果主系统支持Vanderpool或者Pacifica扩展(Intel和AMD对本地支持虚拟化的扩展),这项技术将允许未修改的客作业系统运行在Xen虚拟机中。事实上,那意味著性能的提升,并且你可以在没有进行任何协议不允许的修改的情况下对Windows进行虚拟。
三、通过xen安装虚拟机
1.修改yum源,由于centos6以后xen默认不在提供在系统光盘中,故需要修改yum来安装
1
2
3
4
5
6
7
|
[root@node1 ~] # vi /etc/yum.repos.d/xen4.repo
[xen4] name=xen4 baseurl=http: //mirrors .163.com /centos/6 .5 /xen4/x86_64/
enabled=1 gpgcheck=0 cost=500 |
2.安装xen
1
|
[root@node1 ~] # yum install xen kernel-3.4.68 kernel-firmware-3.4.68 -y
|
说明:经过多方测试,官方提供的最新版本的kernel无法在vmware中使用,故本处使用的版本为3.4.68
3.修改系统启动文件
1
2
3
4
5
6
7
8
9
|
default=0 timeout=5 splashimage=(hd0,0) /grub/splash .xpm.gz
hiddenmenu title CentOS (3.4.68-9.el6.centos.alt.x86_64) root (hd0,0)
kernel /xen .gz dom0_mem=512M cpufreq=xen dom0_max_vcpus=2 dom0_vcpus_pin // 新添加
module /vmlinuz-3 .4.68-9.el6.centos.alt.x86_64 ro root= /dev/mapper/vg0-root rd_NO_LUKS rd_NO_DM LANG=en_US.UTF-8 rd_LVM_LV=vg0 /swap rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg0 /root KEYBOARDTYPE=pc KEYTABLE=us rhgb crashkernel=auto quiet rhgb quiet // 将kernel改为module
module /initramfs-3 .4.68-9.el6.centos.alt.x86_64.img // 将initrd改为module
|
重启系统,检查响应的参数是否与我们配置的相同
1
2
3
4
5
|
[root@node1 ~] # uname -r
3.4.68-9.el6.centos.alt.x86_64 [root@node1 ~] # xm list
Name ID Mem VCPUs State Time(s) Domain-0 0 512 2 r----- 31.1 |
可以看到我们新使用的内核已经启用了,并且Domin0也已经启动完成
4.虚拟机的各状态
r:正运行于某CPU上,
b:阻塞
p:暂停
s:停止
c:崩溃
d:dying,正在关闭的过程中
name:虚拟机的名称
ID:虚拟机的ID
Mem:虚拟机的内存大小
VCPUs: cpu的个数
state:虚拟机的状态
Time:占据cpu的市场
5.创建xen pv 模式虚拟机的前提
在pv(半虚拟化)模式中运行guest系统,需要满足几个基本前提
1)能运行与Xen DomU的(xen-enabled)内核,Linux2.6.24及以后的内核已经添加了对Xen DomU的支持,因此,只要在内核编译时启用了想用的功能就能满足此要求,目前多数Linux发行版的内核都已经支持此特性;而此前的版本需要内核在编译前手动打补丁方可
2)根文件系统(Root Filesystem):包含了应用程序、系统组件及配置文件等运行Domu的歌中所需要文件的文件系统,其不要非得包含及对应的ramdisk,后面的这些组件放在Dom0中即可,事实上,用于DomU的内核文件必须要能够允许Dom0访问到,因为其运行时需要与Xen Hypervisor通信,因此,这些内核组件可以位于Dom0能够访问到的任何文件系统上,然而,目前基于pygrub(可用于Dom0跟非特权域磁盘映像中的内核通信),此内核文件也可以直接放置于非特权域的磁盘映像中
3)ramdisk或者ramfs:这个根据实际需要是个可选组件,如果内核初始化过程中不需要依赖于此来加载额外的驱动程序以访问根文件系统则也可以不用提供
4)swap设备: 交换分区能够让Linux运行比仅有物理内存时更多的进程,因此,提供此组件是常见的做法:当然,它是可选的
5)DomU配置文件:集中在一起指定前述各组件的配置信息,以及定义其他有关PV DomU的基本属性的文件;其通常包含所有的用于当前DomU属性的配置参数,包括为其指定磁盘映像和内核文件的位置(或pygrub的位置)等,以及其他许多属性如当前DomU可以访问的设备等,这些设备包含网络设备、硬盘、显卡及其他PCI设备:同时,配置文件中也可以指定新创建的非特权域可以使用的物理内存大小以及虚拟cpu个数等等
这里需要提醒的是,如果计划为PV DomU编译内核,需要以与传统方式不同的方式放置内核及其模块,内核一般都会放在Dom0的某路径下,而内核模块则需要放在DomU的根文件系统上
PV DomU的根文件系统可以以多种不同的方式进行安置,比如:
虚拟磁盘映像文件
Dom0没有使用的额外物理磁盘分区
Dom0没有使用的逻辑卷
块级别文件系统,如ISCSI设备
网络文件系统,如NFS
6.Xen的配置文件说明
Xen配置文件一般由选项(options)、变量(variables)、CPU、网络、PCI、HVM、计时器(timers)、驱动(drivers)、磁盘设备(disk devices)、动作(behavior),以及图形及声音(Graphics and audio)几个端组成,分别用于定义不同类型的域属性或设备属性
kernel:为当前域指定可用与DomU的内核文件
ramdisk:与kernel指定的内核文件匹配使用的ramdisk映像文件,根据需要指定,此为可选项
name:当前域的独有名称:每个域必须使用全局唯一的名称,否则将产生错误
memory:当前域的可用物理内存大小,单位MB,默认为512
disk:当前域的所有可以磁盘设备列表,格式为disk=["disk1","disk2",....],每个disk都有三个参数进行定义,格式为“backend-dev,front-dev,mode”:
backend-dev主要有两种类型,物理设备或虚拟磁盘映像文件,它们的格式分别为“phy:device”和“file:/path/to/file”
frontend-dev定义其在DomU中的设备类型,一般为xvd[a-z]
mode则用以定义其访问权限,r为只读,w为读写
vcpus:配置给当前域使用的虚拟cpu的个数,默认为1
root:为当前域指定其根文件系统所在的设备,这个将作为内核参数在内核启动时传递给内核
extra:传递给内核的额外参数,多个参数之间使用空格隔开
on_reboot:执行xm reboot命令或在当前域内部执行重启操作时有Xen指定的动作;其常用的值为destroy和restart
on_crash: 当前域由于各种原因崩溃时有Xen指定的动作,其常用的值为destroy、restart和preserve,preserve可以保存系统崩溃前的状态信息以用于调试
on_shutdown: 执行xm shutdown命令或在当前域内部执行关机操作时有xen执行的动作
vif:定义当前域的可用虚拟网络接口列表,每个虚拟网络接口都可以使用“name=value”的格式定义其属性,也可在定义某接口时不指定任何属性,其所有属性将均有系统默认配置
type:接口设备的类型,默认为netfront
mac:MAC地址,默认为随机
birdge:配置此接口的物理设备,默认为Dom0中的第一个桥接设备
ip:ip地址
script:配置此接口的脚本文件,省略是将使用默认的配置脚本
vifname:后端设备的设备名称,默认为vifD.N,其中D为当前域的ID,N为此网络接口的ID
vfd:为当前域定义虚拟帧缓存,其有许多可用属性,可以使用“name=value”的格式进行定义
vnc或sdl:定义vnc的类型,vnc=1表示启动一个可由外部设备连接的vnc服务器,sdl=1则表示启用一个自有的vncviewer。两者可以同时使用
vndispaly:vnc显示号,默认为当前域的ID,当前的VNC服务器将监听在5900+此显示号的端口
vnclisten:vnc服务器监听的地址,默认为127.0.0.1
vncpasswd:指定VNC服务器的认证密码
vncunused:如果此属性值为非零值,则表示vnxserver监听大于5900的第一个没被占用的端口
dispaly:用于与的自有vncviewer显示,默认为DISPLAY环境变量的值
cpu:指定当前域应该在那个物理CPU上启动,0表示第一颗CPU,1表示第二颗,依次类推;默认为-1,表示Xen了自行决定启动当前域的CPU
cpus:指定当前域的可以在那些物理CPU上运行,如cpus="3,5-8,^6"表示当前域的VCPU可以在3,5,7,8号CPU上余下
bootloader:bootloader程序的路径。基于此bootloader,PV DomU的内核也可以之间位于其文件系统上而非Dom0的文件系统
更多的选项请参见xmdomain.cfg的手册页,或参考Xen官方wiki链接http://wiki.xen.org/wiki/XenConfigurationFileOptions中的详细解释。
7.定义一个Xen的配置文件
1
2
3
4
5
6
7
8
9
10
|
kernel= "/root/vmlinuz"
ramdisk= "/root/initrd.img"
name= "centos6"
vcpus=1 memory=512 disk=[ 'file:/xen/vm/centos6.img,xvda,w' ]
on_crash= "destroy"
on_reboot= "destroy"
vif=[ "ip=192.168.1.221,bridge=br0" ]
vfb=[ "vnc=1,sdl=1" ]
|
8.准备Xen启动所需要的环境
准备init文件和kernel文件
1
2
3
|
[root@node1 ~] # mount /dev/cdrom1 /media/
[root@node1 ~] # cp /media/isolinux/vmlinuz /root/.
[root@node1 ~] # cp /media/isolinux/initrd.img /root/.
|
准备文件系统
1
2
3
4
5
6
7
8
|
[root@node1 ~] # mkdir -p /xen/vm
[root@node1 ~] # cd /xen/vm
[root@node1 vm] # dd if=/dev/zero of=/xen/vm/centos6.img oflag=direct bs=1M seek=10239 count=1
也可以使用下面命令创建 [root@node1 vm] # qemu-img create -f qcow2 -o size=100G,preallocation="metadata" /xen/vm/centos6.img
[root@node1 vm] # ll -h
total 16M -rw-r--r-- 1 root root 101G May 21 22:07 centos6.img |
创建桥设备,假设当前系统定义定义桥接设备为br0,并将eth0设备附加其上,操作步骤如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
[root@node1 vm] # cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE= "eth0"
BOOTPROTO=static
HWADDR= "00:0C:29:47:3E:EA"
NM_CONTROLLED= "yes"
ONBOOT= "yes"
TYPE= "Ethernet"
IPADDR=192.168.1.201
NETMASK=255.255.255.0
GATEWAY=192.168.1.253
DNS1=8.8.8.8
为bro创建配置文件 /etc/sysconfig/network-scripts/ifcfg-br0 ,其内容如下所示,需要注意的是Bridge一定要大写首字母
DEVICE= "br0"
BOOTPROTO=static
HWADDR= "00:0C:29:47:3E:EA"
NM_CONTROLLED=no
ONBOOT= "yes"
TYPE= "Bridge"
IPADDR=192.168.1.201
NETMASK=255.255.255.0
GATEWAY=192.168.1.253
DNS1=8.8.8.8
将eth0的配置文件 /etc/sysconfig/network-scripts/ifcfg-eth0 修改为如下内容
DEVICE= "eth0"
BOOTPROTO=none
HWADDR= "00:0C:29:47:3E:EA"
NM_CONTROLLED= "no"
ONBOOT= "yes"
TYPE= "Ethernet"
BRIDGE=br0
由于Xen不依赖于NetworkManager,所以需要关闭NetworkManager
[root@node1 ~] # chkconfig NetworkManager off
[root@node1 ~] # service NetworkManager stop
Stopping NetworkManager daemon: [ OK ]
[root@node1 ~] # chkconfig --list network
network 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@node1 ~] # service network restart
也可以使用brctl命令来管理桥接设备
brctl是由bridge-utils软件包提供的命令,使用前请先确保其正确安装。brctl有许多的字命令,分别用于实现添加、删除桥接设备,向桥设备附加接口等。不带任何参数的brctl命令即可显示其使用帮助。如下列出了其中的一部分
[root@node1 ~] # brctl
Usage: brctl [commands]
commands:
addbr <bridge> add bridge
delbr <bridge> delete bridge
addif <bridge> <device> add interface to bridge
delif <bridge> <device> delete interface from bridge
setageing <bridge> < time > set ageing time
setbridgeprio <bridge> <prio> set bridge priority
setfd <bridge> < time > set bridge forward delay
sethello <bridge> < time > set hello time
由上面的帮助信息所示,添加一个桥接设备只需使用命令“brctl addbr <bridge_name>”即可,比如,添加br0设备
[root@node1 ~] # brctl addbr br0
刚添加桥接设备时,由于没有为其附加任何网络接口,其尚处于未激活状态。为其附加一个网络接口设备可使用“brctl addif <bridge> <device>”,不过需要注意的是,只有在桥设备处于未激活状态时才能将其删除,而要查看桥接设备相关的信息,可以使用“brctl show”
[root@node1 ~] # brctl show
[root@node1 ~] # brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c29473eea no eth0
[root@node1 ~] # brctl stp br0 yes //放置链路回环
[root@node1 ~] # brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c29473eea yes eth0
可以使用脚本添加ip地址
|
9.启动虚拟机实例
启动DomU,还可以xm create命令或xl create但要使用xm命令,当要使用xm命令,需要实现启动Xend服务,然而,要使用xl命令,则不能启动Xend服务,我们这里仍然以xm为例
1
|
[root@node1 ~] # xm create -c /etc/xen/centos6
|
本处需要连接vnc客户端来启动xen的安装界面,命令如下
1
2
3
4
5
6
7
8
9
|
[root@node1 ~] # yum install tigervnc-server -y
[root@node1 ~] # vncserver :1
You will require a password to access your desktops. Password: Verify: 输入密码 客户端通过ip:5900+ id 号既可以登陆
|
启动安装界面
将光盘挂载至http的目录
1
2
3
4
|
[root@node1 ~] # service httpd restart
Stopping httpd: [FAILED] Starting httpd: [ OK ] [root@node1 ~] # ln -s /media/ /var/www/html/centos6
|
安装过程
当系统安装完成,应该修改centos6的配置文件,将其改为
1
2
3
4
5
6
7
8
9
10
11
|
#kernel="/root/vmlinuz"
#ramdisk="/root/initrd.img"
name= "centos6"
vcpus=1
memory=512
disk=[ 'file:/xen/vm/centos6.img,xvda,w' ]
on_crash= "destroy"
on_reboot= "destroy"
vif=[ "ip=192.168.1.221,bridge=br0" ]
vfb=[ "vnc=1,sdl=1" ]
bootloader= "/usr/bin/pygrub"
|
登陆成功
由于篇幅的问题,将在后面推出xen的高级应用
吐槽一下。这个新的编辑器,我表示真的很伤心,我感觉还是以前的好用,建议,将其改回以前
本文转自wangfeng7399 51CTO博客,原文链接:http://blog.51cto.com/wangfeng7399/1414999,如需转载请自行联系原作者