轉自http://www.chenyajun.com/2009/03/06/2408
http://wiki.xensource.com/xenwiki/XenArchitecture?action=AttachFile&do=get&target=Xen+Architecture_Q1+2008.pdf
一個 Xen 虛擬化環境包括一組項目,它們一起工作來提供虛擬化環境:
Xen hypervisor;
dom0;
domain management and control,域的管理和控制;
domU PV 客戶機;
domU HVM 客戶機。
它們之間的關係參見:
http://www.chenyajun.com/2009/03/01/xen-virtualization-model-explored/
hypervisor 是作業系統以下硬體以上的一個軟體抽象。負責 CPU 調度,虛擬機器記憶體配置。hypervisor 不僅為虛擬機器抽象硬體,也要控制虛擬機器的執行。它對於網路、存放裝置和其它 IO 功能等一無所知。
dom0
是一個修改的 linux 核心,是一個運行在 xen hypervisor 之上的獨特虛擬機器,對訪問物理 IO 和其它 domu 虛擬機器具有特殊的權利。 xen 虛擬環境需要 dom0 在其它任何虛擬機器之前先啟動。
在 dom0 中包括的驅動用來支援 domu 的網路和本地磁碟請求,包括Network Backend Driver 和 the Block Backend Driver。
domU
所有運行在 Xen hypervisor 上的半虛擬化客戶機被稱為 domain U PV 客戶機,可以運行修改過的Linux,Solaris,FreeBSD 和其它作業系統。所有運行在 Xen hypervisor 之上的完全虛擬化的客戶機被稱為 Domain U HVM 客戶機,運行標準的 windows 或者其它未修改的作業系統。
DomU PV 客戶機意識到它不直接存取到硬體,認識到其它的虛擬機器運行在同樣的機器上。DomU HVM Guest 不會意識到它在和其它虛擬機器共用硬體資源。
一個 domU PV 客戶機包含用於網路和磁碟訪問的 2 種驅動,PV Network Driver 和 PV Block Driver。
一個 domU HVM 客戶機沒有那種 PV 驅動;取而代之的是在 dom0 下對每個 HVM 有一個特別的守護進程:qemu-dm。它支援 domU HVM 客戶機來進行網路和磁碟訪問請求。
domU HVM 客戶機必須進行一些初始化,載入一些軟體模組(韌體)來類比 BIOS 。
dom 的管理和控制
一系列的 Linux 進程被歸類為 dom 管理和控制工具,它們被用來進行 dom 0 內虛擬機器的管理和控制。
xend
Xend 是一個 python 應用,它是 Xen 環境的系統管理器。它調節 libxenctrl 來向 hypervisor 請求,所有經由 Xend 的請求通過 xm 工具用 xml-rpc 介面發起。
xm
命令列工具,接收使用者輸入通過 xml rpc 傳遞到 Xend。
Xenstored
這個維護在 dom0 和 domU 之間的記憶體和事件通道等的資訊。
libxenctrl
一個 C 庫提供 Xend 和 Xen hypervisor 通過 dom0 對話的能力。在 dom0 中,privcmd 分發請求到 hypervisor。
Qemu-dm
每個 HVM 客戶機要求有自己的 Qemu 守護進程。這個工具處理所有來自 domU HVM 完全虛擬化的客戶機的網路和磁碟請求。Qemu 必須存在於 Xen hypervisor 之外,因為它必須能訪問 dom0 中的網路和IO。
Xen 虛擬韌體
一個虛擬 BIOS 插入到每個 domU HVM 客戶機中,保證作業系統接收到在正常啟動過程中各種標準的啟動指令。
dom0 和 domU 之間的通訊
Xen hypervisor 不用來支援網路或者磁碟請求,因此一個 domU 通過 hypervisor 向 dom0 通訊來進行磁碟或者網路請求。
domU PV 客戶機塊裝置驅動接收到磁碟寫請求時,它將通過 Xen hypervisor 寫資料到和 dom0 共用的一塊本地記憶體。在 dom0 和 domU PV 客戶機之間存在一個事件通道允許它們使用 Xen hypervisor 的非同步域間中斷來通訊。dom0 將接收到一個來自 hypervisor 的中斷引起 PV Block Backend Driver 來訪問本地系統記憶體讀取 domU PV 客戶機共用記憶體中的塊。共用記憶體中的資料然後被寫到本地磁碟。
如前所描述,後端驅動(backend driver)運行在特權域,前端驅動(frontend driver)運行在非特權域。非特權的用戶端發出裝置請求到前端驅動。前端驅動然後和運行在特權域中的後端驅動通訊。特權域將請求排隊向實際物理硬體請求。
前端和後端驅動的通訊通過使用 XenBus 的系統記憶體來完成,這是一個用來共用事件通道和生產者/消費者的環緩衝。為了避免昂貴的資料拷貝,XenBus 通過簡易對應來完成。比如當要寫資料到磁碟或者通過網路發送資料,一個屬於非特權域的緩衝可能被映射到特權域。同樣,要從磁碟讀資料或者接收來自網路的資料,一個由特權域控制的緩衝可以被映射到非特權域。
這種通訊通過 XenStore 來建立。當前端驅動啟動時,它使用 XenStore 來建立一個共用記憶體池和與後端驅動通訊的事件通道。在串連建立以後,前端和後端將請求或者響應放置到共用記憶體中通過事件通道向彼此發送通知。XenStore 向後端和前端驅動提供了對這種串連的可見度。
橋接、路由和 NAT
Xen 提供了 3 種虛擬網路模型來供客戶機訪問物理裝置——橋接、路由和 NAT。在橋接模式中,虛擬網路介面(vif)在外部區域網路是可見的,在路由模型中,vif 在外部區域網路是不可見的,但是 IP 是可見的。在 NAT 模型中,vif 在外部區域網路不可見,它也沒有一個外部可見的 IP 位址。
在橋接模式下, brctl 工具被用來建立軟體方式的橋接介面,一個物理網路介面然後附加到橋上。Xen 客戶機域的後端 vif 能被附加到這個橋上。當橋介面接收到來自物理介面的包時,物理網路介面將依據各域的虛擬網卡的 MAC 位址轉寄它們到不同的域上。
在路由模型下將使用 iptables 機制來進行路由。由物理介面所收到的所有的包將被驅動域的網路 IP 層所處理。驅動域(dom0)尋找路由表條目並將包轉寄到不同的客戶機 IP 位址。在路由模式下,驅動域串連 2 個不同的網段:內部由客戶機使用的網段和串連外部網路的網段。
在驅動域作為一個 NAT Gateway時,驅動域仍然作為一個路由器,但是更進一步映射一個它自己的 IP 位址和連接埠到一個客戶機的 IP 位址和連接埠。客戶機的 IP 位址隱藏在驅動域後面對外部網路不可見。
Linux 防火牆提供了 iptables ,而 bridge-utils 則提供了 etables 來進行基本的 MAC 位址過濾。也可以指定一個物理網卡給一個域使用。
是個橋接的例子。
veth0、vif0.0 是 dom0 的網路介面。veth0 被重新命名為 eth0。xenbr0 介面是軟橋接介面。vif1.0 是啟動並執行客戶機的後端網路介面。
peth0、xenbr0、vif0.0、vif1.0 都共用同樣的 MAC 位址 FE:FF:FF:FF:FF:FF,它是乙太網路的廣播位址。這意味著實際的網路介面、dom0 的迴環介面、客戶機的後端介面都向 xenbr0 廣播。當物理網卡接收到包時,它直接發送到橋接介面 xenbr0,這個橋接介面通過包的 MAC 位址決定將包轉寄到哪個域的後端介面。因此 peth0 不需要 IP,只需要 MAC 位址。物理介面的原先 IP 已經被告知給 eth0——驅動域的虛擬前端介面。xenbr0 通過 MAC 位址是 00:11:25:F6:15:22 或者是 00:16:3e:45:e7:12 來決定包轉寄到 eth0 或者 vif1.0。客戶域相應的前端介面被命名為 eth0。從 dom0 的角度看,客戶機中 eth0 實際是 vif1.0。
brctl 命令的顯示:
[user@Dom0]# brctl showbridge name bridge id STP enabled interfacesxenbr0 8000.feffffffffff no vif1.0 peth0 vif0.0