【轉】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的方式。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章