1 Xen概述
1.1 簡介
Xen是由劍橋大學計算機實驗室開發的一個開源項目。是一個直接運行在計算機硬件之上的用以替代操作系統的軟件層,它能夠在計算機硬件上併發的運行多個客戶操作系統(Guest OS)。目前已經在開源社區中得到了極大的推動。
Xen支持x86、x86-64、安騰( Itanium)、Power PC和ARM多種處理器,因此Xen可以在大量的計算設備上運行,目前Xen支持Linux、NetBSD、FreeBSD、Solaris、Windows和其他常用的操作系統作爲客戶操作系統在其管理程序上運行。
1.2 Xen虛擬化類型
Xen對虛擬機的虛擬化分爲兩大類,半虛擬化(Paravirtualization)和完全虛擬化(Hardware VirtualMachine)。
1.2.1 半虛擬化
半虛擬化(Paravirtualization)有些資料稱爲“超虛擬化”,簡稱爲PV,是Xen主導的虛擬化技術。這種技術允許虛擬機操作系統感知到自己運行在Xen Hypervisor上而不是直接運行在硬件上,同時也可以識別出其他運行在相同環境中的客戶虛擬機。
在Xen Hypervisor上運行的半虛擬化的操作系統,爲了調用系統管理程序(Xen Hypervisor),要有選擇地修改操作系統,然而卻不需要修改操作系統上運行的應用程序。由於 Xen 需要修改操作系統內核,所以您不能直接讓當前的 Linux 內核在 Xen 系統管理程序中運行,除非它已經移植到了Xen 架構。不過,如果當前系統可以使用新的已經移植到 Xen 架構的Linux 內核,那麼您就可以不加修改地運行現有的系統。
半虛擬化虛擬機示意圖
1.2.2 完全虛擬化
完全虛擬化(Hardware Virtual Machine)又稱“硬件虛擬化”,簡稱HVM,是指運行在虛擬環境上的虛擬機在運行過程中始終感覺自己是直接運行在硬件之上的,並且感知不到在相同硬件環境下運行着其他虛擬機的虛擬技術。
在Xen Hypervisor運行的完全虛擬化虛擬機,所運行的操作系統都是標準的操作系統,即:無需任何修改的操作系統版本。同時也需要提供特殊的硬件設備。
值的注意的是,在Xen上虛擬的Windows虛擬機必須採用完全虛擬化技術。
1.3 基本組件
Xen包含三大部分:
Xen Hypervisor:直接運行於硬件之上是Xen客戶操作系統與硬件資源之間的訪問接口(如:)。通過將客戶操作系統與硬件進行分類,Xen管理系統可以允許客戶操作系統安全,獨立的運行在相同硬件環境之上。
Domain 0:運行在Xen管理程序之上,具有直接訪問硬件和管理其他客戶操作系統的特權的客戶操作系統。
DomainU:運行在Xen管理程序之上的普通客戶操作系統或業務操作系統,不能直接訪問硬件資源(如:內存,硬盤等),但可以獨立並行的存在多個。
Xen組件結構圖
1.3.1 Xen Hypervisor
Xen Hypervisor是直接運行在硬件與所有操作系統之間的基本軟件層。它負責爲運行在硬件設備上的不同種類的虛擬機(不同操作系統)進行CPU調度和內存分配。Xen Hypervisor對虛擬機來說不單單是硬件的抽象接口,同時也控制虛擬機的執行,讓他們之間共享通用的處理環境。
Xen Hypervisor不負責處理諸如網絡、外部存儲設備、視頻或其他通用的I/O處理。
1.3.2 Domain 0
Domain 0 是經過修改的Linux內核,是運行在Xen Hypervisor之上獨一無二的虛擬機,擁有訪問物理I/O資源的特權,並且可以與其他運行在Xen Hypervisor之上的其他虛擬機進行交互。所有的Xen虛擬環境都需要先運行Domain 0,然後才能運行其他的虛擬客戶機。
Domain 0 在Xen中擔任管理員的角色,它負責管理其他虛擬客戶機。
在Domain 0中包含兩個驅動程序,用於支持其他客戶虛擬機對於網絡和硬盤的訪問請求。這兩個驅動分別是Network Backend Driver和Block Backend Driver。
Network Backend Driver直接與本地的網絡硬件進行通信,用於處理來自Domain U客戶機的所有關於網絡的虛擬機請求。根據Domain U發出的請求Block Backend Driver直接與本地的存儲設備進行通信然後,將數據讀寫到存儲設備上。
Domain 0虛擬機
1.3.3 Domain U
Domain U客戶虛擬機沒有直接訪問物理硬件的權限。所有在Xen Hypervisor上運行的半虛擬化客戶虛擬機(簡稱:Domain U PV Guests)都是被修改過的基於Linux的操作系統、Solaris、FreeBSD和其他基於UNIX的操作系統。所有完全虛擬化客戶虛擬機(簡稱:Domain U HVM Guests)則是標準的Windows和其他任何一種未被修改過的操作系統。
無論是半虛擬化Domain U還是完全虛擬化Domain U,作爲客戶虛擬機系統,Domain U在Xen Hypervisor上運行並行的存在多個,他們之間相互獨立,每個Domain U都擁有自己所能操作的虛擬資源(如:內存,磁盤等)。而且允許單獨一個Domain U進行重啓和關機操作而不影響其他Domain U。
Xen虛擬化示意圖
2 Xen基本體系架構及運行原理
2.1.1 Xen體系架構
Xen 的 VMM ( Xen Hyperviso ) 位於操作系統和硬件之間,負責爲上層運行的操作系統內核提供虛擬化的硬件資源,負責管理和分配這些資源,並確保上層虛擬機(稱爲域 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 drive)發起。前端設備的設計十分簡單,只需要完成數據的轉發操作,由於它們不是真實的設備驅動程序,所以也不用進行請求調度操作。而運行在IDD中的後端設備,可以利用Linux的現有設備驅動來完成硬件訪問,需要增加的只是IO請求的橋接功能---能完成任務的分發和回送。
Xen 的體系架構
2.1.2 不同虛擬技術的運行機制
半虛擬化技術:
採用半虛擬化技術的虛擬機操作系統能夠識別到自己是運行在Xen Hypervisor而非直接運行於硬件之上,並且也可以識別到在相同的機器上運行的其他虛擬機系統。而且運行的操作系統都需要進行相應的修改。
半虛擬化客戶機(Domain U PV Guests)包含兩個用於操作網絡和磁盤的驅動程序,PV Network Driver 和PV Block Driver。
PV Network Driver負責爲Domain U提供網絡訪問功能。PV Block Driver負責爲Domain U提供磁盤操作功能。
半虛擬化客戶機
完全虛擬化技術:
完全虛擬化客戶機(Domain U HVM Guests)運行的是標準版本的操作系統,因此其操作系統中不存在半虛擬化驅動程序(PV Driver),但是在每個完全虛擬化客戶機都會在Domain 0中存在一個特殊的精靈程序,稱作:Qemu-DM,Qemu-DM幫助完全虛擬化客戶機(Domain U HVM Guest)獲取網絡和磁盤的訪問操作。
完全虛擬化客戶機必須和在普通硬件環境下一樣進行初始化,所以需要在其中加入一個特殊的軟件Xen virtual firmware,來模擬操作系統啓動時所需要的BIOS。
完全虛擬化客戶機
2.1.3 Domain 管理和控制
開源社區中將一系列的Linux精靈程序分類爲“管理”和“控制”兩大類。這些服務支撐着整個虛擬環境的管理和控制操作,並且存在於Domain 0虛擬機中。
下面將對直接服務進行詳細的描述。
注:爲了清晰的描述Xen的運行流程,畫圖時將精靈程序放在Domain 0外部來描述,但事實上所有精靈程序都存在於Domain 0 之中。
2.1.3.1 Xend
Xend精靈線程是一個Python應用程序,它作爲Xen環境的系統管理員。它利用Libxenctrl類庫向Xen Hypervisor發出請求。
所有Xend處理的請求都是由XM工具使用XML RPC接口發送過來的。
Xend運行示意圖
2.1.3.2 Xm
用於將用戶輸入通過XML RPC接口傳遞到Xend中的命令行工具。
2.1.3.3 Xenstored
Xenstored精靈程序用於維護註冊信息,這些信息包括內存和在連接Domain 0和所有其他Domain U之間的事件通道。Domain 0虛擬機利用這些註冊信息來與系統中其他虛擬機建立設備通道,即幫助Domain U虛擬機訪問硬件資源。
2.1.3.4 Libxenctrl
Libxenctrl是C程序類庫,用於讓Xend具有通過Domain 0與Xen Hypervisor進行交互的能力。在Domain 0中存在一個特殊的驅動程序稱作privcmd,它將請求發送給Hypervisor。
Libxenctrl示意圖
2.1.3.5 Qemu-DM
在Xen環境下,每個完全虛擬化虛擬機都需要擁有自己的Qemu精靈程序。Qemu-DM處理在Xen環境下完全虛擬化客戶機所能允許執行的所有關於網絡和磁盤請求和操作。Qemu程序必須存在於Hypervisor之外同時又需要訪問網絡和I/O,所以Qemu-DM必須存在於Domain 0 中(參見前面章節對Domain 0 的描述)。
未來版本的Xen中,一種新的工具Stub-DM將會提供一系列對所有完全虛擬化客戶機都可用的服務,以此來替代需要在每個虛擬機上都生成一個Qemu的邏輯。
2.1.3.6 Xen Virtual Firmware
Xen Virtual Firmware是被嵌入到所有完全虛擬化客戶機中的虛擬的BIOS系統,來確保所有客戶操作系統在正常啓動操作中接收到標準的啓動指令集並提供標準的軟件兼容環境。
2.1.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 U PV執行磁盤操作實例
上圖中所顯示的事件通道是直接連接Domain 0 和Domain U PV是爲了清晰和簡單的描述系統是如何運行的。但事實上,事件通道(Event Channel)運行於Xen Hypervisor中,並在Xenstored中註冊特定的系統中斷,以此來讓Domain 0 和Domain U PV能夠通過本地內存快速的共享信息。
Domain 0與Domain U PV啓動交互圖
3 Xen的網絡架構
3.1 Xen支持三種網絡工作模式
1. Bridge 安裝虛擬機時默認使用 Bridge模式
2. Route
3. NAT
各工作模式下虛擬機啓動流程:
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
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地址增加靜態路由。
NAT模式
NAT 模式會使用虛擬局域網 virbr0
3.2 Xen Domain U Guests 發送數據包處理流程
Xen Domain U Guests發送數據包處理流程
3.3 Xen中虛擬網卡與物理網卡之間的關係
安裝了Xen的Linux機器,在Dom 0中能看到以下幾類網卡(網絡接口設備 ):
(X ,Y都爲數字)
pethY
ethY
xenbrY
virbrY
vifX.Y(X爲DomaiID,Y表示該虛擬網卡是該Domain的第幾塊虛擬網卡)
vethY (一般在Xend啓動完成以後就不存在了)