【转】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查看帮助

 

以下部分摘自 51cto.com/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的方式。


你可能感兴趣的:(技术,接口,开发,操作系统,程序)