Xen虛擬化及基於Domain U的Tiny Linux

Xen基本原理 http://my.oschina.net/davehe/blog/94039
一、Xen概述
英國劍橋大學計算機實驗室開發了Xen開源項目。除了劍橋大學的科學家以外,很多其它IT領域集團也都參與了Xen開源項目,其中包括IBM、AMD、 HP、Red Hat和Novell。 Xen支持x86、x86-64、安騰( Itanium)、Power PC和ARM多種處理器,因此Xen可以在大量的計算設備上運行,目前Xen支持Linux、NetBSD、FreeBSD、Solaris、Windows和其他常用的操作系統作爲Guest OS在其管理程序上運行。Xen的創始人成立了他們自己的公司XenSource(後被Citrix收購),目的是爲了基於Xen hypervisor而提供一個完善的虛擬化解決方案。同時與其它虛擬化產品(如VMware ESX)也有競爭。其它企業也在它們自己的產品中綜合應用了Xen hypervisor。例如,Linux廠商Red Hat和Novell公司都在自己的操作系統中包含了各自版本的Xen。由於Xen的大多數部分都是開源的,所以這些解決方案都非常相似。
二、Xen基本組件
Hypervisor: 在硬件與虛擬機之間,是必須最先載入到硬件的第一層,只實現CPU,Memory,
Inturrupt3種資源的虛擬。Hypervisor載入後,就可以部署虛擬機了。在Xen中,虛擬機叫做domain。
Domain 0: 運行在Hypervisor之上,通常來說必須和Hypervisor同時部署,是具有直接訪問硬件和管理控制其他虛擬機的特權Guest OS,並提供通用I/O設備的驅動
DomainU: 運行在Hypervisor之上的普通Guest OS,不能直接訪問硬件資源,可以獨立並行的存在多個。Domain U中的Guest OS要想使用某個硬件設備,就必須把對硬件的請求發給Domain 0。
這裏寫圖片描述
三、Xen的完全虛擬化
如果對Xen實現完全虛擬化,也就意味着必須要在Domain 0中創建基於軟件模擬出來的硬件,這就要依賴於QEMU實現,而後由Domain U提供模擬出來的硬件的驅動程序
這裏寫圖片描述
四、Xen的半虛擬化
不再需要QEMU模擬硬件,驅動程序分爲兩段,前半段在Domain U上成爲Frontend,後半段在Domain 0上姑且稱爲BackEnd,Guest OS要想使用I/O設備,通過一種類似於半虛擬化中對hypercall的調用的機制,將請求發往Domain 0,由Domain 0轉換後交給物理設備。通常在Domain 0中通過半虛擬化提供的硬件設備主要有網卡和硬盤這兩類。
這裏寫圖片描述
五、Xen管理工具介紹
Xen-4.1之前使用的管理工具是xend/xm,Xen安裝完成後需要啓動xend服務,然後使用xm即可實現對虛擬機的管理。4.1版本以後引入了一個新的輕量級管理工具xl,4.1同時提供了xl和xm,但xl和xm不兼容,使用xl時xend服務不可啓動。XAPI是xen雲平臺上使用的管理工具,與xend類似都是將虛擬化的管理功能通過庫的形式輸出給用戶,它們都通過libxenlight庫與xen打交道。
這裏寫圖片描述
六、安裝Xen
自從RedHat在RHEL 6放棄 Xen 後,下載Xen源碼編譯安裝似乎是在 RHEL/CentOS 6.x 上安裝 Xen 的唯一辦法。不過,開源世界永遠不缺少熱情的志願者,Xen Made Easy 這個項目提供了可用的Xen第三方軟件源,免去了自己編譯源碼的痛苦。現在,我們有了更好的官方選擇——Xen4CentOS6,它是CentOS, Xen, Citrix, Godaddy, Rackspace 社區和相關團隊合作開發的一個開源項目,旨在爲 CentOS 6.x 維護一個穩定的Xen工具鏈(Xen hypervisor 和相關 Xen 工具),讓 Xen運行在CentOS 6.x上變得更容易,更可靠。
http://www.vpsee.com/2014/01/install-xen-on-centos-6-5/
按照上面的鏈接中的方法我在VMware中已安裝好的CentOS 6.4_X86_64的虛擬機上安裝xen
查看CPU信息:pae表示CPU支持半虛擬化,如果輸出信息還有vmx/svm(vmx爲Intel,svm爲AMD),那麼CPU支持全虛擬化
這裏寫圖片描述
安裝CentOS官方Xen源、Xen內核和相關依賴包

[root@virtual ~]# yum install centos-release-xen
[root@virtual ~]# yum install xen

這裏寫圖片描述
安裝完成後/usr/bin下會自動生成與xen相關的命令,其中有一個腳本grub-bootxen.sh,執行此腳本即可在grub.conf中自動添加一個引導Xen內核的條目
這裏寫圖片描述

[root@virtual ~]# sh /usr/bin/grub-bootxen.sh 
[root@virtual ~]# vim /boot/grub/grub.conf 

從下圖可以看到,Xen內核已經在grub.conf中了,default=0,重啓系統就會默認啓動3.18版本的內核
這裏寫圖片描述
[root@virtual ~]#reboot
陷入無限重啓循環,觀察信息,發現報錯:CPU恐慌:沒有足夠的內存爲DOM0預留
這裏寫圖片描述
於是編輯虛擬機設置,放大內存;也可以將上一步驟中的grub.conf裏dom0_mem調小
這裏寫圖片描述
重啓後繼續陷入無限重啓循環,定位報錯:無法初始化設備/dev/Mcelog
mcelog 是 X86架構上(32bit and 64bit) 的 Linux 系統上用來檢查硬件錯誤,特別是內存和CPU錯誤的工具
內核恐慌:不同步:VFS:無法掛載根文件系統到未知塊
這裏寫圖片描述
查閱網上資料解決思路有以下個方面:

  • /etc/fstab文件配置錯誤
  • /boot/grub/grub.conf文件配置錯誤
  • initrd沒有啓動
  • 內核編譯的時候沒有添加相應的硬件模塊

於是手動選擇系統原裝2.6.32版內核,系統正常啓動,將問題定位在grub.conf,仔細查看發現Xen內核引導少了initrd這一項,initramfs可以理解爲是從虛擬文件系統切換到真正根文件系統的橋樑,詳細知識點與linux啓動流程相關。編輯/boot/grub/grub.conf添加以下一行將initramfs作爲模塊裝載
這裏寫圖片描述
這裏寫圖片描述
重新啓動後確保xen內核已經啓動並支持xen功能
這裏寫圖片描述
啓動服務,執行xm info 查看相關信息
這裏寫圖片描述
七、Domain U實現
xm create命令能夠基於預配置的根文件系統、能運行於Xen Domain U的內核、ramfs和Xen配置文件啓動Domain U,當然,在其啓動之前,所有需要用到的其它組件都需要準備就緒方纔可以。這一切準備就緒後,使用xm create命令有點類似於按下主機的電源按鈕對其進行啓動。下面開始基於Domain 0(VMware中已安裝好的CentOS 6.4_X86_64虛擬機)製作一個運行於Domain U的微型Linux系統。
詳細的Linux系統剪裁可參見
http://blog.csdn.net/celeste7777/article/details/47442913
http://blog.csdn.net/celeste7777/article/details/46850681
1、製作根文件系統,創建空的虛擬磁盤映像,以之作爲新建非特權域的虛擬磁盤映像文件,此映像文件並不真正佔用爲其指定的空間,而是隨着存儲的內容而變化,即創建一個虛擬稀疏磁盤鏡像,其中文件的路徑和其虛擬空間大小可根據需要進行指定。
這裏寫圖片描述
2、將此虛擬磁盤映像格式化爲ext4文件系統;這裏也可以使用其它文件系統,但要確保用於Domain U的內核支持此文件系統。此外,如果指定的文件系統是以內核模塊的形式存在,那麼還需要將對應的內核模塊複製到後面製作的根文件系統上相應的路徑下。對於這裏的Domain 0來說,其內核將ext4文件系統直接編譯進了內核,下面也將此內核用於後面要啓動的Domain U。
這裏寫圖片描述
3、將格式化完畢的虛擬磁盤映像文件掛載至某目錄下,如/mnt,並創建根文件系統目錄結構。
這裏寫圖片描述
4、Linux系統的啓動過程中,內核初始化完成後,會運行/sbin/init以啓動PID號爲1的init進程,並在其配置文件的輔助下啓動完成掛載額外文件系統、啓動服務、啓動終端等後續任務。這裏將/sbin/init的任務精簡爲僅啓動bash進程並打印命令提示符於終端;執行腳本將二進制程序init,cat,ls,bash所依賴的庫文件複製到虛擬磁盤映像文件掛載點/mnt中對應的路徑下,複製完chroot到/mnt測試命令是否可執行。
這裏寫圖片描述
如果還想讓目標系統能夠執行其它命令,照此法進行即可。
這裏寫圖片描述
5、/sbin/init的運行還需要/etc/init目錄以.conf結尾的配置文件。這裏爲其建立一個簡單的配置文件/mnt/etc/init/rcS.conf,內容如下。
這裏寫圖片描述
6、上面的配置文件依賴於/etc/rc.d/rc.sysinit腳本來完成系統的初始化,因此編輯/mnt/etc/rc.d/rc.sysinit,添加如下內容,而後賦予其執行權限;完成後卸載此磁盤映像文件。
這裏寫圖片描述
7、至此根文件系統已經制作完畢,接着還需要能運行於DomU的內核,相應的ramfs和Xen配置文件。事實上,在xen上基於半虛擬化創建Domain U中Guest OS,Guest OS可以沒有內核。因此,在配置文件中直接使用Domain 0的內核,Domain U只需提供rootfs即可,注意Domain U啓動後在內存中是有內核的。
這裏寫圖片描述
接下來只需再爲目標DomU提供一個配置文件,其就能啓動了。於是我們去新配置文件/etc/xen/test,其內容如下。

[root@virtual ~]# man xm
xm create /dev/null ramdisk=initrd.img \
                    kernel=/boot/vmlinuz-2.6.12.6-xenU \
                    name=ramdisk vif='' vcpus=1 \
                    memory=64 root=/dev/ram0

這裏寫圖片描述
Xen配置文件一般由選項(options)、變量(variables)、CPU、網絡、PCI、HVM、計時器(timers)、驅動(drivers)、磁盤設備(disk devices)、動作(behavior),以及圖形及聲音(Graphics and audio)幾個段組成,分別用於定義不同類別的域屬性或設備屬性。
上面的配置文件中的各選項作用如下。

  • kernel:爲當前域指定可用於DomU的內核文件;
  • ramdisk:與kernel指定的內核文件匹配使用的ramdisk映像文件,根據需要指定,此爲可選項;
  • name:當前域的獨有名稱;每個域必須使用全局惟一的名稱,否則將產生錯誤;
  • memory:當前域的可用物理內存空間大小,單位爲MB,默認爲128;
  • disk:當前域的所有可用磁盤設備列表,格式爲disk = [ “disk1”, “disk2”,…],每個disk都有三個參數進行定義,格式爲“backend-dev,front-dev,mode”;
    backend-dev主要有兩種類型,物理設備或虛擬磁盤映像文件,它們的格式分別爲“phy:device”和“file:/path/to/file”;
    frontend-dev定義其在DomU中的設備類型;
    mode則用於定義其訪問權限,r爲只讀,w爲讀寫;
  • vcpus:配置給當前域使用的虛擬CPU的個數;默認爲1;
  • root:爲當前域指定其根文件系統所在的設備,這個將作爲內核參數在內核啓動傳遞給內核;
  • extra:傳遞給內核的額外參數,其中selinux=0表示禁用selinux,init則用於指定init程序的路徑;多個參數之間使用空格隔開;
  • on_reboot:執行xm reboot命令或在當前域內部執行重啓操作時由Xen執行的動作;其常用的值爲destroy和restart;
  • on_crash:當前域由於各種原因崩潰時由Xen執行的動作;其常用的值爲destroy、restart和preserve,preserve可以保存系統崩潰前的狀態信息以用於調試;
  • on_reboot:執行xm shutdown命令或在當前域內部執行關機操作時由Xen執行的動作;

其它常用參數:

vif:定義當前域的可用虛擬網絡接口列表,每個虛擬網絡接口都可以使用“name=value”的格式定義其屬性;也可在定義某接口時不指定任何屬性,其所有屬性將均由系統默認配置;例如:vif = [‘ip = “192.168.1.19”, bridge=xenbr0’]

  • type:接口設備的類型,默認爲netfront;
  • mac:MAC地址,默認爲隨機;
  • bridge:橋接到的物理設備,默認爲Dom0中的第一個橋接設備;
  • ip:ip地址;
  • script:配置此接口的腳本文件,省略時將使用默認的配置腳本;
  • vifname:後端設備的設備名稱,默認爲vifD.N,其中D爲當前域的ID,N爲此網絡接口的ID;

vfb:爲當前域定義虛擬幀緩衝,其有許多可用屬性,可以使用“name=value”的格式進行定義;

  • vnc或sdl:定義vnc的類型,vnc=1表示啓動一個可由外部設備連接的vnc服務器,sdl=1則表示啓用一個自有的vncviewer;兩者可以同時使用;
  • vncdisplay:vnc顯示號,默認爲當前域的ID,當前域的VNC服務器將監聽5900+此顯示號的端口;
  • vnclisten:VNC服務器監聽的地址,默認爲127.0.0.1;
  • vncunused:如果此屬性的值爲非零值,則表示vncserver監聽大於5900的第一個沒被佔用的端口;
  • vncpasswd:指定VNC服務器的認證密碼;
  • display:用於域的自有vncviewer顯示,默認爲DISPLAY環境變量的值;

cpu:指定當前域應該在哪個物理CPU上啓動,0表示第一顆CPU,1表示第二顆,依次類推;默認爲-1,表示Xen可自行決定啓動當前域的CPU;
cpus:指定當前域的VCPU可以在哪些物理CPU上運行,如cpus = ”3,5-8,^6”表示當前域的VCPU可以在3,5,7,8號CPU上運行;
bootloader: bootloader程序的路徑;基於此bootloader,PV DomU的內核也可直接位於其文件系統上而非Dom0的文件系統;

更多的選項請參見xmdomain.cfg的手冊頁,或參考Xen官方wiki鏈接http://wiki.xen.org/wiki/XenConfigurationFileOptions中的詳細解釋。

8、啓動名爲vm1的Domain U ,可使用xm create命令或xl create命令,但要使用xm命令,需要事先啓動Xend服務;然而,要使用xl命令,則不能啓動Xend服務。在Domain 0的終端上執行xm list命令即可查看vm1的運行狀態。
這裏寫圖片描述
使用xm console打開控制檯管理虛擬機,也可以在create後加上-c選項表示啓動後直接連接至虛擬機的終端,整個啓動過程就在當前屏幕上顯示,如下所示成功啓動Domain U後的最後幾行。
這裏寫圖片描述

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