Xen 的效能為什麼能夠這麼好? Xen 在使用上面有什麼樣的限制?我的一部主機最多可以支援幾個 Xen 的模擬環境?
Xen 的模擬環境有幾種類型? 這些疑問我們都得要先知道一下才好!
當然,最好能夠有個簡單的小例子來處理 Xen 的模擬環境囉。
Xen 這套自由軟體在虛擬機器的模擬類型方面主要分為
半虛擬化
(Para-virtualization) 及全虛擬化 (Full
virtualization) 兩種,其中半虛擬化主要是透過修改 Linux 核心來達成的虛擬技術。
半虛擬化技術所產生的虛擬機器需要與原本的作業系統相同較佳。使用半虛擬化的環境所具備的特色有:
(
註5)
- 虛擬機器的運作效率與實體機器的效能相當;
- 最多可支援到具有 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 的效能增進不少呢! ^_^
在
基礎學習篇裡面我們曾經談過硬體、核心與應用程式的關係,
所有的應用程式都是在核心層之上來完成的 (
註6)。
然後
透過核心功能去呼叫與使用硬體元件的命令。好了,
現在來仔細想一想,既然我有多個虛擬機器,每個虛擬機器的環境各別有自己的作業系統核心,
也就是有多個作業系統同時存在。
如果所有的作業系統都能夠完整的控制硬體的話,
那麼硬體到底該接受誰的指令來運作?那個系統的指令會先被執行?這是很重要的問題,
因為如果這邊搞不定,那麼妳的硬體系統就只有當機一途。
為了解決這個問題,Xen 也分成多個層級 (layer) 來執行。他將 Linux 的核心修改過後,
再使用這個修改過後的核心開機,而開機後先載入 Xen 的監督器 (Hypervisor) ,
並且啟動第一個在上頭的作業系統,我們稱他為 domain-0。
(
在 Xen 上面所謂的一個 domain 就是一個虛擬機器囉!)
Domain-0 之所以要先被載入是因為 Domain-0 含有其他虛擬機器啟動所必須的控制指令,
並且 domain-0 也是控制虛擬裝置的重要主控系統。
在 domain-0 上頭最重要的就是一個 xend 的常駐程式,其他的 domain 都是由這個 xend 來管理的。
至於命名方面,除了 domain-0 之外的其他虛擬機器就依序被稱為 domain-1, domain-2 等等,
我們通稱為 domain-U 囉。這些咚咚的相關性有點像這樣:
圖 2-1、Xen Hypersvisor 的功能示意圖(註7)
由上圖我們知道 domain-0 真的是很重要的,因為他直接控制 Xen 的監督器 (Hypervisor),而且掌握了實際的
Linux 驅動程式 (drivers)。而其他的虛擬機器 (domain-U) 則是透過 Xen 監督器來與實際的硬體以及 domain-0
達成溝通。而為了讓 domain-0 能夠與 Xen 結合,我們
必須要修改 domain-0
的核心才能夠順利運作。並且需要使用 domain-0 的核心來開機才可以。
domain-0 是所有虛擬機器的來源,所以他可以盡量簡單一點,其他的個別服務則可以放置到不同的 domain 當中了。
那個 xend 也是很重要的咚咚,他可以管理 domain-0 與其他 domain 之間的啟動與溝通,
可以提供一個終端機 (console) 介面來讓 domain-0 登入其他的 domain ,所以我們也必須要啟動這玩意兒才行。
早期 Xen 尚未被各 distribution 整合到各自的版本中時,使用者必須要由 Xen 的官方網站下載原始碼,
然後自行重新編譯核心以及編譯 Xen 軟體才行。說實在的,玩個 Xen 這麼麻煩,倒不如不要玩!^_^。
然而在 RHEL 5 (CentOS 5) 以後, Xen 已經包含在原始釋出的套件中了,所以我們直接用 yum 就能夠安裝妥當!
所以要搞定一部 Xen 的 domain-0 已經不再是不可能的任務囉!^_^
對於 Xen 的基本原理有一些認識之後,接下來就讓我們開始在 CentOS 5 上面進行一個小小的實驗吧!
雖然說目前的硬體都很新了,不過有的朋友使用的是舊的主機來安裝 Linux ,所以我們必須要留意你的硬體是否支援
xen 的運作。而我們知道 Xen 支援半虛擬化與全虛擬化兩種模式,兩種模式的需求為:
半虛擬化 (Para-virtualization) 硬體需求:
只要是 64 位元的 x86 主機 (x86_64) 都能夠支援半虛擬化的環境。如果是 32 位元的主機 (x86) 時,
該主機必須要支援的實體位址延伸技術 (PAE) 才能夠使用 xen 喔!那如何確認呢?很簡單,檢查 CPU 的參數即可:
[root@linux ~]# cat /proc/cpuinfo | grep flags
flags : fpu tsc msr pae mce cx8 mtrr mca cmov pat pse36 mmx fxsr sse up
|
嘿嘿!這一部主機是鳥哥的 P-III 800 主機,看吧!確實有支援 PAE 喔!所以當然可以玩 Xen 囉。
全虛擬化 (Fully-virtualization) 硬體需求:
如果妳需要全虛擬化的技術支援時,此時需要硬體有支援虛擬化技術才行。
目前在 x86 的主機當中, Intel 提供 VT 技術, AMD 則提供 SVM 技術。
這兩種技術在 CPU 的旗標分別是:
Intel (vmx) 與 AMD (svm) 。
鳥哥在 Core Duo 主機上面的測試可以發現:
在 Intel Core 2 Duo 的 CPU 主機上面測試 CPU 旗標:
[root@linux ~]# cat /proc/cpuinfo | grep flags
flags : 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 的主機旗標則是:(下表感謝
donyingle兄的提供!)
在 AMD Athlon(tm) 64 X2 的 CPU 主機上面測試 CPU 旗標:
[root@linux ~]# cat /proc/cpuinfo | grep flags
flags : 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 的支援啦!
|
如果確定你的 CPU 有支援上述的條件後,嘿嘿!那我們就可以開始底下的遊戲啦!如果沒有支援呢?
那很抱歉,底下的資料看看就好!
注意:
在開始安裝之前,請先參考
前一小節以確定你的硬體已經支援 Xen 的半虛擬化功能了!
約略談了一下 Xen 的原理、特色之後,在開始玩弄 Xen 之前,我們得瞭解運作 Xen
所需要的各項套件,並且順利安裝後,才能夠使用的啊! ^_^。如同前一小節提到的,
要使用 Xen 半虛擬化 (Para-virtualization) 必須要修改核心才能夠順利的運作。
在以前的版本妳需要重新編譯核心,不過,在新的版本,例如 CentOS 5.x 底下,就已經將
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.lst
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title 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.img
title 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
|
妳必須要注意到,鳥哥使用的開機選單為第0個,亦即是 2.6.18-8.1.14.el5xen 那一個!
然後重新啟動這部 Linux 主機喔!啟動完成後,應該再次的確認一下是否為 xen 的核心才行!
[root@linux ~]# uname -r
2.6.18-8.1.14.el5xen
# 仔細看,鳥哥的核心為新的 xen 的核心喔!
[root@linux ~]# chkconfig --list | grep xen
xend 0:off 1:off 2:on 3:on 4:on 5:on 6:off
xendomains 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 list
Name ID Mem(MiB) VCPUs State Time(s)
Domain-0 0 462 1 r----- 49.2
# xm 為 Xen 的重要指令,list 為列出已經在跑的 xen 系統,預設有 domain-0 存在!
|
透過上面的測試,我們會知道 xen 確實已經順利的啟動,而且也啟動前面談到的那個重要的 domain-0 囉!
接下來我們再來聊一聊那 xen 的設定檔在哪裡?
xen 的套件結構
我們前面談到過, Xen 在 domain-0 是由一個 xend 的服務所管理的,他可以用來啟動、關閉與連結到其他的
domain-U 當中。此外, Xen 亦提供許多的指令來讓系統管理員管理他們的 domain-U 啊!這些重要的啟動執行檔為:
- /usr/sbin/xend:就是 xend 的啟動腳本,使用 python 程式語言寫成的;
- /usr/sbin/xm:重要的管理 xen 的指令,可輸入 xm help 查詢用法。
至於與 xen 有關的設定檔,包括一些模擬元件的啟動腳本都在 /etc/xen 底下,在這個目錄下的許多資料為:
- /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:這目錄有趣了!包括虛擬設備的啟動、虛擬網路的啟動、
虛擬橋接器的啟動等等,都是透過這目錄底下的所有檔案來達成的!
在妳安裝完畢,並且使用新核心啟動後,接下來讓我們開始來處理一個小案例吧!
就如同
圖 2-1 的樣子,在主機上的所有 Linux OS 都需要自己能夠開機,
而開機流程通常是這樣的:(
註8)
- step 1: 按下電源,主機開始讀取 BIOS 資料;
- step 2: 取得開機的裝置順序,並由 MBR 取得開機選單與開機管理程式;
- step 3: 由開機管理程式載入 Linux kernel 及虛擬磁碟 (initrd);
- step 4: Kernel 偵測硬體載入適當的驅動程式,並掛載根目錄以讀取核心模組;
- step 5: 開始由 /sbin/init 程式設定主機的環境。
由上述的動作,我們可以知道 Linux 開機的重點在於
1.
核心 2. 虛擬磁碟 (initrd) 及 3. 根目錄 (/) 了。
雖然核心與虛擬磁碟我們的 CentOS 5 已經提供了,但是預設的虛擬磁碟好像並未主動的加入 Xen 的某些驅動程式,
因此我們得需要針對虛擬磁碟進行設定才好。此外,每個 Xen domain
的根目錄也很傷腦筋的!因為根目錄需要很多資料,而且還需要掛載類似 /sys, /proc, /dev, /selinux 等特殊的檔案系統哩!
那該如何處理根目錄呢?底下就讓我們來處理處理:
硬體支援性
就如同前面幾個小節談到的,如果我們的硬體並不支援 xen 所必須要的功能,那麼妳是無法建立好你的 domain-U 的!
在這個泛用案例當中我們的重點是測試半虛擬化,因此妳只要具有 PAE 的支援即可。
鳥哥以較低階的 P-III 800 來進行測試,硬體檢查的結果是這樣的:
[root@linux ~]# cat /proc/cpuinfo | grep flags
flags : fpu tsc msr pae mce cx8 mtrr mca cmov pat pse36 mmx fxsr sse up
|
妳可以發現確實存在那個 pae 的關鍵字,因此我們這個系統是可以玩 Xen 的半虛擬化技術的!
所以讓我們繼續進行工作吧!
根目錄所需磁碟槽
根目錄所需磁碟槽的來源可以有兩個,一個是實體硬碟,一個是利用 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=5000
5000+0 records in
5000+0 records out
5242880000 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
|
檔案是建立起來了,不過如果你的 Linux 有啟動 SELinux 的話,還需要一些類型的改變才可以!
其實動作也不難,這樣做就對了!
[root@linux xen]# chcon -t xen_image_t -R /disk2/xen
[root@linux xen]# ll -aZ /disk2
drwxr-xr-x root root user_u:object_r:xen_image_t .
drwxr-xr-x root root system_u:object_r:file_t ..
-rw-r--r-- root root user_u:object_r:xen_image_t xen.img
# 如果妳有啟動 SELinux 才需要這麼做,否則就略過。
# 反正你要記得 Xen 的檔案必須要是 xen_image_t 的安全內容類型。
|
檔案建立起來後,就需要進行格式化囉~格式化的方法為:
範例:將剛剛建立的大檔案格式化為 ext3 的檔案格式
[root@linux xen]# mke2fs -j /disk2/xen/xen.img
mke2fs 1.39 (29-May-2006)
/disk2/xen/xen.img is not a block special device.
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
....底下省略....
|
由於這是檔案不是磁碟分割槽,所以會有上述的警告訊息,妳按下『y』就對啦!
複製或安裝根目錄
由於 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 1
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs defaults 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
# 我這裡假設我的根目錄所在磁碟槽為 SATA 硬碟的第一個分割槽,
# 所以是 /dev/sda1 。此外,其他的檔案系統如 proc, sysfs 都必須要寫入!
# 至於原本在 domain-0 的其他裝置,就給他拿掉吧!
[root@linux ~]# vi /mnt/etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=xen.test.hostname
# 這裡設定一下妳的主機名稱啦!
[root@linux ~]# vi /mnt/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
IPADDR=192.168.0.123
NETMASK=255.255.255.0
ONBOOT=yes
# 建議將 IP 也設好。但是要注意那個 HWADDR 最好能夠拿掉不設定!
[root@linux ~]# umount /mnt
# 記得將掛載的資料給他卸載掉
|
基本上,根目錄的設定到這裡就算結束了!不過,妳會發現由於 domain-U 的資料都是由 domain-0 來的,
而不同的主機其實設定不會相同,所以使用上述的作法妳會發現有幾個小問題:
- 妳必須要手動處理一些小設定,包括主機名稱, /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 檔案
|
除了這個虛擬磁碟之外,為了要方便我們登入 domain-U 的環境,我們需要產生一個終端機介面才行。
因為每個 domain-U 會使用到終端介面,然而我們知道 tty1 ~ tty7 預設給 domain-0 使用掉了。
為此,我們必須得要製作出一個虛擬的終端介面,那就是 xvc0 這個終端介面囉。如何產生呢?
簡單的流程是這樣:
[root@linux ~]# vi /etc/inittab
# 大約在第 51 行的地方加入底下特殊字體的部分:
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
co: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 = 1
vif = [ '' ]
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)。
|
特別特別留意的是,上面的設定檔當中的 kernel, ramdisk 以及 disk 都是以原本的主機 (domain-0) 的角度來思考的,
也就是說,實際上我們是
以 domain-0 的核心檔案來進行
domain-U 的開機,因此妳會發現在 domain-U
當中並不存在 /boot 這個目錄喔!因為實際上用來開機的是 domain-0 的檔案嘛!
至於另一個重點就是那個 disk 參數。我們可以使用模擬的方式也可以使用實際的 partition 來給予設定。
如果是『用檔案來模擬成為 partition』時,使用兩個逗號 (,) 隔開成為三個欄位,分別為:
tap:aio:/完整路徑/檔案的名稱,裝置代號名稱,寫入與否
- [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 吧!
利用 xm 指令啟動與管理 domain-1
在 domain-0 可以使用 xm 這個指令來啟動、關閉、刪除某個 domain-U , xm 的指令用法是這樣的:
[root@linux ~]# xm [動作] [設定檔名] [-c]
參數:
[動作]:要某個設定檔內的 domain-U 作何動作之意,常見的動作有:
create :啟動這個 domain-U 的意思,例如啟動 centos5 這個設定檔時,使用:
xm create centos5
destroy :立即由記憶體中,將這個 domain-U 給刪除,常用於 domain-U 出問題時
list :將目前已經啟動的 domain 都列出來之意;
console :若有已建立的 domain-U 時,可用 console 來取得 domain-U 的終端介面
shutdown :關閉某個已啟動的 domain。如果想要關閉全部的 domain-U ,可用
xm shutdown -a
[設定檔名]:亦即在 /etc/xen/ 目錄下的檔名囉;
-c :同時建立到該設定檔的終端介面 (console)
|
如果想要啟動我們剛剛建立的 centos5 這個設定檔內的 domain 時,妳可以使用『xm create -c centos5 』即可。
那個 -c 的作用是可以讓妳直接取得 domain-U 的終端機介面。鳥哥在 pietty 上面連線到 domain-0 ,
然後啟動 centos5 這個 domain 的情況如下所示:
圖 2-2、啟動 xen domain-U 的示意圖
在圖 2-2 當中,輸入指令後 domain-U 的開機流程就會依序的顯示在妳的終端機上,
感覺上就好像坐在電腦前面看 Linux 主機開機一樣!實在是很不賴!最後如果開機順利成功的話,
結果會像下圖所示這樣:
圖 2-3、啟動 xen domain-U 的示意圖
在圖 2-3 當中,最上方圈起來的開機訊息是錯誤訊息。由於我們是複製 domain-0 的所有資料,
因此連同原本寫在 /etc/rc.d/rc.local 檔案內的執行過程也會被執行。但是 domain-U 的狀況與
domain-0 並非完全相同,所以就會如上所述出現一些錯誤訊息啦!這也是我們需要額外處理的部分喔。
當你以 root 的身份登入後 (這個真的是終端機,並非是 ssh 的畫面喔!),會發現多了一個 xvc0 的終端介面,
這個介面得先在 /etc/inittab 裡面設定好才行!如果一切都 OK 了!恭喜您,你已經登入 domain-U 囉!
接下來請妳自行根據妳的需要來設定好妳的 domain-U 吧!讓這兩個 domain 並行呢!
好了,現在我如何登出 centos5 這個 domain-U 呢?妳可以這樣做的:
- 直接在 domain-U 的環境中按下 [ctrl]-] 這個組合鍵來回到 domain-0 的環境;
- 直接關閉 pietty 等連線的軟體;
- 利用其他 bash 來結束 (kill) 掉使用 xm 所建立的連線程序
有趣的是,即使妳使用上述的方法來離開 domain-U 時,
也不會影響到 domain-U 的繼續運作!而且 root 也不會登出,等到妳下次再以『 xm console centos5 』時,
會繼續取得 root 的動作繼續處理剛剛未完成的工作呢!很神奇吧~
現在,請跳回 domain-0 的地方,或者是利用另外一條 pietty 的連線連入 domain-0 ,我們使用 xm list
來察看一下各個 domain 的狀況吧!
[root@linux ~]# xm list
Name ID Mem(MiB) VCPUs State Time(s)
Domain-0 0 366 1 r----- 735.2
centos5 42 127 1 ------ 52.4
# 妳會發現多了一個 domain 出現!名稱為 centos5 啦!
# 妳也會發現有個 State 吧!那個 State 的意義是這樣的:
# r :該 domain 正在使用 CPU 資源在運作中;
# b :這個 domain 目前被懸置(blockded),很可能由於這個 domain 在等待較長時間
# 的輸入輸出 (I/O) 之故。
# p :該 domain 處於暫停的狀態,通常由於管理員使用 xm pause 之故。
# 當 domain 在此狀態時, Xen 的監督器將不會處理該 domain 的動作;
# s :這個 domain 正在關機當中
# c :這個 domain 已經 crash 了,但是卻沒有自動的關掉。通常是因為沒有設定
# on_crash 的相關動作所致。
# d :該 domain 正在死亡中...因為該 domain 無法正確的 shutdown/crashed 之故。
|
很簡單吧!這樣就完成你的 Xen domain 囉~開始將妳所想要的網路服務分門別類的放到不同的 domain-U 中吧!
加油!
例題:關於如何登入 domain-U我在啟動 domain-U 的時候,使用指令為『 xm create domain-U 』導致我使用 xm list
可以看到新的 domain-U 在運作,但我還是在 domain-0 。請問此時我該如何登入 domain-U 呢?
答:
有兩種方式,如果想要取得 domain-U 的終端機模式,請使用:
如果妳知道 domain-U 的 IP,並且 domain-U 有啟動類似 ssh/telnet 的服務時,可使用網路服務登入。舉例來說
domain-U 的 IP 為 192.168.100.100,且有啟動 ssh ,則妳可以使用:
ssh username@192.168.100.100
|
例題:關於如何關閉 domain-U
我使用 xm list 時,發現 domain-U 已經啟動了,我該如何關閉這個 domain 呢?
答:
如果妳在 domain-0 上頭的話,可以使用: 來關閉這個 domain-U ,
如果極端一點,妳想要關閉所有的 domain-U (除了 domain-0 之外),則可以下達: 那如果妳是在 domain-U 裡面呢?想關閉該 domain 就直接給他:
即可,就好像一般正常程序關機一樣喔!
那如果萬一 domain-U 無法順利關機,則妳可以在 domain-0 上面直接下達刪除的指令:
|
例題:關於重複登入的問題
我利用 xm create -c domain-U 的方式取得終端機來登入 domain-U 了,結果另外一個使用者使用『xm console domain-U』也來登入該
domain,此時會發生什麼問題?該如何解決?
答:
由於預設情況下,一個 domain-U 僅有一個終端機,因此第二個登入者將不會詢問帳號密碼,
而是直接以第一個登入者的身份取得該終端介面,亦即兩者將具有相同的終端介面與所有資源。
但如此一來會導致控制權的爭奪效應,最終結果兩者都無法控制該終端介面。此時建議兩者均離開該終端介面,
然後讓單一使用者以 xm console 登入,另一使用者則使用類似 ssh 的方式網路登入即可。
|
常見錯誤分析
Xen 的啟動其實是頗不容易的,常常會有一些錯誤情況發生。底下我們來看看一些常見的錯誤情況,
讓您瞭解到,您無法啟動 Xen 的可能原因為何?
沒有啟動 Xen 的 xend daemon
[root@linux ~]# xm create -c centos5
Using config file "./centos5".
Error: Unable to connect to xend: Connection refused. Is xend running?
|
如上所述,肯定你沒有啟動 xend 這個 daemon 的啦!直接啟動他即可:『/etc/init.d/xend start』
使用到錯誤的核心或者 domain-0 未以新 xen 核心開機
[root@linux ~]# xm create -c centos5
Using config file "./centos5".
Error: (22, 'Invalid argument')
|
然後請到登錄檔內看看,亦即是 /var/log/xen/xend.log 檔內,如果出現如下的錯誤:
[root@linux ~]# cat /var/log/xen/xend.log
[2007-10-17 13:18:48 xend.XendDomainInfo 31254] ERROR
(XendDomainInfo:203) Domain construction failed
|
很有可能就是你的核心檔案用錯。此時請檢查一下你的設定檔,看看『kernel』的項目是否設定正確?
我們務必要使用 xen 相關的核心來開機才行啊!
SELinux 或者是檔案權限的問題
[root@linux ~]# xm create -c centos5
Using config file "/etc/xen/centos5".
Error: Kernel image does not exist: /boot/vmlinuz-2.6.18-8.1.14.el5xen
|
但我看過 /boot/vmlinuz-2.6.18-8.1.14.el5xen 確實是存在的,可能原因為何?一般來說,這種問題應該是
SELinux 的影響所致。確定方法可以用『setenforce 0』然後再重新『xm create -c centos5』測試看看,
如果確定可以登入,那表示您的 /boot/vmlinuz-2.6.18-8.1.14.el5xen SELinux 安全格式內容不對。
正確的核心開機類型應該是:
[root@linux ~]# ll -Z /boot
-rw-r--r-- root root system_u:object_r:boot_t config-2.6.18-8.1.14.el5xen
-rw------- root root user_u:object_r:boot_t initrd-2.6.18-8.1.14.el5xen.vbird.img
-rw-r--r-- root root system_u:object_r:boot_t symvers-2.6.18-8.1.14.el5xen.gz
-rw-r--r-- root root system_u:object_r:system_map_t System.map-2.6.18-8.1.14.el5xen
-rw-r--r-- root root system_u:object_r:boot_t vmlinuz-2.6.18-8.1.14.el5xen
|
請自行使用 chcon 指令來處理 SELinux 的錯誤吧!
Kernel panic 的問題
如果出現如下的可怕畫面時:
....前面省略....
Loading ext3.ko module
Creating root device.
Mounting root filesystem.
mount: could not find filesystem '/dev/root'
Setting up other filesystems.
Setting up new root fs
setuproot: moving /dev failed: No such file or directory
no fstab.sys, mounting internal defaults
setuproot: error mounting /proc: No such file or directory
setuproot: error mounting /sys: No such file or directory
Switching to new root and running init.
unmounting old /dev
unmounting old /proc
unmounting old /sys
switchroot: mount failed: No such file or directory
Kernel panic - not syncing: Attempted to kill init!
|
出現這個『Kernel panic』的問題非常的多且複雜,其實主要的原因就是
無法掛載根目錄。
因為你核心檔案已經進行偵測,並且虛擬磁碟檔案 (initrd) 也已經載入囉!
那什麼情況下會無法掛載根目錄呢?妳應該要這樣查閱:
1. 用來作為根目錄的檔案 SELinux 類型不對:
首先,請先到 /var/log/messages 裡面察看一下,如果出現如下畫面:
Oct 17 12:04:17 xen-test kernel: audit(1192593857.395:259): avc:
denied { search } for pid=29687 comm="tapdisk" name="/" dev=hdc1
ino=2 scontext=system_u:system_r:xend_t:s0
tcontext=system_u:object_r:default_t:s0 tclass=dir
# 上面是同一行,意思是說,該檔案讀取被拒絕了,因為程序的格式為:
# scontext=system_u:system_r:xend_t:s0 ,但是你的檔案格式為特殊字體部分,亦即:
# tcontext=system_u:object_r:default_t:s0
# 所以這個檔案的讀取就被『deny』了!
|
這表示妳用來作為根目錄的檔案 SELinux 類型不對,正確的檔案類型是這樣的:
-rw-r--r-- root root user_u:object_r:xen_image_t xen.img
|
所以妳可以使用類似底下的方式來處理:
[root@linux ~]# chcon -t xen_image_t -R /disk2
|
似乎連同最頂層的 /disk2 都需要修改 SELinux 安全內容才行!所以妳可以加 -R 來讓子目錄生效!
2. initrd 虛擬磁碟沒有載入正確的模組
另一個可能原因就是虛擬磁碟並沒有載入 domain-U 需要的模組,所以妳必須要仔細看上面的輸出訊息有沒有這個項目:
Creating block device nodes.
Loading xenblk.ko module
XENBUS: Timeout connecting to device: device/vbd/2049 (state 3)
Loading xennet.ko module
netfront: Initialising virtual ethernet driver.
netfront: device eth0 has flipping receive path.
Loading uhci-hcd.ko module
|
這表示已經載入了 xen 的相關模組,如果你的畫面沒有這個訊息時,請參考前一小節關於虛擬磁碟的說明。並且更新你的 domain-U 設定檔吧!
3. 設定檔內容寫錯
很多時候我們都會打錯字~實在很麻煩~所以如果上述兩點妳都確認過了,接下來請檢查一下你的打字有沒有問題。
假設我的 xen 檔案是放置到 /disk2/xen/xen.img 裡頭,那麼兩個地方要注意:
[root@linux ~]# vi /etc/xen/centos5
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 = 1
vif = [ '' ]
disk = [ 'tap:aio:/disk2/xen/xen.img,sda1,w' ]
root = "/dev/sda1 ro"
|
模擬的裝置 (disk 項目內) 以及根目錄的所在裝置 (root 的項目) 需要配合成功,否則就會失敗了!
當然啦,模擬的裝置也必須要跟實際的檔案相同才行喔!
domain-U 本身的問題
如果開機已經到達下面的狀況時:
unmounting old /sys
INIT: version 2.86 booting
Welcome to CentOS release 5 (Final)
Press 'I' to enter interactive startup.
正在設定時鐘 (localtime): 三 10月 17 13:24:28 CST 2007 [ 確定 ]
正在啟動 udev: [ 確定 ]
....中間省略....
正在檢查檔案系統
Checking all file systems.
[/sbin/fsck.ext3 (1) -- /] fsck.ext3 -a /dev/hda1
fsck.ext3: No such file or directory while trying to open /dev/hda1
/dev/hda1:
The superblock could not be read or does not describe a correct ext2
filesystem. If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
e2fsck -b 8193
[失敗]
*** 檢查檔案系統時發生錯誤。
*** 系統將帶您進入 shell 模式; 然後重新開機
*** 當您離開 shell 時。
Give root password for maintenance
(or type Control-D to continue):
|
注意到上面特殊字體的部分,既然已經出現了 INIT 的字樣,這表示 domain-U 已經通過了核心偵測、
根目錄掛載等動作,且已經順利的在執行 /sbin/init 這個指令了,因此我們可以確信所有的 Xen 設定都是正確的,
可能發生的錯誤就在 /disk2/xen/xen.img 這個檔案內的配置了。妳可能需要依據開機流程一個一個的去處理相關的錯誤喔!
最可能發生的就是在 domain-U 的 /etc/fstab 囉~