一、简介

    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来安装    

[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

[root@node1 ~]# yum install xen kernel-3.4.68 kernel-firmware-3.4.68 -y

    说明:经过多方测试,官方提供的最新版本的kernel无法在vmware中使用,故本处使用的版本为3.4.68    

    3.修改系统启动文件

default=0
timeout=5
splashp_w_picpath=(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

    重启系统,检查响应的参数是否与我们配置的相同

[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的配置文件        

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文件

[root@node1 ~]# mount /dev/cdrom1 /media/
[root@node1 ~]# cp /media/isolinux/vmlinuz /root/.
[root@node1 ~]# cp /media/isolinux/initrd.img /root/.

    准备文件系统

[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设备附加其上,操作步骤如下

[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为例

    [root@node1 ~]# xm create -c /etc/xen/centos6

    本处需要连接vnc客户端来启动xen的安装界面,命令如下

[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号既可以登陆

    启动安装界面

虚拟化软件Xen的简单应用_Xen 虚拟化  云平台  半虚拟化



























    将光盘挂载至http的目录

[root@node1 ~]# service httpd restart
Stopping httpd:                                            [FAILED]
Starting httpd:                                            [  OK  ]
[root@node1 ~]# ln -s /media/ /var/www/html/centos6

    安装过程

虚拟化软件Xen的简单应用_Xen 虚拟化  云平台  半虚拟化_02    当系统安装完成,应该修改centos6的配置文件,将其改为

    #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的简单应用_Xen 虚拟化  云平台  半虚拟化_03

    由于篇幅的问题,将在后面推出xen的高级应用

    吐槽一下。这个新的编辑器,我表示真的很伤心,我感觉还是以前的好用,建议,将其改回以前