初探 Xen
Xen 的虛擬類型與特色
虛擬機器的運作效率與實體機器的效能相當;
最多可支援到具有 32 顆以上 CPU 的主機環境;
支援 x86/32, x86/32 含 PAE 技術, 及 x86/64 的硬體平台環境;
良好的硬體驅動程式支援,幾乎支援所有的 Linux 裝置之驅動程式;
Xen 的半虛擬化技術主要是用在相同版本的 Linux 上面,也就是說,如果妳想要使用半虛擬化的方式啟動多個虛擬機器, 那麼那些虛擬機器全部都必須是相同的作業系統,甚至要求相同版本與相同核心的 Linux distribution 喔。 如果妳想要安裝不同版本的 Linux 或者是其他的 OS (例如 Windows XP) 時,就得要使用全虛擬化技術了。 但是全虛擬化技術是有其限制的,當你的硬體滿足下列需求時,全虛擬化技術才能夠動作:
你的硬體支援 Intel 的 VT 技術 (Virtualization Technology, Intel-VT);
你的硬體支援 AMD 的 SVM 技術 (Secure Virtual Machine, AMD-SVM or, AMD-V)。
此外,上面提到的 PAE 指的是 Intel 的實體位址延伸技術 (Physical Addressing Extensions, PAE), 這項技術可讓原本僅支援到 4GB 實體記憶體的 32 位元硬體平台,可支援到最大 64GB 的記憶體喔! 而且, Xen 幾乎可以在所有的 P-II 以上等級的硬體平台上面跑半虛擬化任務,如果不跑全虛擬化的話,其實效能確實是 OK 的啦! 近來由於虛擬機器軟體的流行,加上 x86 電腦效能與 CPU 運算核心單元的增加,兩大 x86 CPU 製造商 Intel/AMD 都發表了新的整合到 CPU 的虛擬技術,分別是 Intel 的 Vanderpool 虛擬技術以及 AMD 的 Pacifica 技術。 這些技術有的也支援 Xen ,這讓 Xen 的效能增進不少呢! ^_^
Xen 的運作環境解釋
確定你的硬體是否支援 Xen 的運作
半虛擬化 (Para-virtualization) 硬體需求:
只要是 64 位元的 x86 主機 (x86_64) 都能夠支援半虛擬化的環境。如果是 32 位元的主機 (x86) 時, 該主機必須要支援的實體位址延伸技術 (PAE) 才能夠使用 xen 喔!那如何確認呢?很簡單,檢查 CPU 的參數即可:[root@linux ~]# cat /proc/cpuinfo | grep flagsflags : fpu tsc msr pae mce cx8 mtrr mca cmov pat pse36 mmx fxsr sse up
全虛擬化 (Fully-virtualization) 硬體需求:
如果妳需要全虛擬化的技術支援時,此時需要硬體有支援虛擬化技術才行。 目前在 x86 的主機當中, Intel 提供 VT 技術, AMD 則提供 SVM 技術。 這兩種技術在 CPU 的旗標分別是: Intel (vmx) 與 AMD (svm) 。 鳥哥在 Core Duo 主機上面的測試可以發現:如果確定你的 CPU 有支援上述的條件後,嘿嘿!那我們就可以開始底下的遊戲啦!如果沒有支援呢? 那很抱歉,底下的資料看看就好!在 Intel Core 2 Duo 的 CPU 主機上面測試 CPU 旗標:[root@linux ~]# cat /proc/cpuinfo | grep flagsflags : fpu tsc msr pae mce cx8 apic mtrr mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc up pni monitor ds_cpl vmx est tm2 cx16 xtpr lahf_lm# 瞧!是有那個 vmx 的支援啦!
在 AMD Athlon(tm) 64 X2 的 CPU 主機上面測試 CPU 旗標:[root@linux ~]# cat /proc/cpuinfo | grep flagsflags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow pni cx16 lahf_lm cmp_legacy svm extapic cr8legacy 3dnowprefetch ts fid vid ttp tm stc 100mhzsteps # 瞧!是有那個 svm 的支援啦!
所需要的 Xen 套件與核心
kernel-xen:修改的 Linux 核心,使可以跑 Xen 的環境;
xen:主要的 xen 套件,包括設定檔、啟動腳本、所需的基本函式庫等;
xen-libs:Xen 所需要的函式庫等;
python-virtinst:提供終端機安裝的軟體;
virt-manager:為一個圖形使用者介面軟體,可在圖形介面管理 xen 喔!
在 CentOS 5.x 的環境下,妳可以使用 yum 直接來安裝這幾個套件。安裝完畢後請務必使用新的核心開機! 以鳥哥的例子來說,我安裝了數個核心,包括 kernel-2.6.18-8.1.14.el5 及 kernel-xen-2.6.18-8.14.el5 , 所以在 grub 的設定檔當中會像這樣:
[root@linux ~]# vi /boot/grub/menu.lstdefault=0timeout=5splashp_w_picpath=(hd0,0)/boot/grub/splash.xpm.gzhiddenmenutitle CentOS (2.6.18-8.1.14.el5xen) root (hd0,0) kernel /boot/xen.gz-2.6.18-8.1.14.el5 module /boot/vmlinuz-2.6.18-8.1.14.el5xen ro root=/dev/hda1 rhgb quiet module /boot/initrd-2.6.18-8.1.14.el5xen.imgtitle CentOS (2.6.18-8.1.14.el5) root (hd0,0) kernel /boot/vmlinuz-2.6.18-8.1.14.el5 ro root=/dev/hda1 rhgb quiet initrd /boot/initrd-2.6.18-8.1.14.el5.img |
[root@linux ~]# uname -r2.6.18-8.1.14.el5xen# 仔細看,鳥哥的核心為新的 xen 的核心喔![root@linux ~]# chkconfig --list | grep xenxend 0:off 1:off 2:on 3:on 4:on 5:on 6:offxendomains 0:off 1:off 2:off 3:on 4:on 5:on 6:off# Runlevel 3/5 的 xen 相關服務是有啟動的才行![root@linux ~]# pstree -p | grep xen | |-xenbus(10) | `-xenwatch(9) |-xenconsoled(2348)---{xenconsoled}(2349) |-xenstored(2340)# 這樣看來,應該確實是有啟動的樣子喔!繼續最後一個確認![root@linux ~]# xm listName ID Mem(MiB) VCPUs State Time(s)Domain-0 0 462 1 r----- 49.2# xm 為 Xen 的重要指令,list 為列出已經在跑的 xen 系統,預設有 domain-0 存在! |
xen 的套件結構
我們前面談到過, Xen 在 domain-0 是由一個 xend 的服務所管理的,他可以用來啟動、關閉與連結到其他的 domain-U 當中。此外, Xen 亦提供許多的指令來讓系統管理員管理他們的 domain-U 啊!這些重要的啟動執行檔為:在妳安裝完畢,並且使用新核心啟動後,接下來讓我們開始來處理一個小案例吧!/usr/sbin/xend:就是 xend 的啟動腳本,使用 python 程式語言寫成的;
/usr/sbin/xm:重要的管理 xen 的指令,可輸入 xm help 查詢用法。
/etc/xen/xend-config.sxp:這個重要!是 xend 的設定檔!內容包括 domain-0 的類型、網路的連結方式、 domain-0 的記憶體與CPU等資源配置、是否使用 vnc 作為 domain-U 的連線方式等等。 不過,鳥哥覺得,這個檔案不太需要更動,使用預設值就很夠用了。
/etc/xen/:裡面含有數個 domain-U 的設定檔範本,包括:xmexample1, xmexample.hvm。 其中,那個 xmexample.hvm 可作為完整模擬的參考範本喔!
/etc/xen/auto:如果妳想要在系統開機時就自動啟動某個 domain-U 的話,可以將該設定檔指定連結到這個目錄中。 舉例來說,如果妳要在開機後立即使用 /etc/xen/xmexample.hvm 設定檔來啟動某個 domain-U , 那可以這樣做:
[root@linux ~]# cd /etc/xen/auto[root@linux auto]# ln -s ../xmexample.hvm .# 這只是個範例,妳可不要跟著做!因為 xmexample.hvm 還需要修改才能運作!
/etc/xen/scripts:這目錄有趣了!包括虛擬設備的啟動、虛擬網路的啟動、 虛擬橋接器的啟動等等,都是透過這目錄底下的所有檔案來達成的!
第一個泛用實例
step 1: 按下電源,主機開始讀取 BIOS 資料;
step 2: 取得開機的裝置順序,並由 MBR 取得開機選單與開機管理程式;
step 3: 由開機管理程式載入 Linux kernel 及虛擬磁碟 (initrd);
step 4: Kernel 偵測硬體載入適當的驅動程式,並掛載根目錄以讀取核心模組;
step 5: 開始由 /sbin/init 程式設定主機的環境。
硬體支援性
就如同前面幾個小節談到的,如果我們的硬體並不支援 xen 所必須要的功能,那麼妳是無法建立好你的 domain-U 的! 在這個泛用案例當中我們的重點是測試半虛擬化,因此妳只要具有 PAE 的支援即可。 鳥哥以較低階的 P-III 800 來進行測試,硬體檢查的結果是這樣的:[root@linux ~]# cat /proc/cpuinfo | grep flagsflags : fpu tsc msr pae mce cx8 mtrr mca cmov pat pse36 mmx fxsr sse up
根目錄所需磁碟槽
根目錄所需磁碟槽的來源可以有兩個,一個是實體硬碟,一個是利用 dd 建立一個大檔案來使用。 鳥哥比較傾向利用 dd 來處理你的根目錄喔!妳可以這樣做:範例:建立一個 5GB 的大檔案[root@linux ~]# mkdir -p /disk2/xen# 因為鳥哥的 /disk2 為一顆額外的硬碟,所以容量比較大啦![root@linux ~]# cd /disk2/xen[root@linux xen]# dd if=/dev/zero of=xen.img bs=1M count=50005000+0 records in5000+0 records out5242880000 bytes (5.2 GB) copied,178.482 秒,29.4 MB/s# 這個時候會開始創造一個 5GB 左右的檔案,由於硬碟速度快慢的關係,# 這個動作可能會消耗數分鐘到數十分鐘不等。[root@linux xen]# ll /disk2/xen-rw-r--r-- 1 root root 5242880000 Oct 10 00:30 xen.img
[root@linux xen]# chcon -t xen_p_w_picpath_t -R /disk2/xen[root@linux xen]# ll -aZ /disk2drwxr-xr-x root root user_u:object_r:xen_p_w_picpath_t .drwxr-xr-x root root system_u:object_r:file_t ..-rw-r--r-- root root user_u:object_r:xen_p_w_picpath_t xen.img# 如果妳有啟動 SELinux 才需要這麼做,否則就略過。# 反正你要記得 Xen 的檔案必須要是 xen_p_w_picpath_t 的安全內容類型。
範例:將剛剛建立的大檔案格式化為 ext3 的檔案格式[root@linux xen]# mke2fs -j /disk2/xen/xen.imgmke2fs 1.39 (29-May-2006)/disk2/xen/xen.img is not a block special device.Proceed anyway? (y,n) yFilesystem label=OS type: LinuxBlock size=4096 (log=2)....底下省略....
複製或安裝根目錄
由於 domain-U 與 domain-0 其實是一樣的系統,因為是半虛擬化嘛!所以, 最簡單的根目錄製作方法, 就是將原本的 domain-0 的根目錄複製到新的分割槽內就對了! 以鳥哥的例子來說,妳可以簡單的這樣做:[root@linux ~]# mount -o loop /disk2/xen/xen.img /mnt# 先將剛剛製作出來的資料給他掛載起來,這是特殊掛載法喔![root@linux ~]# cp -ax /{root,dev,var,etc,usr,bin,sbin,lib} /mnt# 這幾個目錄的資料是一定需要複製的!粉重要!。[root@linux ~]# mkdir /mnt/{proc,sys,home,tmp,selinux}# 這幾個目錄與虛擬檔案系統有關,包括程序、核心資料等目錄,所以要先建立[root@linux ~]# vi /mnt/etc/fstab/dev/sda1 / ext3 defaults 1 1devpts /dev/pts devpts gid=5,mode=620 0 0tmpfs /dev/shm tmpfs defaults 0 0proc /proc proc defaults 0 0sysfs /sys sysfs defaults 0 0# 我這裡假設我的根目錄所在磁碟槽為 SATA 硬碟的第一個分割槽,# 所以是 /dev/sda1 。此外,其他的檔案系統如 proc, sysfs 都必須要寫入!# 至於原本在 domain-0 的其他裝置,就給他拿掉吧![root@linux ~]# vi /mnt/etc/sysconfig/networkNETWORKING=yesNETWORKING_IPV6=noHOSTNAME=xen.test.hostname# 這裡設定一下妳的主機名稱啦![root@linux ~]# vi /mnt/etc/sysconfig/network-scripts/ifcfg-eth0DEVICE=eth0BOOTPROTO=noneIPADDR=192.168.0.123NETMASK=255.255.255.0ONBOOT=yes# 建議將 IP 也設好。但是要注意那個 HWADDR 最好能夠拿掉不設定![root@linux ~]# umount /mnt# 記得將掛載的資料給他卸載掉
妳必須要手動處理一些小設定,包括主機名稱, /etc/fstab, IP 參數等等;
即使手動處理過上述的資料,還是很可能會無法成功的啟動 domain-U ;
由於 domain-0 可能會安裝比較多的套件,這些資料又在 domain-U 當中用不著,徒然造成硬碟容量的浪費。
所以,雖然這個方法最簡單,不過通常鳥哥不是很建議您使用啦! ^_^
設定虛擬磁碟映象檔以及終端機介面
由於預設的 CentOS 虛擬磁碟 (Initial Ram Disk) 並不包含一些 Xen 的相關驅動程式, 因此搞了老半天也是無法驅動 Xen 的 domain-U ,給他氣死! 所以,我們得先就 initrd 來進行一些額外的設定才行。 這個地方非常的重要!因為鳥哥卡在這裡好幾天~最後才發現原來是 initrd 的問題啊~[root@linux ~]# mount -o loop /disk2/xen/xen.img /mnt[root@linux ~]# cd /boot[root@linux boot]# mkinitrd -v -f --fstab /mnt/etc/fstab --with xenblk \> --with xennet --preload xenblk --preload xennet \> initrd-2.6.18-8.1.14.el5xen.vbird.img `uname -r`[root@linux boot]# umount /mnt# 詳細的各項參數請 man mkinitrd ,上述的範例僅是利用 /etc/fstab 的裝置來設定,# 並且加上一些 xen 相關的驅動程式而已。這個過程非常的重要!# 最終會製作出一個 initrd-2.6.18-8.1.14.el5xen.vbird.img 檔案
[root@linux ~]# vi /etc/inittab# 大約在第 51 行的地方加入底下特殊字體的部分:5:2345:respawn:/sbin/mingetty tty56:2345:respawn:/sbin/mingetty tty6co:2345:respawn:/sbin/agetty xvc0 9600 vt100-nav# 意思是使用 agetty 建立 xvc0[root@linux ~]# init q# init q 這個指令可以讓 /etc/inittab 的設定立刻生效而不需要重新開機![root@linux ~]# ln -s /dev/console /dev/xvc0# 如果 xvc0 沒有主動建立的話,我們需要手動來建立連結才可以喔!
編輯 xen 虛擬資料的設定檔
接下來就是重頭戲啦!因為我們必須要指定 domain-U 的相關虛擬設定值,包括使用幾顆 CPU 、使用多少記憶體容量, 以及所使用的核心與根目錄的所在等等。如前所述,這些設定檔主要都在 /etc/xen 底下, 尤其裡面的 xmexample1, xmexample2 等檔案就是很好的說明文件檔,很有參考價值。 鳥哥先說一下我的設定是這樣的:[root@linux ~]# vi /etc/xen/centos5# 這個檔案的檔名可以隨便你取,不過設定檔最好是在 /etc/xen 這個目錄下才好!name = "centos5"kernel = "/boot/vmlinuz-2.6.18-8.1.14.el5xen"ramdisk = "/boot/initrd-2.6.18-8.1.14.el5xen.vbird.img"memory = "128"vcpus = 1vif = [ '' ]disk = [ 'tap:aio:/disk2/xen/xen.img,sda1,w' ]root = "/dev/sda1 ro "# name:只是一個顯示的名稱,一般建議與檔名相同即可;# kernel:在 domain-0 上面的檔案,用來進行 domain-U 的開機!非常重要!# ramdisk:就是 initrd 那個檔案囉~剛剛我們才做出來的檔名# memory:分配給這個 domain-U 的記憶體有多少?如果沒有圖形,96 MB 也可以!# vcpus:使用多少顆 CPU 的意思;# vif:是否需要網路卡,如果需要網路卡,至少要有設定!但內容可用預設!# disk:用來作為根目錄的是那個磁碟,這個最重要啦!語法為:#tap:aio:/完整/路徑/檔名,設計為domain-U的磁碟代號,可否寫入#以我們這個例子來說,我將之前建立的大檔案模擬成為 domain-U 的#/dev/sda1 ,並且該 partition 為可寫入 (w)。
[tap:aio:]:為較新的檔案處理模式,舊的方式為使用:[file:]
[裝置代號名稱]:就是模擬的裝置,請與 domain-U 內的 fstab 對應起來喔!
[w]:就是設定可否寫入,若唯讀則為[r]
如果使用實體 partition 來模擬的話,那麼開頭的部分會以『phy:』來取代。舉例來說,如果我們以 /dev/hda5 來作為 domain-U 的 /dev/sda1 的話,那就會變成: disk = [ 'phy:/dev/hda5,sda1,w' ]如果一切都搞定之後,接下來讓我們來啟動 Xen 的 domain-U 吧!