【转】Xen全虚拟化和半虚拟化
转自:http://blog.csdn.net/hp_2008/article/details/7619980
PV(Para-Vritralization)和FV(Full-Vritralization)的差别,主要以guest OS的硬件仿真程度做区分。
FV:FV是一般较常看到的作法,所有的guest
OS完全不会看到实际的硬件为何,只能使用由Supervisor所提供的所有虚拟硬件,因此,在这种机制下,guest
OS动作的性能一定会大受虚拟接口的影响。另外还有一个特点,就是因为完全仿真的关系,不支持新的技术,连ACPI开关机的机制都无法使用,也就是当使用
者在FV的guest OS下,若直接触动关机的按钮(这里的按钮是由VMM所提供的,不是主机上的)会直接断电,而不会进行关机程序。
PV:至于PV的作法,有鉴于一般Virtual
Machine工具都是以完全仿真的方式,造成性能上的降低,因此,XEN在设计上,希望各操作系统可以在开发时就已经将XEN的技术包括进去,这样在使
用时,就可以用局部仿真的方式,让操作系统可以直接使用到硬件中的CPU、内存等,而不需要通过XEN做仿真的操作。
这样,若硬件都是由Virtual Machine仿真出来的,性能自然会变得比较慢,所以XEN所主推的概念就是,当操作系统默认支持XEN时就可以通过XEN的机制,直接使用到底层的硬件,而不是每个OS都要通过Hypervisor的接口,性能上就可大为提高。
在PV与FV的安装上,对CPU的要求是有差异的。以PV而言,因为OS原本就支持XEN,所以不需要经过特殊的处理步骤,因此,对CPU来于,没有特殊的要求,基本上都可以使用。
但FV就不同,因为FV模式是以完全仿真的方式进行,所以CPU必须要特别将此功能加入到CPU的核心中,因此,CPU是有特殊需求的。在Intel与AMD中针对Virtual Machine所加入的功能名称不同,分别为Intel VT与AMD-V。
在目前Linux的世界,XEN并不是唯一的,除了XEN这一架构外,另外还有一个KVM(Kernel based Vitrual
Machine),从2.6.20版本之后的Linux
Kernel就支持其功能。因为KVM的做法是以原本Kernel为依据,只要将其module加载即可使用,唯一较XEN弱势的是KVM以单一Full
Virtuallization为服务方式。
一、Xen是一款虚拟化软件,支持半虚拟化和完全虚拟化。它在不支持VT技术的cpu上也能使用,但是只能以半虚拟化模式运行。
二、半虚拟化的意思是需要修改被虚拟系统的内核,以实现系统能被完美的虚拟在Xen上面。完全虚拟化则是不需要修改系统内核则可以直接运行在Xen上面。
三、VMware是一款完全虚拟化软件。完全虚拟的弱点是效率不如半虚拟化的高。半虚拟化系统性能可以接近在裸机上的性能。
四、
Xen是由一个后台守护进程维护的,叫做xend,要运行虚拟系统,必须先将它开启。它的配置文件在/etc/xen/xend-config.sxp,
内容包括宿主系统的类型,网络的连接结构、宿主操作系统的资源使用设定,以及vnc连接的一些内容。(如果你想增加一个虚拟网络设备的话,是需要在这里设
定的)
五、/etc/xen/auto 的含义是如果你想让被虚拟系统随着宿主系统一同启动的话,就把虚拟系统的配置文件放到这个目录下面来。
六、/etc/xen/scripts 是些脚本文件,用于初始化各种虚拟设备,比如虚拟网桥等。(如果要增加一个虚拟网络设备,同样需要在此处调节)
七、在/etc/xen下面会有些配置文件,这就是虚拟系统引导时所必须的些文件,里面记录了引导和硬件信息。
八、Xen的配置工具有许多,我使用的是virt-manager(GUI)、virt-install和xm。第一个用于管理和安装系统,第二个只用于安装系统,第三个用于启动系统。
九、安装半虚拟Linux有两种方法,一种是利用Linux的网络安装方式安装,http、ftp、nfs方式都是可以的(特别注意:半虚拟环境下安装
Linux是不支持本地光驱或者iso镜像安装的!),并且RHEL5会自动生成配置文件。第二种是先建立镜像文件,并格式化,然后挂载到本地文件系统上
来,将虚拟系统需要用到的文件拷贝进去并修改,然后手工创建配置文件并启动。
十、虚拟网络设备有三种模式:bridge桥模式、router路由模式和nat模式。其中桥模式是默认模式,在这种模式下,虚拟系统和宿主系统被认为是并列的关系,虚拟系统被配置IP或者dhcp后即可联通网络。
十一、原来的iptables无法对桥模式下的数据包做处理,RHEL5的iptables中增加了一个physdev的模块,可用iptables -m physdev -h查看帮助
以下部分摘自 http://www.net527.cn/a/Ciscomoniqi/Ciscomoniqiruanjian/2012/1110/25026.html
于是,我比较了一下两者之间的配置文件:
CentOS5——非完全方式虚拟机:
--------------------------------------------------------------------
[root@KCXEN xen]# cat kcentos5
# Automatically generated xen config file
name = "kcentos5"
memory = "512"
disk = [ 'tap:aio:/opt/xen/kcentos5/kcentos5_master.img,xvda,w', 'tap:aio:/opt/xen/kcentos5/kcentos5_slave.img,xvdb,w', ]
vif = [ 'mac=00:16:3e:11:b6:ec, bridge=xenbr0', ]
uuid = "734f2dbb-934e-ba83-d45d-ef656ecfbefc"
bootloader="/usr/bin/pygrub"
(可以发现非完全方式的虚拟机,都会有一个bootloader的配置项。后面指定了宿主机下/usr/bin/pygrub这个路径的启动脚本)
vcpus=1
on_reboot = 'restart'
on_crash = 'restart'
--------------------------------------------------------------------
Windows2003——HVM方式虚拟机
--------------------------------------------------------------------
[root@KCXEN xen]# cat kcwin2k3
# Automatically generated xen config file
import os, re
arch = os.uname()[4]
if re.search('64', arch):
arch_libdir = 'lib64'
else:
arch_libdir = 'lib'
name = "kcwin2k3"
builder = "hvm"
memory = "1024"
disk = [ 'file:/opt/xen/kcwin2k3/disk1.img,hda,w', 'file:/opt/xen/kcwin2k3/disk2.img,hdb,w','file:/opt/xen/kcwin2k3/disk3.img,hdc,w','file:/iso/win2k3.iso,hdd:cdrom,r', ]
vif = [ 'type=ioemu, mac=00:16:3e:40:16:60, bridge=xenbr0', ]
uuid = "25a47c57-294d-0a5d-6a1e-cedb09570b33"
device_model = "/usr/lib/xen/bin/qemu-dm"
kernel = "/usr/lib/xen/boot/hvmloader"
(可以发现HVM方式的虚拟机,都有一个Kernel的配置项。后面指定了HVM方式的虚拟机都是由/usr/lib/xen/boot/hvmloader这个引导器引导起来的)
vnc=1
vncunused=1
vncdisplay=1
vnclisten='0.0.0.0'
apic=0
acpi=0
pae=1
boot="c"
vcpus=1
serial = "pty" # enable serial console
on_reboot = 'restart'
on_crash = 'restart'
------------------------------------------------------------------
然后找一下/usr/lib/xen/boot/hvmloader这个引导器,原来是一个编译过的2进制执行程序。而/usr/bin/pygrub则是一个启动脚本。比较长,我摘录其中一段比较关键的地方贴出来看:
-----------------------------------------------------------
......
......
# open the image and read the grub config fs = None for fstype in grub.fsys.fstypes.values(): if fstype.sniff_magic(fn, offset): fs = fstype.open_fs(fn, offset) break if fs is not None: grubfile = None for f in ("/boot/grub/menu.lst", "/boot/grub/grub.conf", "/grub/menu.lst", "/grub/grub.conf"): if fs.file_exist(f): grubfile = f break if grubfile is None: raise RuntimeError, "we couldn't find grub config file in the image provided." f = fs.open_file(grubfile)
......
......
---------------------------------------------------------
所 以,很明显的。问题就有答案了,还记得我们在安装XEN的时候需要安装什么吗?对了,要安装一个叫Kernel-xen的包。里面提供了支持XEN的系统 内核。安装完了之后还记得我们还要做什么工作吗?对了,就是检查修改/boot/grub/grub.conf引导文件,指定系统启动使用XEN功能内核 并从这个XEN内核启动。
非完全XEN虚拟机,之所以我这么称呼它,是因为它的确不是一个完全体。从上面给出的非完全虚拟机的 bootloader可以看出,非完全虚拟机的内核引导启动,其实都是依靠宿主机的内核,并且和宿主机的内核相关。换句话说,就是非完全XEN虚拟机必须 依赖宿主机,脱离宿主机,就算移植到其他宿主机上去的时候,也必须要看新宿主机“内核的脸色”,因此,非完全XEN虚拟机就是并非一个完全的虚拟机,它依 赖宿主机,他几乎不能脱离宿主机。
CentOS4和Windows2003的情况在这里就有一个共同点了:他们的内核都与宿主机的 CentOS5系统的内核镜像是不同的,所以如果使用一般的非完全的XEN虚拟机方式安装的话,行不通简直就是理所应当的事情了。也所以,安装 Windows2003的时候要选择HVM方式的XEN虚拟机安装。相比之下,HVM不完全依赖宿主机的内核,它使用的是XEN软件提供的一个内核引导 器,引导他们自己的内核。这也解释了安装Windows2003的时候为什么必须要使用HVM方式,也告诉了我,在CentOS5的宿主机上要是你想安装 CentOS4的时候,也应当使用HVM的方式。