深入學習Xen新起點 全面介紹Xen虛擬機

marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog.html" frameborder="0" width="728" scrolling="no" height="90">
        
       Xen VMM(virtual machine monitor)是由劍橋大學計算機實驗室開發的一個開源項目,它能夠讓我們創建更多的虛擬機,每一個虛擬機都是運行在同一個操作系統上的實例。
  這些客戶OS可以是修補過的Linux內核2.4或2.6,也可以是修補過的NetBSD/FreeBSD內核。用戶應用程序就運行在這些客戶OS上,並不需要修改任何代碼。
  我曾經緊密跟蹤Xen項目一年多。對Xen產生興趣是在讀了2004年的OLS(Ottawa Linux Symposium)論文集之後。
  完全虛擬化已經被一些硬件仿真程序實現了。硬件仿真器的不利因素是它們的性能。
  Xen項目(半虛擬化)的思想已經不是很新鮮了。性能度量和它達到的高效性,能夠被看作是一個突破,運行Xen的系統開銷確實非常小,大約佔3%。
  就像剛纔所說的那樣,現在的Xen要爲內核打補丁,但是,將來的處理器能支持虛擬化,內核也就不需要打補丁了。比如說,Intel的VT和AMD的Pacifica處理器都將包括這種支持。
  XenSource公司2005年8月在Intel開發者論壇(IDF)上發表聲明說,它已經利用Intel的VT-Enabled平臺和Xen技術虛擬化了Linux和Windows XP SP 2。
  如果沒有其它虛擬化方法的話,Intel的VT和AMD的Pacifica將會在對Xen的支持上展開競爭。
  同時參與競爭的還有VMWare公司的ESX Server,它不是基於Xen的虛擬化解決方案。VMWare公司2005年8月初聲明,他將通過一個叫VMware Community Source的計劃允許他的合作伙伴使用VMware ESX Server的源代碼和接口。
VMware的一個顯著優勢就是它不需要在客戶OS上打補丁。VMware可能比Xen運行地慢一些,因爲它使用影子頁表(shadow page tables),而Xen同時使用直接和影子頁表。
  Xen已經在像Fedora Core 4、Debian和SuSE Professional 9.3這些產品中捆綁發行了,它也將被包含在RHEL 5中。
  針對其它處理器的支持正在有條不紊地進行着。Xen小組致力於x86_64 port,同時IBM着手於提供Power 5芯片的支持。

   保護環
  在Xen中,一個“系統管理程序”運行在0環,客戶OS運行在1環,應用程序運行在3環。這種關係對於x64/64有一點不同,就是客戶內核和應用程序都運行在3環上。
  Xen自身被稱爲“系統管理程序”,是因爲它比客戶OS的系統管理代碼運行所需的特權級還高。
  當系統引導的時候,Xen被裝載到0環的內存中。它在1環上啓動修補過的內核,這被稱作是domain 0(譯者注:domain是指一個運行中的虛擬機,在其上有一個guest OS在執行)。從這個domain開始,你可以創建更多的domain,也可以銷燬它們,可以進行domain的遷移、設置參數等等。你創建的那些domain也運行在1環它們的內核中。用戶應用程序運行在3環。
目前,修補過的Linux內核2.4和2.6可以作爲domain 0。據Xen開發者所說,將來domain 0僅支持2.6的內核補丁。構造domain 0的大部分工作是在xen/arch/x86/domain_build.c中的construct_dom0()方法中實現的。
  物理設備驅動程序只能運行在特權級,也就是domain 0上。Xen依靠Linux或其它修補過的OS內核對它所有的設備提供虛擬化支持。這樣的好處就是Xen的開發者不必再去開發設備驅動程序。
  在一個有標籤TLB的處理器上使用Xen能夠大大提高性能。標籤TLB能夠把ASID(address space identifier)放在TLB入口處。有了這個特性,當處理器在系統管理程序和客戶OS之間切換時就不需要刷新TLB了,這大大減少了系統開銷。
 
Xend Deamon
  首先,我們介紹一下Xend,它是Xen控制器daemon,意思是說它負責處理創建、銷燬、遷移以及其它許多domain管理的任務。它很大一部分動作是基於一個HTTP服務器的。大量對domain的控制請求都是通過發送HTTP請求來實現的。
  我們在引導進入Xen後通過命令行命令xend start來啓動Xend daemon。它需要Python2.3的支持。
  Xend daemon的工作是建立在與XCS server(the control Switch)的交互上。所以,當我們啓動Xend daemon時,需要檢查一下XCS是否已經啓動和運行了。如果沒有,我們將試着去啓動它。
  Srv Daemon是Xend的主要程序,啓動Xend daemon就會創建一個Srv Daemon類的實例。
  接下來在createFactories()方法中創建一個Channel Factory。Channel Factory有一個隱含的notifier對象。Xend daemon的大量工作都是基於這個notifier接收的消息的。這個factory創建一個線程,在一個無限循環中讀取這個notifier。

創建domain
  創建一個domain是通過使用一個hypercall(DOM0_CREATEDOMAIN)來完成的。Hypercall是Linux內核中的一個系統調用,通過它,用戶空間可以調用內核中的方法,它通過一箇中斷(Int 0x80)來完成。在Xen中,類似的系統調用就是hypervisor,通過它,domain 0 調用hypervisor中的方法,它也是通過中斷(Int 0x82)來完成的。hypervisor通過它的虛擬CPU訪問每一個domain。
  XendDomain類和XendDomainInfo類在創建和銷燬domain中扮演着非常重要的角色。我們通過調用XendDomain中的domain_create()方法創建一個新的domain。
  XendDomainInfo類和它的方法主要用於一個domain的實際構造。
   XCS Server
  XCS server有兩個TCP套接字,分別是控制連接和數據連接,它們不同的地方在於前者是同步的,後者是異步的。前面提到的notifier對象,就是XCS服務器的一個客戶端。

   創建虛擬設備
  XendDomainInfo中的create()方法啓動一個創建domain的動作鏈。首先被創建的是這個domain的虛擬設備。這個create()方法調用create_blkif()創建一個塊設備接口(blkif),即使VM不需要磁盤它也是必須被創建的。另一個虛擬設備通過create_configured_devices()創建。
 所有的設備類都從Dev繼承,Dev是一個聯繫設備控制器的抽象類。它的attach()抽象方法在每一個Dev類的子類中實現,這個方法把前端和後端聯繫了起來。圖2展示了設備的層次。
Domain 0運行後端驅動,同時最新創建domain運行前端驅動。許多消息在後端和前端驅動之間傳送。前端驅動感覺上是虛擬的,它不需要使用特定硬件的詳細信息。
  聯繫虛擬設備的中斷是虛擬中斷。

   結論
  Xen項目是一個很有趣同時充滿了希望的項目。它的代碼很複雜,特別是虛擬內存管理、活動域合併工具和授權表機制。本文僅僅是介紹性的,並不涉及這些話題。然而,我希望它能夠成爲想要了解和深入研究代碼的一個出發點。
 



        
       Xen VMM(virtual machine monitor)是由劍橋大學計算機實驗室開發的一個開源項目,它能夠讓我們創建更多的虛擬機,每一個虛擬機都是運行在同一個操作系統上的實例。
  這些客戶OS可以是修補過的Linux內核2.4或2.6,也可以是修補過的NetBSD/FreeBSD內核。用戶應用程序就運行在這些客戶OS上,並不需要修改任何代碼。
  我曾經緊密跟蹤Xen項目一年多。對Xen產生興趣是在讀了2004年的OLS(Ottawa Linux Symposium)論文集之後。
  完全虛擬化已經被一些硬件仿真程序實現了。硬件仿真器的不利因素是它們的性能。
  Xen項目(半虛擬化)的思想已經不是很新鮮了。性能度量和它達到的高效性,能夠被看作是一個突破,運行Xen的系統開銷確實非常小,大約佔3%。
  就像剛纔所說的那樣,現在的Xen要爲內核打補丁,但是,將來的處理器能支持虛擬化,內核也就不需要打補丁了。比如說,Intel的VT和AMD的Pacifica處理器都將包括這種支持。
  XenSource公司2005年8月在Intel開發者論壇(IDF)上發表聲明說,它已經利用Intel的VT-Enabled平臺和Xen技術虛擬化了Linux和Windows XP SP 2。
  如果沒有其它虛擬化方法的話,Intel的VT和AMD的Pacifica將會在對Xen的支持上展開競爭。
  同時參與競爭的還有VMWare公司的ESX Server,它不是基於Xen的虛擬化解決方案。VMWare公司2005年8月初聲明,他將通過一個叫VMware Community Source的計劃允許他的合作伙伴使用VMware ESX Server的源代碼和接口。
VMware的一個顯著優勢就是它不需要在客戶OS上打補丁。VMware可能比Xen運行地慢一些,因爲它使用影子頁表(shadow page tables),而Xen同時使用直接和影子頁表。
  Xen已經在像Fedora Core 4、Debian和SuSE Professional 9.3這些產品中捆綁發行了,它也將被包含在RHEL 5中。
  針對其它處理器的支持正在有條不紊地進行着。Xen小組致力於x86_64 port,同時IBM着手於提供Power 5芯片的支持。

   保護環
  在Xen中,一個“系統管理程序”運行在0環,客戶OS運行在1環,應用程序運行在3環。這種關係對於x64/64有一點不同,就是客戶內核和應用程序都運行在3環上。
  Xen自身被稱爲“系統管理程序”,是因爲它比客戶OS的系統管理代碼運行所需的特權級還高。
  當系統引導的時候,Xen被裝載到0環的內存中。它在1環上啓動修補過的內核,這被稱作是domain 0(譯者注:domain是指一個運行中的虛擬機,在其上有一個guest OS在執行)。從這個domain開始,你可以創建更多的domain,也可以銷燬它們,可以進行domain的遷移、設置參數等等。你創建的那些domain也運行在1環它們的內核中。用戶應用程序運行在3環。
目前,修補過的Linux內核2.4和2.6可以作爲domain 0。據Xen開發者所說,將來domain 0僅支持2.6的內核補丁。構造domain 0的大部分工作是在xen/arch/x86/domain_build.c中的construct_dom0()方法中實現的。
  物理設備驅動程序只能運行在特權級,也就是domain 0上。Xen依靠Linux或其它修補過的OS內核對它所有的設備提供虛擬化支持。這樣的好處就是Xen的開發者不必再去開發設備驅動程序。
  在一個有標籤TLB的處理器上使用Xen能夠大大提高性能。標籤TLB能夠把ASID(address space identifier)放在TLB入口處。有了這個特性,當處理器在系統管理程序和客戶OS之間切換時就不需要刷新TLB了,這大大減少了系統開銷。
 
Xend Deamon
  首先,我們介紹一下Xend,它是Xen控制器daemon,意思是說它負責處理創建、銷燬、遷移以及其它許多domain管理的任務。它很大一部分動作是基於一個HTTP服務器的。大量對domain的控制請求都是通過發送HTTP請求來實現的。
  我們在引導進入Xen後通過命令行命令xend start來啓動Xend daemon。它需要Python2.3的支持。
  Xend daemon的工作是建立在與XCS server(the control Switch)的交互上。所以,當我們啓動Xend daemon時,需要檢查一下XCS是否已經啓動和運行了。如果沒有,我們將試着去啓動它。
  Srv Daemon是Xend的主要程序,啓動Xend daemon就會創建一個Srv Daemon類的實例。
  接下來在createFactories()方法中創建一個Channel Factory。Channel Factory有一個隱含的notifier對象。Xend daemon的大量工作都是基於這個notifier接收的消息的。這個factory創建一個線程,在一個無限循環中讀取這個notifier。

創建domain
  創建一個domain是通過使用一個hypercall(DOM0_CREATEDOMAIN)來完成的。Hypercall是Linux內核中的一個系統調用,通過它,用戶空間可以調用內核中的方法,它通過一箇中斷(Int 0x80)來完成。在Xen中,類似的系統調用就是hypervisor,通過它,domain 0 調用hypervisor中的方法,它也是通過中斷(Int 0x82)來完成的。hypervisor通過它的虛擬CPU訪問每一個domain。
  XendDomain類和XendDomainInfo類在創建和銷燬domain中扮演着非常重要的角色。我們通過調用XendDomain中的domain_create()方法創建一個新的domain。
  XendDomainInfo類和它的方法主要用於一個domain的實際構造。
   XCS Server
  XCS server有兩個TCP套接字,分別是控制連接和數據連接,它們不同的地方在於前者是同步的,後者是異步的。前面提到的notifier對象,就是XCS服務器的一個客戶端。

   創建虛擬設備
  XendDomainInfo中的create()方法啓動一個創建domain的動作鏈。首先被創建的是這個domain的虛擬設備。這個create()方法調用create_blkif()創建一個塊設備接口(blkif),即使VM不需要磁盤它也是必須被創建的。另一個虛擬設備通過create_configured_devices()創建。
 所有的設備類都從Dev繼承,Dev是一個聯繫設備控制器的抽象類。它的attach()抽象方法在每一個Dev類的子類中實現,這個方法把前端和後端聯繫了起來。圖2展示了設備的層次。
Domain 0運行後端驅動,同時最新創建domain運行前端驅動。許多消息在後端和前端驅動之間傳送。前端驅動感覺上是虛擬的,它不需要使用特定硬件的詳細信息。
  聯繫虛擬設備的中斷是虛擬中斷。

   結論
  Xen項目是一個很有趣同時充滿了希望的項目。它的代碼很複雜,特別是虛擬內存管理、活動域合併工具和授權表機制。本文僅僅是介紹性的,並不涉及這些話題。然而,我希望它能夠成爲想要了解和深入研究代碼的一個出發點。
 



        
       Xen VMM(virtual machine monitor)是由劍橋大學計算機實驗室開發的一個開源項目,它能夠讓我們創建更多的虛擬機,每一個虛擬機都是運行在同一個操作系統上的實例。
  這些客戶OS可以是修補過的Linux內核2.4或2.6,也可以是修補過的NetBSD/FreeBSD內核。用戶應用程序就運行在這些客戶OS上,並不需要修改任何代碼。
  我曾經緊密跟蹤Xen項目一年多。對Xen產生興趣是在讀了2004年的OLS(Ottawa Linux Symposium)論文集之後。
  完全虛擬化已經被一些硬件仿真程序實現了。硬件仿真器的不利因素是它們的性能。
  Xen項目(半虛擬化)的思想已經不是很新鮮了。性能度量和它達到的高效性,能夠被看作是一個突破,運行Xen的系統開銷確實非常小,大約佔3%。
  就像剛纔所說的那樣,現在的Xen要爲內核打補丁,但是,將來的處理器能支持虛擬化,內核也就不需要打補丁了。比如說,Intel的VT和AMD的Pacifica處理器都將包括這種支持。
  XenSource公司2005年8月在Intel開發者論壇(IDF)上發表聲明說,它已經利用Intel的VT-Enabled平臺和Xen技術虛擬化了Linux和Windows XP SP 2。
  如果沒有其它虛擬化方法的話,Intel的VT和AMD的Pacifica將會在對Xen的支持上展開競爭。
  同時參與競爭的還有VMWare公司的ESX Server,它不是基於Xen的虛擬化解決方案。VMWare公司2005年8月初聲明,他將通過一個叫VMware Community Source的計劃允許他的合作伙伴使用VMware ESX Server的源代碼和接口。
VMware的一個顯著優勢就是它不需要在客戶OS上打補丁。VMware可能比Xen運行地慢一些,因爲它使用影子頁表(shadow page tables),而Xen同時使用直接和影子頁表。
  Xen已經在像Fedora Core 4、Debian和SuSE Professional 9.3這些產品中捆綁發行了,它也將被包含在RHEL 5中。
  針對其它處理器的支持正在有條不紊地進行着。Xen小組致力於x86_64 port,同時IBM着手於提供Power 5芯片的支持。

   保護環
  在Xen中,一個“系統管理程序”運行在0環,客戶OS運行在1環,應用程序運行在3環。這種關係對於x64/64有一點不同,就是客戶內核和應用程序都運行在3環上。
  Xen自身被稱爲“系統管理程序”,是因爲它比客戶OS的系統管理代碼運行所需的特權級還高。
  當系統引導的時候,Xen被裝載到0環的內存中。它在1環上啓動修補過的內核,這被稱作是domain 0(譯者注:domain是指一個運行中的虛擬機,在其上有一個guest OS在執行)。從這個domain開始,你可以創建更多的domain,也可以銷燬它們,可以進行domain的遷移、設置參數等等。你創建的那些domain也運行在1環它們的內核中。用戶應用程序運行在3環。
目前,修補過的Linux內核2.4和2.6可以作爲domain 0。據Xen開發者所說,將來domain 0僅支持2.6的內核補丁。構造domain 0的大部分工作是在xen/arch/x86/domain_build.c中的construct_dom0()方法中實現的。
  物理設備驅動程序只能運行在特權級,也就是domain 0上。Xen依靠Linux或其它修補過的OS內核對它所有的設備提供虛擬化支持。這樣的好處就是Xen的開發者不必再去開發設備驅動程序。
  在一個有標籤TLB的處理器上使用Xen能夠大大提高性能。標籤TLB能夠把ASID(address space identifier)放在TLB入口處。有了這個特性,當處理器在系統管理程序和客戶OS之間切換時就不需要刷新TLB了,這大大減少了系統開銷。
 
Xend Deamon
  首先,我們介紹一下Xend,它是Xen控制器daemon,意思是說它負責處理創建、銷燬、遷移以及其它許多domain管理的任務。它很大一部分動作是基於一個HTTP服務器的。大量對domain的控制請求都是通過發送HTTP請求來實現的。
  我們在引導進入Xen後通過命令行命令xend start來啓動Xend daemon。它需要Python2.3的支持。
  Xend daemon的工作是建立在與XCS server(the control Switch)的交互上。所以,當我們啓動Xend daemon時,需要檢查一下XCS是否已經啓動和運行了。如果沒有,我們將試着去啓動它。
  Srv Daemon是Xend的主要程序,啓動Xend daemon就會創建一個Srv Daemon類的實例。
  接下來在createFactories()方法中創建一個Channel Factory。Channel Factory有一個隱含的notifier對象。Xend daemon的大量工作都是基於這個notifier接收的消息的。這個factory創建一個線程,在一個無限循環中讀取這個notifier。

創建domain
  創建一個domain是通過使用一個hypercall(DOM0_CREATEDOMAIN)來完成的。Hypercall是Linux內核中的一個系統調用,通過它,用戶空間可以調用內核中的方法,它通過一箇中斷(Int 0x80)來完成。在Xen中,類似的系統調用就是hypervisor,通過它,domain 0 調用hypervisor中的方法,它也是通過中斷(Int 0x82)來完成的。hypervisor通過它的虛擬CPU訪問每一個domain。
  XendDomain類和XendDomainInfo類在創建和銷燬domain中扮演着非常重要的角色。我們通過調用XendDomain中的domain_create()方法創建一個新的domain。
  XendDomainInfo類和它的方法主要用於一個domain的實際構造。
   XCS Server
  XCS server有兩個TCP套接字,分別是控制連接和數據連接,它們不同的地方在於前者是同步的,後者是異步的。前面提到的notifier對象,就是XCS服務器的一個客戶端。

   創建虛擬設備
  XendDomainInfo中的create()方法啓動一個創建domain的動作鏈。首先被創建的是這個domain的虛擬設備。這個create()方法調用create_blkif()創建一個塊設備接口(blkif),即使VM不需要磁盤它也是必須被創建的。另一個虛擬設備通過create_configured_devices()創建。
 所有的設備類都從Dev繼承,Dev是一個聯繫設備控制器的抽象類。它的attach()抽象方法在每一個Dev類的子類中實現,這個方法把前端和後端聯繫了起來。圖2展示了設備的層次。
Domain 0運行後端驅動,同時最新創建domain運行前端驅動。許多消息在後端和前端驅動之間傳送。前端驅動感覺上是虛擬的,它不需要使用特定硬件的詳細信息。
  聯繫虛擬設備的中斷是虛擬中斷。

   結論
  Xen項目是一個很有趣同時充滿了希望的項目。它的代碼很複雜,特別是虛擬內存管理、活動域合併工具和授權表機制。本文僅僅是介紹性的,並不涉及這些話題。然而,我希望它能夠成爲想要了解和深入研究代碼的一個出發點。
 



發佈了5193 篇原創文章 · 獲贊 9 · 訪問量 104萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章