早些時候,Xen被紅帽當做預設虛拟化實作的解決方案。
Xen是由英國劍橋大學所研發的,是開源的虛拟機螢幕(VMM)。Xen的主要目的是緻力于實作在單個計算機上運作多達128個有完全功能的Guest。但是,早期設計時,在Xen出現的時候,x86平台還不支援硬體輔助虛拟化(HVM),是以那個時候要麼隻能通過完全虛拟化的方式來實作虛拟化,那個時候比較著名的VMware Workstation就是使用的這種技術。但劍橋大學的Xen項目組他們認為這種技術損失了太多的性能,是以,他們研發了半虛拟化技術,能夠使得運作在其上的GuestOS獲得接近于實體硬體百分之九十以上的性能表現。不過,他們做出的折中是GuestOS必須修改其源代碼,來實作讓其适應運作在虛拟化環境上。
Xen的元件
Xen是Type-I型的虛拟化,Xen其實就是直接運作在硬體之上的,任何一個運作在xen hypervisor之上的主機都是虛拟機。啟動主機時,要求如果有硬體的話,首先啟動的必須是Xen Hypervisor,Xen采用了一種精巧的設計方式,雖然Xen自己提供了hypervisor,但是它并沒有對所有東西都虛拟化,它僅僅虛拟化了計算機五大部件中的CPU和記憶體,對于IO裝置沒有虛拟化。
Xen Hypervisor上要直接啟動一個虛拟機,這個虛拟機要輔助Xen Hypervisor一塊工作,這個虛拟機有兩個功用:
1、作為Xen Hypervisor管理其他虛拟機的接口。這第一個虛拟機有使用者空間和核心空間,在使用者空間中提供一個虛拟機的管控接口,進而通過這個管控接口就可以建立其他虛拟機了,其他虛拟機的啟動、關閉也都要通過第一個虛拟機來實作。還要提供一個管理控制台(console),因為Xen Hypervisor并不提供這樣的應用程式,是以我們要開發一個能夠為Xen Hypervisor管理虛拟機的應用程式。隻需要通過調用Linux核心的應用程式來開發就可以了,隻要第一個虛拟機運作在Linux上就可以。
2、Xen Hypervisor還要依賴于第一個虛拟機的核心來驅動各種常用IO裝置,比如聲霸卡、網卡、顯示卡等等。Xen Hypervisor直接管理CPU,直接管理記憶體,但對各種常見IO裝置的管理由第一個虛拟機的核心來實作。
如果建立了其他虛拟機,其他虛拟機要想使用CPU和記憶體,都要向Xen Hypervisor直接進行調用,因為CPU和記憶體的管理權限是由Xen Hypervisor提供的。包括第一個虛拟機要想使用CPU和記憶體,也是由Hypervisor統一配置的。
Xen Hypervisor采用了一種精巧的設計方式,它自己為了避免需要開發各種各樣的IO硬體裝置的驅動程式,是以它在自己啟動起來之後,讓第一個必須要啟動起來的虛拟機來負責管理這個功能。是以如果要使用IO裝置,就要向第一個虛拟機發起請求,由第一個虛拟機負責通過軟體程式給它模拟出IO裝置,而後這些IO裝置經由核心驅動以後轉換成對這些硬體的調用。如果有多個虛拟機,它會為每一個虛拟機在使用者空間模拟出多個IO裝置,這個模拟是由QEMU來實作的。是以說,Xen的虛拟化環境并不完全由Xen提供,Xen隻是提供了CPU和記憶體的虛拟化,而所有在虛拟機上提供的IO裝置則是由QEMU模拟實作的。
在xen之上,每一個虛拟機被稱為一個“域(Domain)”,這些域是有編号的。第一個被啟動起來的叫做“Domain0”,通常被簡稱為”Dom0“,"Dom0"我們也把它叫做"特權域(Privileged Domain)"。 它擁有管理其他虛拟機,甚至于配置底層IO裝置虛拟化的權限。
其他所有能夠被“Dom0”管理的虛拟機,我們把它們統稱為“DomU(Unprivieged Domain)“。“DomU”是有編号的,每一個虛拟機執行個體啟動起來以後,它們都有一個唯一的編号,比如“Domain1”、"Domain2"...,除了"Domain0",其他都被稱為"DomU"。
要想讓“DomainU”運作為一個虛拟機的話,這個虛拟機得有CPU和記憶體。
如何給它虛拟化CPU呢?
要想給它虛拟出一顆CPU,我們通常是在Xen Hypervisor上提供一個程序或線程來當CPU來用,Xen Hypervisor把這個程序或線程排程至CPU某個實體核心上,進而使得它們的代碼能夠真正運作起來。是以你有n個虛拟機,每個虛拟機都有四顆cpu,底層的實體機器一共才隻有4顆CPU,假設有十個虛拟機,那一共就有四十顆CPU。這四十顆CPU在Xen Hypervisor上表現為什麼呢?映射到Xen Hypervisor上是一個一個的線程。
那它如何虛拟記憶體呢?
任何實體機裝置,現在的作業系統,大多數都是對記憶體分頁管理的。其實它記憶體的虛拟化,也無非就是把底層實體記憶體當中的某些段空間切割出來以後,形成一個新的虛拟空間供它使用了。隻不過進行了二次映射而已,本來在實體記憶體上很可能是離散的多個段,将會被Xen Hypervisor整合成一個。比如實體記憶體上的第一段加第二段,和第三段,總體映射為虛拟機整個可用的記憶體空間。對虛拟機來說,它以為自己的記憶體是完整且連續的。
每一個虛拟機都還要有一些IO裝置,比如網卡,硬碟等,這些IO裝置怎麼虛拟化?
如果我們要啟動n個虛拟機的話,每一個虛拟機都要有這些裝置,比如硬碟。底層的真的硬碟可能隻有一塊,那怎麼給它虛拟化?
無非就是這麼幾種方式:
1、實體硬碟多分幾個區,每一個虛拟機給一到兩個區。
2、在本地建立磁盤映像檔案,把檔案當做磁盤裝置使用。
不過我們隻是在某一個層級上把它模拟成一個硬體裝置。是以,這個時候我們就得依賴運作于“Dom0”當中的”QEMU“來實作模拟了。這個”QEMU“需要為每一個建立的虛拟機用到IO裝置時,模拟出一個硬體裝置,并映射進真正的實作。比如,多個虛拟機都要用到硬碟的話,可以在”Dom0“挂載好某個硬體裝置的某個分區以後,在裡邊建立多個虛拟的磁盤映像檔案,而後為這個磁盤映像檔案之上蓋上一層軟體,這個軟體能夠模拟出一個控制器晶片,而後把模拟出的這個控制器關聯至這個虛拟機上,這個虛拟機看到的就是一個擁有控制器的硬體晶片裝置。
這樣一來,就會出現一個問題?
首先,”DomU“中的GuestOS要驅動這個控制器晶片才能工作。而我們模拟出來的晶片和它底層真正實作的可能并不完全一樣。更何況,我們這裡隻是一個檔案,壓根就不是硬體裝置。
是以我們應該模拟成哪一種晶片呢?是以最好應該是模拟成市面上非常常見的,我們認為GuestOS核心中一定會有它的驅動程式的晶片類型。比如模拟成希捷的硬碟晶片。而後,對應的GuestOS就必須要裝載對應的模拟出來的晶片以後,才能驅動這個裝置工作。
這個模拟出來的指令工作起來可能會面臨這樣的問題。比如說,在使用者空間有一個使用者程序,這個程序需要寫資料了,意味着它要向核心發起系統調用,這個核心系統調用以後,最終層層轉換成對應的驅動程式完成對這個硬碟裝置的讀寫操作。這個驅動程式把代碼指令轉換完了,可以把轉換後的結果請求給這個控制器晶片,它認為這個晶片就可以執行實體操作了。但這裡不是晶片,而是檔案。是以,在轉給"Dom0"時,”Dom0“的硬碟晶片有可能和"DomU"的晶片不一樣,是以還得依靠”Dom0“的核心去驅動這個實體裝置。是以,資料要想存儲,第一,虛拟機的核心經過驅動程式驅動假晶片完成一次轉換,這個資料最終還要映射為檔案,而這個檔案是放在”Dom0“當中的真正的硬碟裝置上,它又不得不重新驅動一次這個真正的實體裝置,轉換為實體媒體信号再存下來。可以想象,這中間前面的過程是浪費的。這種方式叫模拟。我們可以嘗試着讓它半虛拟化。
怎麼來實作呢?
我們把整個裝置切割成兩段。”Dom0“上仍然模拟出一個裝置出來,但這個裝置就不再模拟市面上常見的某個IO裝置的類型了。而是模拟出一種支援半虛拟化的類型。也就意味着,在前端主機上看來,這個IO裝置僅僅是一個簡單的向”Dom0“發起調用的接口而已。它把整個過程輕量化了,明确告訴前半段這是一個Xen虛拟化出來的裝置。我們知道,”Dom0“要為多個虛拟機都要提供這樣的裝置,為了避免混亂,它把每個裝置都分為兩段來實作,一個叫前端(front),一個叫後端(end),用在虛拟機中的就叫前半段,以硬碟為例,它可能就叫做”block front“。
這個裝置在本地不做任何處理,你請求的資料給這個驅動程式,這個驅動程式直接交給對應的後半段。前半段和後半段直接通信,(它不需要驅動硬體裝置去尋道,大家知道,驅動一個硬碟去尋道,而那個磁盤本來就是模拟出來的,這個尋道過程就沒有必要了),是以,它就直接交給與之對應的後半段,後半段其實也不做多餘的處理,而是交給本地硬體的裝置驅動程式來完成存儲。是以,半虛拟化的這種IO技術就大大的提高了其性能。
還有一個問題?
假如說真正的硬碟隻有一個,在這個硬碟上模拟出了多個磁盤映像檔案,每一個磁盤映像檔案都提供給了一個虛拟機,這些虛拟機都需要執行磁盤IO了,
于是都發起了大量的讀寫操作。這些讀寫操作,即便是用半虛拟化技術,最終還是要轉換成實體裝置的。是以這些虛拟的IO請求的執行就有先後次序,
那麼孰先孰後呢?
是以,它其實是建構成一個環狀緩沖區,每一個環狀緩沖就是一個單獨的請求機關。是以第一個虛拟機來的時候,它就放在這個緩沖區上找一個槽位将其資料放上去,以此類推, 就排在這個環上。當排滿了,也就意味着這個緩沖區滿了,新的IO送出的請求就隻能被阻塞。大體上是通過這種方式來對IO裝置請求速度進行控制的。包括網絡裝置,也一樣使用類似法則進行工作。
總結:
Xen的組成部分:
(1)Xen Hypervisor
xen hypervisor即是xen的虛拟化螢幕,它直接運作在硬體之上,并将計算能力通過抽象接口(hyper call)提供給運作在其上的任何作業系統。它的首要任務是在各虛拟機之間進行CPU資源的配置設定、記憶體資源的配置設定、中斷請求的配置設定,并負責控制共享處理環境的虛拟機的執行。
(2)Dom0
在Xen虛拟化環境中,用”Dom“"Domain"來描述各虛拟機,而且每個虛拟機都有一個唯一的ID進行辨別。是以每個虛拟機通常辨別為”Dom0“、”Dom1“、”Dom2“等。而”Dom0“叫做”Privileged Domain“,也就是指“特權域”。它擁有這個虛拟化環境的管理權限,而且還能夠完成I/O資源的配置設定。是以說“Dom0”是運作在Xen Hypervisor之上的一個獨特的虛拟機,其作業系統核心經過改進以後,除了對I/O資源的配置設定之外,還會提供管理DomU的工具棧,以實作對運作在Xen Hypervisor之上的其他虛拟機進行管理。比如實作對虛拟機進行添加、啟動、快照、停止、删除等操作。
Linux核心自從2.6.37開始就能夠支援"Dom0"。但是那個時候僅僅是原始支援,也就意味着,你把它運作在”Dom0“上,但它的性能表現很差。到3.0以後,對關鍵特性進行了優化,其可以直接運作在Dom0上。
Dom0提供了兩個特殊驅動,為了能夠盡可能使用IO的半虛拟化技術,Dom0還負責在I/O的配置設定上提供兩類裝置的驅動,一類是網絡裝置,一類是塊裝置。這兩類裝置支援半虛拟化技術,也就意味着,它們有前端和後端,網絡裝置的前端叫”net-front“,後端就叫做"net-backend"。對于塊裝置的前端叫做"block-front",後端叫做"block-end"。而且要注意,這兩類裝置的前端是在GuestOS中驅動的,而後端是在"特權域"中驅動的。
(3) DomU
其他的非特權域(Unprivileged Domain),也稱為"DomU"。DomU沒有通路IO資源的權限,主要目的是将DomU隔離開來。
Xen支援兩種不同類型的虛拟模式,一種是PV技術,還有一種是HVM。Xen隻有在CPU支援硬體輔助虛拟化(HVM)的前提下,才能夠支援使用完全虛拟化,否則,就隻能進行半虛拟化。PV指的是對各GuestOS核心需要操作硬體時,它明确知道自己沒有運作在實體機上,而是運作在虛拟化環境中,是以就發起hyper call調用,像這種就叫做半虛拟化技術。但是也可以不用半虛拟化,也可以不用讓GuestOS核心以為自己是運作在虛拟化環境中。因為它認為自己是直接運作在CPU上,但這個時候,其實CPU的環0已經沒有特權指令了,它一旦發起特權指令時,都會引起運作在環-1上hypervisor的警覺。是以,如果硬體支援輔助虛拟化,Xen Hypervisor是運作在環-1上的,這個時候就不需要再将CPU做半虛拟化,就不需要對GuestOS做修改了,像這種就叫做HVM。
當然了,如果我們要使用完全虛拟化技術,就帶來了另外一個問題。要使用完全虛拟化,那GuestOS裡邊的IO裝置通常都是模拟的,而不是完全虛拟化的。是以,有時候可能會這麼做,CPU使用完全虛拟化,但IO裝置依然使用半虛拟化,像這種就叫做PV on HVM。
Xen的PV技術:
PV不要求CPU支援硬體輔助的虛拟化,但要求GuestOS的核心作出修改并知曉自己運作在hypervisor上。是以它無需仿真CPU。
能運作在DomU中的作業系統有:Linux(2.6.24+),NetBSD,FreeBSD,OpenSolaris等。
Xen的HVM技術:
依賴于Intel VT或AMD AMD-V,還要依賴于QEMU來模拟IO裝置。
能夠運作于DomU中的作業系統:幾乎所有支援此x86平台的OS。
PV on HVM:
為了提高性能,HVM客戶機也可以使用特殊的半虛拟化技術驅動。這裡的驅動是專門優化的PV驅動,進而使得HVM不再依賴于磁盤和網絡IO裝置進行模拟,依然可以使用半虛拟化。是以在HVM中,CPU基于HVM完成了完全虛拟化,而各IO裝置是通過Qemu模拟的。在PV技術中,CPU是半虛拟化的,GuestOS通過hyper call來調用,而各硬體裝置雖然通過Qemu做模拟,但它工作為前半段和後半段,依然工作于半虛拟化模式。在PV on HVM技術中,CPU為HVM模式運作,但IO裝置為PV模式運作 。
運作于DomU中的作業系統:隻要OS能驅動PV接口類型的IO裝置即可。IO裝置接口類型為net-front,blk-front。其實作在windows或linux等大多數作業系統都能夠驅動xen之上所謂的前半段。
Xen-半虛拟化架構
在半虛拟化場景中,每一個Guest中CPU和Memory都是由Hypervisor進行調用的,Hypervisor通過半虛拟化技術向我們提供。對每一個IO裝置,都分成前半段(Front end)和後半段(Back End)。
我們在Guest當中,要想能夠驅動它的前半段,就要支援在"dom0"當中能夠驅動後半段的技術。
Xen-完全虛拟化技術架構
在完全虛拟化場景中,每一個Guest中的CPU和Memory仍然是通過Hypervisor提供。Hypervisor借助于硬體輔助的虛拟化,并不要求GuestOS的核心通過hyper call進行調用,
而是直接運作指令就可以。但是對于各IO裝置的運作,要借助于qemu-dm程序,使得将它所有模拟出來的裝置輸出給GuestOS,進而完成完全虛拟化。
Xen工具棧中的工具:
xm/xend:
早期Xen在4.1或4.2時使用的工具是xm,在Xen Hypervisor的Dom0中要啟動xend服務,以便接收來自于xm的指令請求,并在本地完成虛拟機的啟動和停止等管理操作。xm是一個指令行管理工具,有諸多子指令來實作其管理功能:create, destroy, stop, pause...。但xend這種方式有點重量級,因為它要求在每一個Xen Hypervisor的Dom0中都要啟動xend才能工作的。
xl:
基于libxenlight提供的輕量級的指令行工具棧。Xen在4.2起同時提供xm和xl,從4.3開始,xm被提示為廢棄。
xm與xl的差別:
xl直接依賴于libzenlight,而xend也依賴于libzenlight,是以從這個角度發現,xm比xl重量級的多。xl不要啟動任何服務,直接能夠跟libzenlight進行互動,進而能夠實作對xen之上所運作的虛拟機進行管理。
除了這個之外,還有一個工具棧,叫xe/xapi。
xe/xapi:
提供了對xen管理的api,是以多用于cloud環境,而非手動管理虛拟化的環境。目前,Xen Server或XCP(Xen Cloud Platform)預設使用xe/xapi。xen server是由xen所發行的,它自己直接提供了一個作業系統發行CD光牒,能夠直接在CD光牒上運作xen虛拟化環境,或者你也可以安裝後運作xen虛拟化環境的這麼一個linux發行版。xen server早期是收費的,現在已經開源了。xcp是一個企業級應用的xen平台。xen是由英國劍橋大學所研發的,後來它的商業級應用(xen server、xcp等)被思傑(Citrix)收購。
virsh/libvirt:
libvirt工具棧的工作方式:
在每一個運作了hypervisor或vm的主機上,隻需要提供了libvirt庫并啟動了libvirtd服務程序,我們就可以在目前主機或其他主機上使用virsh指令,借助于本地的libvirt庫去連接配接對方主機上運作的libvirtd程序,這個libvirtd程序把它轉換成對本地的虛拟機管理接口的調用。是以它能夠管理xen的虛拟化環境,也能夠管理kvm虛拟化環境,還能管理qemu虛拟化環境。
不過這個工具比較重量級,因為它需要在每一個主機上部署庫而且還要啟動服務。其次,這是虛拟化技術之外的另一套工具,也就是說,xen本來就有提供管理工具了,libvirt還要額外配置使用。
libvirt這套工具使用python語言所研發,而且充分利用了python當中非常容易實作的圖形化程式設計功能。是以它能夠借助于virsh、virt-viewer或virt-manager這些工具棧來提供一個圖形化的管理界面。我們可以點選圖示來管理虛拟的建立、删除等操作。
上面說到的工具,xe或xm它們都是指令行的管理工具,使用起來是很不友善的。是以就有人對這些工具做了擴充。
比如目前網絡中,有n個實體伺服器,這每一個實體伺服器上都部署了hypervisor。要啟動虛拟機的時候,這麼多伺服器哪個上面啟動虛拟機呢? 是以如果有一個管理元件,它能夠直接運作在這四個hypersivor上,并随時監控着這四個hypervisor對各資源的使用狀态。當我們需要啟動虛拟機執行個體時,隻需要向運作在這四個主機上能夠彼此間協調的程序進行請求,由它負責根據你的喜好來決定在哪個伺服器上啟動虛拟機執行個體,并把虛拟機執行個體啟動起來之後配置設定的IP位址、配置設定的記憶體,配置設定的幾顆CPU等告訴我們。這個喜好表示:可以根據CPU的空閑與否,根據記憶體的空閑與否,根據IO的空閑與否為标準等。
這麼一個橫跨多個主機節點,實作資源統一管理和配置設定的應用程式,就叫做雲棧。雲棧環境它在管理時,就不再單單将實體主機視為單個主機,而是把所有資源抽取出來統一排程。比如第一個實體伺服器有4顆實體核心,第二個實體伺服器有八顆核心,它最終把這些内容都抽取出來,放在CPU可用核心池裡。那所有主機上的記憶體總結出來放在可用實體記憶體空間。要啟動一個虛拟機執行個體時,就從CPU裡邊挑幾個,從記憶體裡面挑一點,從各種IO裝置提供的資源裡邊挑一個,湊成一個虛拟來運作。當然,一般而言,CPU和記憶體是不能分離的,挑選的哪個主機上的CPU。記憶體就一定是那個主機上的記憶體,而IO裝置可以通過精巧的方式進行規劃。所謂的雲環境,不過是虛拟化技術更高更抽象層面上離使用者更近的更易于使用者使用的虛拟化管理程式。
XenStore:
為各Domain提供的共享資訊存儲空間;有着層級結構的名稱空間;它位于Dom0上。
Xen的工具棧使用對比:
Dom0 Kernel
DomU Kernel
CentOS對Xen的支援:
RHEL 5.7之前包括5.7:預設的虛拟化技術為xen。RHEL5它的核心版本是2.6.18,而linux核心能夠運作在Dom0中是在3.0以後,2.6.37支援不是很好,是以是在3.0以後。能夠運作在DomU中是在2.6.24以後,都不包含2.6.18。是以那個時候要想使用xen的話,就必須向核心打更新檔,而紅帽替我們做好了,但是它的核心就有了兩個版本。RHEL5.7以前,它的核心版本是kernel-
還有一個叫kernel-xen,如果要想使用RHEL5.7之前的系統的話,安裝kernel就可以,但如果要想運作xen技術,需要安裝kernel-xen核心才可以。
但後來,紅帽收購了以色列的一家公司,那家公司提供了一個叫做KVM的虛拟化技術,好像是10億美元,從此有了KVM之後,RHEL從5.8開始同時支援xen和kvm,并且到RHEL6以後,Xen就被抛棄了,隻支援KVM。不但僅支援KVM,更不可思議的是,他們把某些虛拟化軟體當中對Xen的支援功能在編譯時還有意剝離了。是以centos6上沒辦法直接使用Xen的,RHEL7同樣不支援Xen,不過雖然不支援Xen,但它支援運作在Xen的虛拟化環境中。
如何在CentOS 6.6上使用Xen:
手動制作的話:
(1)編譯3.0以上版本的核心,啟動對Dom0的支援;
(2)編譯Xen程式;
制作好相關程式包的項目:
xen4centos
xen made easy
xen4centos:Xen官方專門為centos發行版額外提供Xen的項目。
配置xen的yum源:http://mirrors.sohu.com/centos/6/virt/x86_64/xen-46/
由于要安裝xen就不得不安裝一個新的核心,否則要自己編譯。這個核心當中要啟用對Dom0的支援。
xen hypersivor要自己啟動在硬體上,是以我們不能直接啟動新版核心。是以,這裡不能把它當新版核心來用,我們要額外加一個kernel行
# vim /etc/grub.conf
grub配置:
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (4.9.127-32.el6.x86_64)
root (hd0,0)
kernel /xen.gz dom0_mem=1024M cpufreq=xen dom0_max_vcpus=2 dom0_vcpus_pin
module /vmlinuz-4.9.127-32.el6.x86_64 ro root=/dev/mapper/myvg-root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=myvg/root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
module /initramfs-4.9.127-32.el6.x86_64.img
title CentOS 6 (2.6.32-754.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=/dev/mapper/myvg-root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=myvg/root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-754.el6.x86_64.img
說明:
kernel /xen.gz dom0_mem=1024M cpufreq=xen dom0_max_vcpus=2 dom0_vcpus_pin
kernel /xen.gz //kernel指定xen為核心
dom0_men //dom0的記憶體
cpufreq //CPU的工作頻率由xen來控制
dom0_max_vcpus //dom0最多使用cpu數,當然共享也可以
dom0_vcpus_pin //dom0啟動起來之後,會把dom0所使用的實體核心就固定在它所使用的實體核心上,不讓它排程
module //這個核心就要以子產品的方式運作在dom0上,是dom0的核心。
grub.conf boot options: http://xenbits.xenproject.org/docs/unstable/misc/xen-command-line.html#xen-hypervisor-command-line-options
官方Man手冊:http://wiki.xenproject.org/wiki/Xen_Man_Pages
顯示Domain的相關資訊
# xl list
xen虛拟狀态:
r: running
b: 阻塞
p: 暫停
s: 停止
c: 崩潰
d: dying,正在關閉的過程中
對于xl而言,其建立DomU使用的配置指令可通過“man xl.cfg”擷取
常用指令:
name: 域唯一的名字
builder="generic": 指明虛拟機的類型,generic表示pv,hvm表示hvm
vcpus=N: 虛拟cpu的個數
maxvcpus=M: 最大虛拟cpu個數
cpus="CPU-LIST": vcpu可運作于其上實體CPU清單
memory=MBYTES: 虛拟機的記憶體大小
maxmem=MBYTES: 最大記憶體空間
on_poweroff="ACTION": 指明關機時采取的action
destory, restart, preserve
on_reboot="ACTION": 指明”重新開機“DomU時采取的action
on_crash="ACTION":虛拟機以外崩潰時采取的action
uuid: DomU的唯一辨別
disk=[ "DISK_SPEC_STRING", "DISK_SPEC_STRING", ...]: 指明磁盤裝置,清單
vif=[ "NET_SPEC_STRING", "NET_SPEC_STRING", ...]: 指明網絡接口,清單
vtpm=[ "VTPM_SPEC_STRING", "VTPM_SPEC_STRING", ...]: 可信的平台子產品
vfb=[ "VFB_SPEC_STRING", "VFB_SPEC_STRING", ...]: 指明virtual frame buffer,清單
pci=[ "PCI_SPEC_STRING", "PCI_SPEC_STRING", ... ]: 指明pci接口,清單
PV模式專用指令:
kernel="PATHNAME": 核心檔案路徑,此為Dom0中的路徑
ramdisk="PATHNAME": 為kernel指定核心提供的ramdisk檔案路徑
root="STRING": 指明根檔案系統
extra="STRING": 額外傳遞給核心引導時使用的參數
bootloader="PROGRAM": 如果DomU使用自己的kernel及ramdisk,此時需要一個Dom0中的應用程式來實作其bootloder功能
磁盤參數指定方式:
官方文檔:http://xenbits.xen.org/docs/unstable/misc/xl-disk-configuration.txt
[<target>, [<format>, [<vdev>, [<access>]]]]
<target>表示磁盤映像檔案或裝置檔案路徑:比如/images/xen/linux.img, /dev/myvg/linux
<format>表示磁盤格式,如果是映像檔案,有多種格式,例如raw, qcow, qcow2
vdev:此裝置在DomU中被識别為硬體裝置類型,支援hd[x], sd[x], xvd[x]
access:通路權限
ro, r:隻讀
rw, w:讀寫
示例:disk=[ "/images/xen/linux.img,raw,xvda,rw", ]
busybox編譯成靜态連結格式,友善遷移:
# yum install glibc-static
# make menuconfig
Busybox Settings --> Build Options --> [*] Build BusyBox as a static binary (no shared libs)
# make && make install
示例:
建立一個pv格式的vm:
(1) 準備磁盤映像檔案
# qemu-img create -f raw -o size=2G /images/xen/busybox.img
# mke2fs -t ext2 /images/xen/busybox.img
(2) 提供根檔案系統
編譯busybox,并複制到buxybox.img映像中
# mount -o loop /images/xen/busybox.img /mnt
# cp -a $BUSYBOX/_install/* /mnt
# mkdir /mnt/{proc,sys,dev,var}
(3)提供DomU配置檔案
# cp xlexample.pvlinux busybox
name = "busybox-001"
kernel = "/boot/vmlinuz"
ramdisk = "/boot/initramfs.img"
extra = "selinux=0 init=/bin/sh"
memory = 256
vcpus = 2
disk = [ '/images/xen/busybox.img,raw,xvda,rw' ]
root="/dev/xvda ro"
(4) 啟動執行個體:
xl [-v] create <DomU_Config_file> -n
xl create <DomU_Config_file> -c //啟動執行個體并立即連到控制台上
退出Dom0: Ctrl + ]
如何配置網絡接口:
vif = [ '<vifspec>', '<vifspec>', ... ]
vifspec: [<key>=<value>|<flag>,]
常用的key:
mac=: 指定mac位址,要以00:16:3e開頭
bridge=<bridge>: 指明此網絡接口在Dom0中被關聯至哪個橋裝置上
mode=<MODE>: 虛拟成哪一種常見的網絡接口,可以是e1000,rt18139等
vifname=: 指明接口名稱,在Dom0中顯示的名字
script=: 執行的腳本
ip=: 指定ip位址,會注入到DomU中
rate=: 指明裝置的傳輸速率,通常為”#UNIT /s“格式
UNIT: GB, MB, KB ,B for bytes
Gb, Mb, Kb, b for bits
配置橋接的方式
(1)添加網橋裝置
br0
(2)虛拟機配置檔案中啟用網卡
vif = [ 'bridge=br0' ]
(3)複制網絡裝置檔案到虛拟機
# cp xen-netfront.ko 8139too.ko mii.ko /mnt/lib/modules/
(4)虛拟機裝載網絡接口
# insmod /lib/modules/xen-netfront.ko
(5)給虛拟機中的前端接口配置位址
# ifconfig eth0 192.168.2.21 up
# ping 192.168.2.1
建立虛拟通道:
(1)虛拟機2準備磁盤映像檔案
# cp /images/xen/busybox.img /images/xen/busybox2.img
(2) 虛拟機2準備配置檔案
# cp /etc/xen/buxybox /etc/xen/buxybox2
(3) 準備橋裝置,可以不用給位址,啟用起來就好
# ifconfig br1 up
(4) 虛拟機1裝載網卡并配置IP位址
# insmod /lib/modules/xen-netfront.ko
# ifconfig eth0 10.0.11.1 up
(5) 虛拟機1裝載網卡并配置IP位址
# insmod /lib/modules/xen-netfront.ko
# ifconfig eth0 10.0.11.2 up
(6)測試虛拟機1與虛拟機2可以通信
# ping
xl的其他常用指令:
shutdown: 關機,# xl shutdown busybox-001
reboot: 重新開機, # xl reboot busybox-001
pause: 暫停到記憶體中, # xl pause busybox-001
unpause: 解除暫停, # xl unpause busybox-001
console: 連接配接虛拟機控制台, # xl console busybox-001
save: 類似于vmware的挂起,将DomU的記憶體中的資料轉存至指定的磁盤檔案中
使用格式:xl [-vf] save [options] <Domain> <CheckpointFile> [<ConfigFile>]
示例: # xl save busybox-001 /tmp/busybox-001.img /etc/xen/busybox
restore: 從指定的磁盤檔案中恢複DomU記憶體資料
使用格式: xl [-vf] restore [options] [<ConfigFile>] <CheckpointFile>
示例: # xl restore /etc/xen/busybox /tmp/busybox-001.img
cd-insert: 手動模拟插入光驅
cd-eject: 彈出光驅
這兩個指令一般要求啟動執行個體時指明了max memory後才能使用
mem-max: 指明記憶體最大上限
mem-set: 設定目前的記憶體大小
vcpu-list: 顯示指定的域上有多少顆虛拟cpu,# xl vcpu-list busybox-002
vcpu-set: 設定一個域上可以允許的活躍的CPU的個數,xl vcpu-set busybox-002 4
vcpu-pin: 将vcpu固定在哪些實體核心上,# xl vcpu-pin busybox-002 0 3
info: 檢視目前xen hypervisor的摘要資訊,# xl info busybox-002
domid: 傳回目前domain的ID,# xl domid busybox-002
domname: 根據domid顯示名字, # xl domname 10
dmesg: 顯示指定的domain啟動時的引導資訊, # xl dmesg busybox-002
top: 檢視domain資源占用排序狀态的指令,# xl top busybox-002
network-list: 檢視指定域使用網絡及接口;# xl network-list busybox-002
network-attach: 手動添加一塊網卡,支援熱插拔; # xl network-attach busybox-002 bridge=br0
network-detach: 拆除網卡;# xl network-detach busybox-002 2
block-attach: 添加一個磁盤映像檔案;# xl block-attach busybox-002 '/images/xen/busybox1.2.img,qcow2,xvdb,w'
block-list: 顯示指定域的所有磁盤映像檔案;# xl block-list busybox-002
block-detach: 拆除指定域的磁盤; # xl block-detach busybox-002 51728
uptime: 檢視指定域的運作時長;# xl uptime busybox-002
losetup - 設定并管理本地回環裝置
losetup -a : 顯示所有已用的loop裝置相關資訊
losetup -f : 顯示第一個空閑的loop裝置
# losetup /dev/loop0 /images/xen/busybox-003.img
使用DomU自有kernel來啟動運作DomU:
制作磁盤映像檔案:
# qemu-img create -f qcow2 -o size=5G,preallocation=metadata /images/xen/busybox-003.img
/etc/xen/busybox3:
name = "busybox-003"
memory = 256
vcpus = 2
vif = [ 'bridge=br0' ]
disk = [ '/images/xen/busybox3.img,raw,xvda,rw' ]
bootloader="/usr/bin/pygrub"
使用xl指令進行建立虛拟機并完成Centos 6.6的系統安裝:
(1) 建立磁盤映像檔案
(2) 擷取安裝指定版本的系統所需要的kernel及initrd檔案
(3) 建立DomU配置檔案,示例如下:
name = "centos-001"
kernel = "/images/kernel/vmlinuz"
ramdisk = "/images/kernel/initrd.img"
extra = "ks=http://192.168.2.20/myks.cfg"
memory = 516
vcpus = 2
vif = [ 'bridge=br0' ]
disk = [ '/images/xen/centos.img,qcow2,xvda,rw' ]
on_reboot = "shutdown"
(4) 安裝完成後,建立虛拟機的配置檔案需要作出修改
name = "centos-001"
bootloader = "pygrub"
memory = 516
vcpus = 2
vif = [ 'bridge=br0' ]
disk = [ '/images/xen/centos.img,qcow2,xvda,rw' ]
啟動圖形視窗:
在建立虛拟機的配置檔案中定義vfb
(1) vfb = [ 'sdl=1' ]
(2) vnc
(a) yum install tigervnc //使得我們有vncviewer可用
(b) vfb = [ 'vnc=1' ]
vnc監聽的端口為5900, 相應的DISPLAYNUM為0
# yum install libvirt libvirt-daemon-xen virt-manager python-virtinst libvirt-client
# service libvirtd start
virt-manager, virsh, virt-install