首页 > 代码库 > xen实现虚拟化(一)
xen实现虚拟化(一)
一、Xen简介
Xen采用ICA协议,通过一种叫做准虚拟化的技术获得高性能,甚至在某些与传统虚拟技术极度不友好的架构上(x86),Xen也有上佳的表现。与那些传统通过软件模拟实现硬件的虚拟机不同,在Inter VT-X支持下3.0版本之前的Xen需要系统的来宾权限,用来和Xen API进行连接。到目前为止,这种技术已经可以运用在NetBSD,GUN/Linux,FreeBSD和Plan 9系统上。Sun微系统公司也在积极的将Solaris移植到Xen平台之上。
Xen虚拟机可以在不停止的情况在多个物理主机之间实时迁移。在操作过程中,无你几在没有停止工作的情况下内存被反复的复制到目标机器。虚拟机在最终目的的开始执行之前,会有一次60-300毫秒的非常断在的暂停以执行最终的同步化,给人无缝迁移的感觉。类似的技术被用来暂停一台正在运行的虚拟机到磁盘,并切换到另外一台,第一台虚拟机在以后可以恢复。
Xen 是一个基于X86架构、发展最快、性能最稳定、占用资源最少的开源虚拟化技术。Xen可以在一套物理硬件上安全的执行多个虚拟机,与Linux是一个完美的开源组合,SUSE 最先采用了XEN虚拟机技术。它特别适用于服务器应用整合,可有效节省运营成本,提高设备利用率,最大化利用数据中心的IT基础架构。
Xen是英国剑桥大学计算机实验室开发的一个虚拟化开源项目,XEN 可以在一套物理硬件上安全的执行多个虚拟机,它和操作平台结合的极为密切,占用的资源最少。编写文档时稳定版本为XEN3.0.支持万贯虚拟化和超虚拟化。以高性能、占用资源少著称,赢得了IBM、AMD、HP、Red Hat和Novell等众多世界级硬件厂商的高度认可和大力支持,已被国内外众多企事业单位用于来搭建高性能的虚拟化平台。
Xen 开源的虚拟监视器(VMM),属于Type-I类型,即半虚拟化类型,xen代码直接运行在硬件平台上,在单个物理节点上能支持多达128个虚拟机
二、半虚拟化架构的xen
Xen通过一种叫做半虚拟化的技术获得高效的表现(较少的效能损失,典型的情况下大约损失2%,在最早的情况下会有8%的效能耗损,与其它使用完全的虚拟化却造成最高到20%损耗的其他解决方案形成一个明显的对比),设置在某些与传统虚拟化技术极度不友好的的架构(x86),Xen也有极佳的表现。
半虚拟化架构图
组成组件:①xen只能虚拟化CPU,虚拟化Memory,虚拟化MMU ------装在物理设备之上 ②Dom0 ,特权域,安装上xen的时候第一个安装的虚拟机;拥有一切能够访问底层硬件的接口 ③DomU ,用户域,没有特权 , xen环境中用域来定义每一个虚拟机,每一个域一个ID Dom0(特权与) 运行在 hypervesior 之上的一个特殊虚拟机,其内核为特殊修改过的linux内核,能够访问IO资源,却无法访问CPU; DomU(非特权域) DomU中的虚拟机针对CPU、Memory、请求中断等都直接经过 xen hypervisor,而针对IO设备的使用则需要经过Dom0
详细细节参考下图
三、Xen的使用方法
1、xen hypervisor的实现
硬件之上---->安装linux---->安装xen----->修改grub配置文件,配置其内核为xen,而不再需要使用原linux的内核(linux内核和initramfs文件被当作xen模块)使其能够运行于Dom0上-->重新重启系统
2、DomU上虚拟机的安装实现
在Dom0使用工具创建虚拟机--->启动虚拟机--->安装虚拟机操作系统
3、工具栈
xm/xend xl
红帽研发的libvirt:virtsh/libvirtd 、virt-manager、virt-install
四、创建Xen PV模式虚拟机的前提
在PV模式中运行guest系统,需要满足几个基本前提。 1、 能运行于Xen DomU的(Xen-enabled)内核:Liunx 2.6.24及以后的内核已经添加了对Xen DomU的支持,因此,只要在内核编译时启用了相应的功能就能满足此要求,目前多数Linux发行版的内核都已经支持此特性;而此前的版本需要内核在编译前手动打补丁方可; 2、根文件系统(Root Filesystem):包含了应用程序、系统组件及配置文件等运行DomU的各种所需要文件的文件系统,其不用非得包含内核及对应的ramdisk,后面的这些组件放在Dom0中即可;事实上,用于DomU的内核文件必须要能够允许Dom0访问到,因为其运行时需要与Xen Hypervisor通信,因此,这些内核组件可以位于Dom0能够访问到的任何文件系统上;然而,目前基于pygrub(可用于Dom0跟非特权域磁盘映像中的内核通信),此内核文件也可以直接放置于非特权域的磁盘映像中; 3、DomU内核所需要的内核模块:内核模块是内核的重要组成部分,它们一般存储于根文件系统; ramdisk或者ramfs:这个根据实际需要是个可选组件,如果在内核初始化过程中不需要依赖于此来装载额外的驱动程序以访问根文件系统则也可以不用提供; swap设备:交换分区能够让Linux运行比仅有物理内存时更多的进程,因此,提供此组件是常见的做法;当然,它是可选的; 4、DomU配置文件:集中在一起指定前述各组件的配置信息,以及定义其它有关PV DomU的基本属性的文件;其通常包含所有用于当前DomU属性配置参数,包括为其指定磁盘映像和内核文件的位置(或pygrub的位置)等,以及其它许多属性如当前DomU可以访问的设备等,这些设备包括网络设备、硬盘、显卡及其它PCI设备;同时,配置文件中也可以指定新创建的非特权域可以使用的物理内存大小及虚拟CPU个数等等; 这里需要提醒的是,如果计划为PV DomU编译内核,需要以与传统方式不同的方式放置内核及其模块。前面也已经提到,内核一般会放在Dom0的某路径下,而内核模块则需要放在DomU的根文件系统上。 PV DomU的根文件系统可以以多种不同的方式进行安置,比如: 虚拟磁盘映像文件 Dom0没有使用的额外物理磁盘分区 Dom0没有使用的逻辑卷 块级别网络文件系统,如iSCSI设备 网络文件系统,如NFS
五、DomU虚拟机实例配置文件
配置文件存放目录/etc/xen/
kernel:为当前域指定可用于DomU的内核文件; ramdisk:与kernel指定的内核文件匹配使用的ramdisk映像文件,根据需要指定,此为可选项; name:当前域的独有名称;每个域必须使用全局惟一的名称,否则将产生错误; memory:当前域的可用物理内存空间大小,单位为MB,默认为128; 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:传递给内核的额外参数,其中selinux=0表示禁用selinux,init则用于指定init程序的路径;多个参数之间使用空格隔开; on_reboot:执行xm reboot命令或在当前域内部执行重启操作时由Xen执行的动作;其常用的值为destroy和restart; on_crash:当前域由于各种原因崩溃时由Xen执行的动作;其常用的值为destro、restart和preservey,preserve可以保存系统崩溃前的状态信息以用于调试; on_shutdown:执行xm shutdown命令或在当前域内部执行关机操作时由Xen执行的动作; vif : vif = [‘ip="172.16.100.11",bridge=br0‘] type : 设备类型,默认为netfront mac : 指定mac地址 bridge: 指定桥接到的物理设备 ip : ip地址; script : 配置此接口的脚本文件 vifname : 后端设备名称 bootloader : 引导器文件的路径,一般指得PyGrub的路径;一般在Dom0的某个目录上
六、Xen虚拟机状态
r:running,当前跑在哪个CPU上
b:阻塞
p:暂停
s:停止
c:崩溃
d:dyiing,正在关闭的过程中
七、配置虚拟机实例
我们使用Centos6.5-x86_64版本的linux系统
下载xen安装包存放于/root目录下
kernel-xen-release-6-4.noarch.rpm kernel-xen-3.7.4-1.el6xen.x86_64.rpm kernel-xen-devel-3.7.4-1.el6xen.x86_64.rpm kernel-xen-firmware-3.7.4-1.el6xen.x86_64.rpm xen-4.1.3-2.el6.x86_64.rpm xen-licenses-4.1.3-2.el6.x86_64.rpm xen-runtime-4.1.3-2.el6.x86_64.rpm xen-libs-4.1.3-2.el6.x86_64.rpm xen-hypervisor-4.1.3-2.el6.x86_64.rpm
1、安装xen
# yum -y install *.rpm
2、编辑grub引导文件
#vim /etc/grub.conf
default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (3.7.4-1.el6xen.x86_64) kernel /xen.gz dom0_mem=1024M cpufreq=xen dom0_max_vcpus=2 dom0_vcpus_pin root (hd0,0) module /vmlinuz-3.7.4-1.el6xen.x86_64 ro root=UUID=4516b2fb-0553-4f53-88bc-19c53031a4be rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet module /initramfs-3.7.4-1.el6xen.x86_64.img
3、重启系统,默认进入xen内核
# shutdown -r now
登录
#uname -r
3.7.4-1.el6xen.x86_64
4、创建虚拟机实例
# cd /etc/xen # vim centos6 kernel="/root/vmlinuz" ramdisk="/root/initrd.img" name="centos6" vcpus=2 memory=512 disk=[‘file:/xen/vm1/centos6.qcow2,xvda,w‘] vif=[‘bridge=br0‘] on_reboot="destroy"
5、提供kernel和initrd.img文件存放于/root目录下
# cd /root kernel和initrd.img可以从光盘镜像文件中获取 # mount /dev/cdrom /mnt # cd /mnt # cp kernel initrd.img /root
6、创建稀疏格式的虚拟磁盘镜像文件,使用qemu-img
# mkdir -pv /xen/vm1 # qemu-img create -f qcow2 -o size=120G,preallocation=metadata /xen/vm1/centos6.qcow2
7、创建桥设备br0,将其中的eth0接口桥到br0上
# brctl addbr br0 # ifconfig eth0 0 up # brctl addif br0 eth0 # ifconfig br0 172.16.13.3/16 up # route add default gw 172.16.0.1 # brctl stp br0 on # brctl show
8、创建虚拟机
# cd /etc/xen # xm create centos6 # xm list Name ID Mem VCPUs State Time(s) Domain-0 0 1014 2 r----- 53.0 centos6 1 2048 2 -b---- 10.6 # xm destroy centos6 关闭域名为centos6的虚拟机电源
9、虚拟机安装操作系统
# cd /etc/xen # xm create -c centos6
等待系统安装完成并重启,注意此处的重启为关闭虚拟机,因为我们在虚拟机实例配置文件
中使用了on_reboot="destroy" ,一旦重启就关闭电源
10、再次修改虚拟机实例文件
# cd /etc/xen # vim centos6 # kernel="/root/vmlinuz" 注释这一行 # ramdisk="/root/initrd.img" 注释这一行 bootloader="/usr/bin/pygrub" 添加这一行 name="centos6" vcpus=2 memory=512 disk=[‘file:/xen/vm1/centos6.qcow2,xvda,w‘] vif=[‘bridge=br0‘] on_reboot="destroy" 重新连入控制台 # create console centos6
登录系统后,查看一些信息
至此,使用xen创建一个centos6.5虚拟机实例已经成功实现!
PS:该篇只做xen的基础介绍与如何在xen的半虚拟化平台创建虚拟机,关于xen的更多更高级的使用下期推出,51改版的如此犀利~~
本文出自 “西风瘦猪” 博客,请务必保留此出处http://jungege.blog.51cto.com/4102814/1416760