二、主流虛擬化技術對比
Xen知識地圖:
2.2 Xen架構解析
2.2.1 Xen項目簡介
????????Xen是由劍橋大學計算機實驗室開發的一個開源項目,是一個開源的可直接運行于硬件層之上的虛擬化軟件,它屬于type-I型虛擬化系統,支持萬貫虛擬化和超虛擬化,以高性能、占用資源少著稱,贏得了IBM、AMD、HP、Red Hat和Novell等眾多世界級軟硬件廠商的高度認可和大力支持,已被國內外眾多企事業用戶用來搭建高性能的虛擬化平臺。
????????Xen僅對CPU和Memory直接接管,而其它IO硬件驅動則由其上運行的第一個虛擬機來提供支持,它能夠在計算機硬件上并發的運行多個客戶操作系統(Guest OS)。支持x86、x86-64、安騰( Itanium)、Power PC和ARM多種處理器,因此Xen可以在大量的計算設備上運行,目前Xen支持Linux、NetBSD、FreeBSD、Solaris、 Windows和其他常用的操作系統作為客戶操作系統在其管理程序上運行。
2.2.2 Xen架構設計思路總述
? ? Xen默認認為自己是直接運行于硬件層之上的虛擬化軟件(即Xen Hypervisor層),并且可以直接驅動CPU和內存,需注意CPU和內存是所有想要運行的操作系統必須能直接支持的,但Xen為保證自身的小巧,它并沒有提供虛擬機的管理接口,因此它采用了一種獨特的方式,先運行一臺特權虛擬機(即Domain 0),且這臺VM必須支持Kernel的修改,因此選擇開源的Linux做為特權VM是最合適的,這樣也可方便采用Linux所支持的方式來開發虛擬機管理接口,實現與Xen Hypervisor層直接交互來完成為VM分配CPU和內存資源及創建、刪除、停止、啟動VM的管理接口。通常這臺特權虛擬機一定會采用當前比較流行的Linux發行版,因為它能支持更多IO硬件設備,如:網卡,磁盤,顯卡,聲卡等;到目前為止,NetBSD,GNU/Linux,FreeBSD和Plan 9,OpenSolaris等系統已經支持已半虛擬化方式運行在Xen的DomU中。目前Xen已經支持x86、x86_64和ARM等平臺,并正在向IA64、PPC移植。移植到其他平臺從技術上是可行的,未來有可能會實現。
????????Xen虛擬機支持在不停止的情況下在多個物理主機之間實時遷移。在操作過程中,虛擬機在沒有停止工作的情況下內存被反復地復制到目標機器。虛擬機在最終目的地開始執行之前,會有一次60-300毫秒的非常短暫的暫停以執行最終的同步化,給人無縫遷移的感覺。類似的技術被用來暫停一臺正在運行的虛擬機到磁盤,并切換到另外一臺,第一臺虛擬機在以后可以恢復。
2.2.3 Xen邏輯架構
如上圖所示,Xen虛擬環境由三部分組件組成:
XEN Hypervisor
????????Xen Hypervisor 是介于操作系統和硬件之間的一個軟件抽象層。它負責在各個虛擬機之間進行CPU調度和內存分配。Xen Hypervisor不僅抽象出虛擬機的硬件,同時還控制著各個虛擬機的執行。Xen Hypervisor不會處理網絡、存儲設備、視頻以及其他 I/O。
Domain 0 Guest
????????Domain 0是特權域,是一個修改過的Linux kernel,是唯一運行在 Xen Hypervisor之上的虛擬機,它擁有訪問物理 I/O 資源的權限,同時和系統上運行的其他虛擬機(Domain U: PV and HVM Guest)進行交互。Domain 0需要在其它Domain啟動之前啟動。
????????Domain 0 中有兩個驅動 Network Backend Driver 和 Block Backend Driver,它們分別用來處理來自 Domain U 的網絡和本地磁盤請求。 Network Backend Driver與本地網絡硬件直接通信,以此來處理來自于Domain U所有虛擬機訪問網絡設備的請求;Block Backend Drive與本地存儲設備進行通信,以此來處理來自于Domain U的磁盤數據讀寫的請求。
Domain U Guest(Dom U)
????????Domain U沒有直接訪問物理硬件的權限(Domain U的"U"是來自于英文單詞 unprivileged,是指沒有權限的),但Domain 0有。
????????運行在 Xen Hypervisor 上的所有半虛擬化(paravirtualized)虛擬機被稱為“Domain U PV Guests”,其上運行著被修改過內核的操作系統,如 Linux、Solaris、FreeBSD 等其它 UNIX 操作系統。
????????所有的全虛擬化虛擬機被稱為“Domain U HVM Guests”,其上運行著不用修改內核的操作系統,如 Windows 等。
????????Domain U PV Guest 中也包括兩個驅動“PV Network Driver”和“PV Block Driver”,它們分別也是用來處理發送網絡和本地磁盤請求用的,這與 Domain 0 中的兩個驅動是相對應的。
2.2.4 Xen虛擬化類型
? ?? Xen對虛擬機的虛擬化分為兩大類,半虛擬化(Para virtualization)和完全虛擬化(Hardware VirtualMachine)。
2.2.4.1 半虛擬化(PV)
? ?? ? 半虛擬化(Paravirtualization)有些資料稱為“超虛擬化”,簡稱為PV,是Xen主導的虛擬化技術。這種技術允許虛擬機操作系統感知到自己運行在Xen Hypervisor上而不是直接運行在硬件上,同時也可以識別出其他運行在相同環境中的客戶虛擬機。
? ?? ? 在Xen Hypervisor上運行的半虛擬化的操作系統,為了調用系統管理程序(Xen Hypervisor),要有選擇地修改操作系統,然而卻不需要修改操作系統上運行的應用程序。由于 Xen 需要修改操作系統內核,所以您不能直接讓當前的 Linux 內核在 Xen 系統管理程序中運行,除非它已經移植到了Xen 架構。不過,如果當前系統可以使用新的已經移植到 Xen 架構的Linux 內核,那么您就可以不加修改地運行現有的系統。
2.2.4.2 完全虛擬化(HVM)
? ?? ? 完全虛擬化(Hardware Virtual Machine)又稱“硬件虛擬化”,簡稱HVM,是指運行在虛擬環境上的虛擬機在運行過程中始終感覺自己是直接運行在硬件之上的,并且感知不到在相同硬件環境下運行著其他虛擬機的虛擬技術。此種虛擬化需要借助于Intel的VT-x 或 AMD的AMD-v 等硬件輔助虛擬化技術(詳細技術原理參見1.5.1節)及Qemu的IO硬件模擬技術,才能支持GuestOS的kernel不修改,就可直接被DomU支持。
? ?? ? 在Xen Hypervisor運行的完全虛擬化虛擬機,所運行的操作系統都是標準的操作系統,即:無需任何修改的操作系統版本。同時也需要提供特殊的硬件設備。
? ?? ? 值的注意的是,在Xen上虛擬的Windows虛擬機必須采用完全虛擬化技術。
2.2.4.3 CPU完全虛擬化,IO半虛擬化(PVHVM)
? ?? ? 為了提高性能,完全虛擬化的Guests可以使用特殊的半虛擬設備驅動程序(PVHVM或PV-on-HVM驅動)。這些驅動程序在HVM環境下優化你的 PV驅動,模擬的磁盤和網絡IO旁路運行,從而讓你的PV在HVM中有更好的性能。這意味著你在用戶窗口操作方面可以得到最佳的性能。
? ?? ? 注意,Xen項目PV(半虛擬化)的Guest自動使用PV驅動,因此不需要這些驅動程序,因為你已經自動使用優化的驅動程序。PVHVM只會在HVM(全虛擬化)guest虛擬機中需要。
2.2.5 Xen基本體系架構及運行原理
2.2.5.1 Xen體系架構
? ?? ? Xen 的 VMM ( Xen Hypervisor ) 位于操作系統和硬件之間,負責為上層運行的操作系統內核提供虛擬化的硬件資源,負責管理和分配這些資源,并確保上層虛擬機(稱為域 Domain)之間的相互隔離。Xen采用混合模式,因而設定了一個特權域用以輔助Xen管理其他的域,并提供虛擬的資源服務,該特權域稱為Domain 0,而其余的域則稱為Domain U。
? ?? ? Xen向Domain提供了一個抽象層,其中包含了管理和虛擬硬件的API。Domain 0內部包含了真實的設備驅動(原生設備驅動),可直接訪問物理硬件,負責與 Xen 提供的管理 API 交互,并通過用戶模式下的管理工具來管理 Xen 的虛擬機環境。
? ?? ? Xen2.0之后,引入了分離設備驅動模式。該模式在每個用戶域中建立前端(front end)設備,在特權域(Dom0)中建立后端(back end)設備。所有的用戶域操作系統像使用普通設備一樣向前端設備發送請求,而前端設備通過IO請求描述符(IO descripror ring)和設備通道(device channel)將這些請求以及用戶域的身份信息發送到處于特權域中的后端設備。這種體系將控制信息傳遞和數據傳遞分開處理。
? ?? ? 在Xen體系結構設計中,后端設備運行的特權域被賦予一個特有的名字---隔離設備域(Isolation Device Domain, IDD),而在實際設計中,IDD 就處在Dom0中。所有的真實硬件訪問都由特權域的后端設備調用本地設備驅動 (native device driver)發起。前端設備的設計十分簡單,只需要完成數據的轉發操作,由于它們不是真實的設備驅動程序,所以也不用進行請求調度操作。而運行在IDD中的后端設備,可以利用Linux的現有設備驅動來完成硬件訪問,需要增加的只是IO請求的橋接功能---能完成任務的分發和回送。
2.2.5.2 不同虛擬技術的運行機制
1)半虛擬化技術實現原理
? ?? ? 采用半虛擬化技術的虛擬機操作系統能夠識別到自己是運行在Xen Hypervisor而非直接運行于硬件之上,并且也可以識別到在相同的機器上運行的其他虛擬機系統。而且運行的操作系統都需要進行相應的修改。
? ?? ? 半虛擬化客戶機(Domain U PV Guests)包含兩個用于操作網絡和磁盤的驅動程序,PV Network Driver 和PV Block Driver。
? ?? ? PV Network Driver負責為Domain U提供網絡訪問功能。PV Block Driver負責為Domain U提供磁盤操作功能。
2)完全虛擬化技術實現原理
? ?? ? 完全虛擬化客戶機(Domain U HVM Guests)運行的是標準版本的操作系統,因此其操作系統中不存在半虛擬化驅動程序(PV Driver),但是在每個完全虛擬化客戶機都會在Domain 0中存在一個特殊的精靈程序,稱作:Qemu-DM,Qemu-DM幫助完全虛擬化客戶機(Domain U HVM Guest)獲取網絡和磁盤的訪問操作。
? ?? ? 完全虛擬化客戶機必須和在普通硬件環境下一樣進行初始化,所以需要在其中加入一個特殊的軟件Xen virtual firmware,來模擬操作系統啟動時所需要的BIOS。
2.2.5.3 Domain 管理和控制
? ?? ? 開源社區中將一系列的Linux精靈程序分類為“管理”和“控制”兩大類。這些服務支撐著整個虛擬環境的管理和控制操作,并且存在于Domain 0虛擬機中。
? ?? ? 下面將對直接服務進行詳細的描述。
? ?? ? 注:為了清晰的描述Xen的運行流程,畫圖時將精靈程序放在Domain 0外部來描述,但事實上所有精靈程序都存在于Domain 0 之中。
1)Xend
? ?? ? Xend精靈線程是一個Python應用程序,它作為Xen環境的系統管理員。它利用Libxenctrl類庫向Xen Hypervisor發出請求。
? ?? ? 所有Xend處理的請求都是由XM工具使用XML RPC接口發送過來的。
2)Xm
? ?? ? 用于將用戶輸入通過XML RPC接口傳遞到Xend中的命令行工具。
3)Xenstored
? ?? ? Xenstored精靈程序用于維護注冊信息,這些信息包括內存和在連接Domain 0和所有其他Domain U之間的事件通道。Domain 0虛擬機利用這些注冊信息來與系統中其他虛擬機建立設備通道,即幫助Domain U虛擬機訪問硬件資源。
4)Libxenctrl
? ?? ? Libxenctrl是C程序類庫,用于讓Xend具有通過Domain 0與Xen Hypervisor進行交互的能力。在Domain 0中存在一個特殊的驅動程序稱作privcmd,它將請求發送給Hypervisor。
5)Qemu-DM
? ?? ? 在Xen環境下,每個完全虛擬化虛擬機都需要擁有自己的Qemu精靈程序。Qemu-DM處理在Xen環境下完全虛擬化客戶機所能允許執行的所有關于網絡 和磁盤請求和操作。Qemu程序必須存在于Hypervisor之外同時又需要訪問網絡和I/O,所以Qemu-DM必須存在于Domain 0 中(參見前面章節對Domain 0 的描述)。
? ?? ? 未來版本的Xen中,一種新的工具Stub-DM將會提供一系列對所有完全虛擬化客戶機都可用的服務,以此來替代需要在每個虛擬機上都生成一個Qemu的邏輯。
6)Xen Virtual Firmware
? ?? ? Xen Virtual Firmware是被嵌入到所有完全虛擬化客戶機中的虛擬BIOS系統,來確保所有客戶操作系統在正常啟動操作中接收到標準的啟動指令集并提供標準的軟件兼容環境。
2.2.5.4 半虛擬化環境下Domain 0與Domain U通信
? ?? ? 根據前幾章節所述,Xen Hypervisor不負責處理網絡和磁盤請求,因此半虛擬化客戶機(Domain U PV)必須通過Domain 0 與Xen Hypervisor進行通信,從而完成網絡和磁盤的操作請求。下面以半虛擬化客戶機(Domain U PV)執行向本地磁盤寫入數據為例描述Domain 0與Domain U PV的交互過程。
? ?? ? 半虛擬化客戶機(Domain U PV)的PV Block Driver接收到要向本地磁盤寫入數據的請求,然后通過Xen Hypervisor將與Domain 0共享的本地內存中的數據寫入到本地磁盤中。在Domain 0 和半虛擬化Domain U之間存在事件通道,這個通道允許它們之間通過存在于Xen Hypervisor內的異步中斷來進行通信。Domain 0將會接收到一個來自于Xen Hypervisor的系統中斷,并觸發Domain 0中的Block Backend驅動程序去訪問本地系統內容,并從與半虛擬化客戶機的共享內存中讀取適合的數據塊。從共享內存中讀取的數據隨后被寫入到本地磁盤的指定位置中。
? ?? 上圖中所顯示的事件通道是直接連接Domain 0 和Domain U PV是為了清晰和簡單的描述系統是如何運行的。但事實上,事件通道(Event Channel)運行于Xen Hypervisor中,并在Xenstored中注冊特定的系統中斷,以此來讓Domain 0 和Domain U PV能夠通過本地內存快速的共享信息。
2.2.6 Xen對CPU/內存/IO虛擬化的實現思路
2.2.6.1 Xen對CPU和內存的虛擬化過程
Xen在給VM提供CPU的虛擬化時,它采用的也是在Xen hypervisor層啟動一個線程,并將這些線程映射到某個物理核心上,當然通過DomU的配置文件中的cpus可以指定將這些模擬CPU的線程綁定到某幾個物理核心上;而內存的虛擬化則是內存頁的映射,將物理內存上多個連續或不連續的內存頁映射給VM,讓VM看來這就是一個完整的連續的內存空間。
2.2.6.2 Xen對IO設備的虛擬化過程
當啟動一個用戶VM(DomU)時,該VM所需的CPU和內存都由Xen Hypervisor提供,而它若需要使用IO設備時,則向特權VM(即Dom0)發起請求,特權VM會為該用戶VM創建一個模擬的硬件設備線程,并運行于特權VM的用戶空間,當用戶VM向該IO硬件發起調用時,特權VM上相應的模擬設備接收請求并將其轉化為特權VM對IO硬件的操作,交給特權VM的內核來代為完成其操作。這里需注意這些虛擬IO硬件需要由Qemu來模擬,Xen本身并沒有提供相應的模擬功能。(注:特權VM的CPU和內存也是有Xen Hypervisor提供)
1)Qemu模擬IO設備(完全虛擬化方式)
Qemu模擬IO設備(完全虛擬化方式):假如用戶VM向特權VM請求磁盤,特權VM可以將一個分區、文件等,通過Qemu將其模擬成一個磁盤設備,就拿文件來說,特權VM先創建一個映像文件,再通過Qemu為該文件模擬一個磁盤控制器芯片;然后,將其映射到用戶VM上,當然模擬的這個磁盤控制器芯片一定是一個最常見的,用戶VM的Kernel一定支持的,但需注意:模擬的磁盤可能會與實際的物理磁盤不同,因為要盡可能兼容。這樣一來用戶VM假如要寫數據到磁盤的過程如下:
用戶VM-APP--->用戶VM-Kernel調用虛擬磁盤的驅動進行寫數據前的準備(如:數據寫入到磁盤中的扇區位置/數據編碼等)--->
用戶VM-Kernel將編碼后的信息發給特權VM的模擬磁盤進程--->
特權VM的模擬磁盤進程再將編號信息還原后發給特權VM-kernel--->
特權VM-kernel調用真實物理磁盤的驅動對數據進行寫前準備--->最后磁盤驅動調度磁盤完成寫入
摘錄補充:(http://my.oschina.net/davehe/blog/94039?fromerr=mOuCyx6W)
????????Xen向Domain提供了一個抽象層,其中包含了管理和虛擬硬件的API。Domain 0內部包含了真實的設備驅動(原生設備驅動),可直接訪問物理硬件,Xen?提供的管理?API?可與其交互,并通過用戶模式下的管理工具(如:xm/xend、xl等)來管理?Xen?的虛擬機環境。
2)半虛擬化IO設備
????????半虛擬化的IO設備:它與模擬最大不同是DomU知道自己是運行在虛擬化環境中的,并且知道這個磁盤不是真正的磁盤,它只是Xen模擬的一個磁盤前端驅動(Disk Frontend),它要寫數據時,直接將數據交給Disk Frontend,而不再去調用磁盤驅動進行數據編碼,當特權VM端的Disk backend收到來自DomU的數據時,也是直接轉給特權VM-Kernel,由其直接調用物理磁盤驅動來對這些原始數據進行處理并寫入磁盤。
摘錄補充:(http://my.oschina.net/davehe/blog/94039?fromerr=mOuCyx6W)
Xen2.0之后,引入了分離設備驅動模式。該模式在每個用戶域中建立前端(front end)設備,在特權域(Dom0)中建立后端(back end)設備。所有的用戶域操作系統像使用普通設備一樣向前端設備發送請求,而前端設備通過IO請求描述符(IO descripror ring)和設備通道(device channel)將這些請求以及用戶域的身份信息發送到處于特權域中的后端設備。這種體系將控制信息傳遞和數據傳遞分開處理(類似云計算中常說的控制面與數據面分離設計)。
半虛擬化客戶機(Domain U PV)的PV Block Driver接收到要向本地磁盤寫入數據的請求,然后通過Xen Hypervisor將自己與Domain 0共享的本地內存中的數據寫入到本地磁盤中。在Domain 0?和半虛擬化Domain U之間存在事件通道,這個通道允許它們之間通過存在于Xen Hypervisor內的異步中斷來進行通信。Domain 0將會接收到一個來自于Xen Hypervisor的系統中斷,并觸發Domain 0中的Block Backend驅動程序去訪問本地系統內容,并從自己與半虛擬化客戶機的共享內存中讀取適合的數據塊后,隨即被寫入到本地磁盤的指定位置中。
? ? 但無論采用模擬或半虛擬化最終都是對物理磁盤的操作,假如當前只有一個物理磁盤,眾多用戶VM都在進行大量的讀寫請求,此時,為了避免用戶VM無限制的向特權VM發起請求,特權VM中采用一個環狀緩存區,每到一個IO請求,就先將其塞入這個環狀緩沖區的槽位中,若緩沖區滿了,就會告訴用戶VM IO設備繁忙。當然其它各種IO設備大致都采用這種機制來控制。
2.2.7 Xen的網絡架構
2.2.7.1 Xen支持三種網絡工作模式
????????在虛擬化環境中虛擬網絡是十分重要但又比較難,需要特別注意;
在Linux中實現虛擬網絡的方法中比較常用的工具有兩個:bridge-utils 和 openvswitch,它們創建的虛擬網絡設備是不能相互使用的,比如:bridge-utils創建的橋設備,openvswitch是無法識別的。
用下圖來做簡單說明:
1)Bridge模式
Xend啟動時流程:
1、創建虛擬網橋 xenbr0;
2、停止物理網卡 eth0;
3、物理網卡 eth0 的 MAC 地址和 IP 地址被復制到虛擬網卡 veth0;
4、物理網卡 eth0 重命名為 peth0;
5、Veth0 重命名為 eth0;
6、Peth0 的 MAC 地址更改( FE:FF:FF:FF:FF:FF ),ARP 功能關閉;
7、連接 peth0、vif0.0 到網橋 xenbr0
8、啟動 peth0、vif0.0、xenbr0
Domain U 啟動時的流程:
1、vif<domainID>.0 連接到 xenbr0
2、啟動vif<domainID>.0
2)Route 模式
Xend啟動時的流程:
1、開啟Domain 0的IP Forward。
Domain U啟動時的流程:
1、創建 vif<domainID>.0 ,dom U eth0的IP地址被拷貝到vif<domainID>。
2、啟動 vif<domainID>.0。
3、為domU的配置文件中指向虛擬接口vif.0分配的IP地址增加靜態路由。
3)NAT模式
NAT 模式會使用虛擬局域網 virbr0
2.2.7.2 Xen Domain U Guests 發送數據包處理流程
2.2.7.3 Xen中虛擬網卡與物理網卡之間的關系
? ? 安裝了Xen的Linux機器,在Dom 0中能看到以下幾類網卡(網絡接口設備 ):
(X ,Y都為數字)
pethY
ethY
xenbrY
virbrY
vifX.Y(X為DomaiID,Y表示該虛擬網卡是該Domain的第幾塊虛擬網卡)
vethY (一般在Xend啟動完成以后就不存在了)
2.2.8 Xen的工具棧
xend : 這是Xen Hypervisor的Dom0上運行的服務,此服務用來監控xm命令發來的指令,并完成相應的動作。
xm : Xen Management,用來管理VM的創建、刪除、啟動、快照、刪除、停止等的管理工具。
xl : 這是一個基于libxenlight庫的一個輕量級VM管理工具,它從Xen4.1開始出現,從4.3以后,它被作為主要的VM管理工具,而xm這個重量級管理工具開始被提示廢棄.以下為xm、xl的對比圖:
? ? xl 和 xm都需要調用libxenlight,但xl不需要運行任何服務,它可直接調用libxenlight完成相關操作。
xe/XAPI,是xend的一個API管理接口,通常用于Xen Cloud環境中:Xen Server, XCP
virsh/ libvirt : 這是Redhat發起開發的一套用于管理眾多不同類別的VM的管理工具。
virsh : 這是一個命令行工具
libvirt: 則是一個lib庫, libvirtd守護進程用于監聽virsh命令操作,并調用lbvirt完成相關操作.
2.2.9 Xen發展歷程
2.2.9.1 Xen版本發布簡史
10年4月Xen4.0.0發布,改進后Xen的DomU最大可支持虛擬CPU 64顆,Xen主機可支持1TB內存和128顆物理CPU,磁盤可支持快照和克隆;HVM客戶機支持虛擬內存頁共享;
11年4月發布的Xen4.1版后,xm/xend開始被提示廢棄,xl這個更輕量級的Xen VM管理工具逐漸成為主流。
15年為止已經發布Xen4.5版本,目前yum源可用的最新版Xen是4.6.1版的(http://mirrors.skyshe.cn/centos/6.7/virt/x86_64/xen-46/)。
2.2.9.2 Linux Kernel對Xen的支持
Linux2.6.37:kernel開始對Xen進行支持,并加其加入到Kernel中。
Linux3.0:Kernel開始對Xen的關鍵部分進行優化。
RHEL對Xen的支持概況:
Redhat系列對Xen的支持情況:
RHEL5.7 ~ 及以前版本:默認的企業虛擬化技術為Xen。
但Redhat提供了兩種內核:
kernel-... :這是僅允許RHEL系統的內核,不能運行在DomU中。
kernel-xen.. :這是需要部署XenServer時,使用的Kernel版本。
RHEL6 ~ 及以后版本:默認支持KVM(收購自以色列的一款虛擬化工具),并且不在對Xen做任何支持,但允許自己運行在DomU中。
參考鏈接
Linux內核態、用戶態簡介與IntelCPU特權級別--Ring0-3_weixin_30784501的博客-CSDN博客
云計算技術 — 云計算技術發展編年史_煙云的計算-CSDN博客_云計算編年史