|
最近更新日期:2008/09/09
我們常常講,最好將不同的伺服器架設在不同的主機硬體上面,也就是說,每部主機所負責的任務越簡單越好,
如此一來不但可以減少主機 debug 的時程,也能夠簡化安裝與設計主機的架構。但是,
每個服務一部主機對於小企業或者是個體戶來說,光是放置主機的空間、電源、以及後續的管理問題,
就會導致一堆困擾的產生。這個時候,虛擬機器就非常有用啦。
所謂的『虛擬機器』就是在一部實體主機上面虛擬出多部實體主機的環境,且每部實體主機都是獨立的,
除了原本的那部原主機外,其他的主機都可以獨立開、關機,由於個人電腦的能力在近年來突飛猛進,
速度與效能都非常棒,所以用一部實體主機來進行虛擬機器的架設,並適當的分配不同的服務在上頭,
將有助於能源的節約、管理的簡化以及服務追蹤的簡化哩!
|
前言
這個章節主要是在介紹 Xen 這個虛擬機器,那,什麼是虛擬機器?他有什麼用途?
目前有哪些常見的虛擬機器軟體 (Virtual Machine) ?底下我們先來說一說。
什麼是虛擬機器
虛擬機器 (Virtual Machine) 與
Apache 的虛擬主機 (Virtual host)
( 註1) 不一樣,
虛擬機器的目的是希望能夠在一部實體主機上面『同時運作多個作業系統』的一項功能。
為什麼我們需要在一部主機上面同時運作多個作業系統呢?可能原因有幾個:
讓一部強效型主機負責多種業務時:
由於電腦工業技術的發達,近年來的個人電腦不但越來越便宜,而且功能還越來越強大!
就在前幾個禮拜 (2007/09/xx) ,鳥哥也才收到兩部『四核心的、配備 2GB 主記憶體』的個人電腦!
這在台灣政府的中信標案裡面也已經有提供了,可見個人電腦實在是便宜又好用。
那麼好用的一部電腦如果拿來當網路伺服器,妳會覺得很浪費!怎麼說呢?
以鳥哥的鳥站 ( http://linux.vbird.org/)
來說,一部 AMD AthlonXP 2000+ (1.6GHz 的 CPU 速度) 就跑得非常的順暢,
運作至今應該也沒有發生突發性大流量導致服務中斷的情況,觀察這部主機的平均運作情況,
使用 sar 這個指令來察看一下,唔!每日平均 CPU 負載都在 10% 以下而已。
所以說,這部四核心的電腦拿來當鳥站的主機,根本就是浪費了他的才能。
如果能夠將多種服務集中在這部主機上面來跑,豈不甚好!才不好哩!
如果妳看過 基礎篇 ( 註2) 與 伺服器篇
( 註3) 的介紹後,
肯定會認為主機的服務越單純越好,這樣在服務軟體除錯以及主機環境的單純化上面比較好。
所以說,一部好的主機如果僅用於一個特定的用途,實在很浪費。但如果每個服務都需要一部主機,
又覺得很討厭,因為包括主機的硬體維護、電費、軟體安裝、網路設定等等,都很麻煩,尤其又貴!
因為上述的問題,所以目前有很多專案都在開發『在一部實體主機上面模擬出另一部機器』的功能,
也就是說:『 我們希望能夠在一部主機上面 "同時"
跑多個作業系統』的意思。如果能達到這樣的功能,實際的硬體可以省略掉很多問題,
同時又可以充分的應用實體主機的資源,實在很不錯啊!
同時豁弄多種不同的作業系統:
時間拉回到四、五年前,當時的主機能力僅是還可以,還不算很夠力,而且價格不斐。
但是當時多種作業系統都很吸引人,包括 Windows/Linux/Mac/DOS... ,大家都希望能夠嘗試一下這些作業系統,
然而又不想花錢去購買一部新的主機來玩,這個時候 多重開機 ( 註4) 就成了很重要的一環,
因為他可以讓我們在開機的過程當中選擇所想要執行的作業系統來操作說。
不過多重開機有個討厭的缺點,那就是『 我每次開機只能夠單玩一種作業系統』,
所以如果妳想要在多個作業系統之間切換時,光是開、關機就會讓妳火氣大起來。
這個時候就有些公司開始開發能夠在一個作業系統上面『 模擬出另外一個可執行的作業系統』環境,
所以此時就能夠在同時間操作兩種作業系統了。當時最流行的是 VMWare 這一套軟體啦!
雖然早期就已經有數種虛擬機器的軟體可以玩,不過當時畢竟是使用軟體來模擬的,
硬體並不直接支援這種虛擬機器的環境,所以效能上面非常的糟糕!不過拜 Intel/AMD 大力開發強效型 CPU 之功,
目前的主機硬體大部分都有支援虛擬機器的能力,如此一來我們就能夠使用快速的虛擬機器的環境囉!
有哪些常見的虛擬機器軟體
那麼目前有哪些常見的虛擬機器軟體呢?他們又各有何特色?底下就來說一說:
老牌子的 VMWare (http://www.vmware.com/)
早期的玩家大概都有玩過這一套虛擬機器的軟體,這套軟體早期僅在 Windows 上面執行,
最大的優點就是可以讓使用者在 Windows 環境下同時模擬出一套 Linux 的環境,同時執行兩個作業系統。
鳥哥之前使用這套軟體的目的是用來捉 Linux 的安裝畫面!在這個功能上面 VMWare 實在很不錯。
不過早期的 VMWare 效能不太好,加上當時的主機效能也不佳,而且 VMWare 模擬的硬體不會與原本的主機相同,
因此鳥哥很不建議大家使用 VMWare 來學習 Linux 。然而隨著時代的進步,目前 VMWare 已經發展的相當不錯,
同時也提供 Open source 的版本給 Unix-Like 平台的 OS 使用,算是很不錯的。他也是目前虛擬機器市場的龍頭老大!
已漸趨成熟的 Xen (http://www.xensource.com/)
Xen 是以 GNU 的 GPL 授權發佈的自由軟體,目的在於提供效能佳、可支援不同作業系統的同時運作、
且讓同時運作的作業系統彼此互相獨立的系統環境。Xen 是基於 X86 硬體所開發出來的虛擬機器監督器
(Virtual Machine Hypervisor) ,鳥哥覺得他最大的優點就是效能佳!鳥哥曾在一部 Celoron 366 MHz, 記憶體 192MB
的筆記型電腦上面模擬出一個 Xen 機器給上課的同學們豁弄,同時連線 50 個同學到該部模擬的 Xen
機器上還不會覺得有延遲的問題,效能真的是很不錯。我們在下一節會詳細的介紹 Xen 這個好東西。
後起之秀 KVM (Kernel based Virtual Machine,
http://kvm.qumranet.com/kvmwiki)
酷!炫!有勁的 VirtualBox (http://www.virtualbox.org/)
還有一套自由軟體的虛擬機器可以用,那就是同樣架構在 x86 上面的 VirtualBox 這套軟體啦!
這套軟體提供完整的虛擬環境,且可支援目前市面上的主流作業系統。
鳥哥曾經看過網中人前輩在他的筆記型電腦上面玩過這套東西,非常的炫麗,而且提供圖形化介面,
效能方面看起來也相當的優秀。不過,好像整合度方面的問題,偶而模擬的作業環境會當掉,
但是不會影響到原作業系統就是了。想要在 Linux 桌上型電腦上玩玩虛擬環境的朋友,鳥哥覺得這套東西最適合您!
其實每套虛擬機器的軟體都有其存在的價值,因為他們的功能與目的都不一樣。舉例來說,鳥哥認為 VirtualBox
很適合於想在 Linux 桌上型電腦上面玩 Windows 的朋友,雖然他不夠穩定。至於 Xen
則很適合在一部高效能主機上面同時運作多個同版本的 Linux 系統,因為穩定度相當高,且性能優秀,
可讓使用者輕鬆的在一部機器上面運作多個獨立的作業系統來分別處理不同的網路服務呢!
Tips: 這一章底下的資料牽涉到很多硬體的觀念以及 Linux 作業系統最底層核心的架構說明,
如果您不想要瞭解這些基礎概念,可以直接看 CentOS 5.x 的實例說明即可。
| |
初探 Xen
Xen 的效能為什麼能夠這麼好? 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 的效能增進不少呢! ^_^
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 上面進行一個小小的實驗吧!
確定你的硬體是否支援 Xen 的運作
雖然說目前的硬體都很新了,不過有的朋友使用的是舊的主機來安裝 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
所需要的各項套件,並且順利安裝後,才能夠使用的啊! ^_^。如同前一小節提到的,
要使用 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 囉~
其他半虛擬化的安裝方式
由前一小節的泛用實例我們可以瞭解,如果 domain-U 的根目錄來源為複製自 domain-0 的話,
那麼我們必須要手動修改很多設定檔,非常的麻煩~
既然如此,有沒有可能我們可以自行將安裝程式放入根目錄的建置呢?也就是說,
那個 /disk2/xen/xen.img 的內容其實就是經過安裝程序而來的,而不是經由複製的。
如此一來不就所有問題都解決了,而且新安裝的系統還是很乾淨的系統呢!
確實如此!目前 CentOS 5 提供一個好用的軟體,那就是 virt-install,
妳可以使用 virt-install -h 來察看可以使用的指令哩。
但是在開始底下的實例之前,妳必須要知道幾點限制才行:
- 最簡單的安裝方式為複製 domain-0 的根目錄來給 domain-U 使用(就是前面的範例);
- 半虛擬化的安裝方式『並不支援使用光碟或 DVD 的安裝模式』;
- 半虛擬化僅可透過 http, ftp, nfs 等方式來安裝乾淨的 Linux 系統;
看到上頭的限制您應該會嚇一跳吧!怎麼不能用原版光碟安裝喔?沒錯~是這樣!
使用原版光碟或者是原版光碟的 iso 檔案安裝時,僅有全虛擬化環境可以達到而已。
那妳應該會問,我如何製作或者是取得安裝用的伺服器呢?其實我們可以利用各大專院校的 FTP 網站即可啊!
不需要自行設定安裝伺服器的。不過,如果你的環境並非學術網路的話,最好還是自行設定一下安裝伺服器比較妥當。
為了每位不同所在處的朋友,所以底下我們先快速的講一講如何製作一部安裝伺服器,然後再處理其他工作吧! ^_^
製作安裝伺服器
(Installation Server)
如前所述,半虛擬化的 Xen 僅支援 NFS, HTTP, FTP 等網路方式安裝,並不支援原版光碟安裝的模式,
因此我們得要找到可提供安裝的主機才行。如果您在台灣的學術網路中,
那麼可以選擇國家高速網路中心或者是義守大學的 FTP 網站做為來源,舉例來說,如下網址就是一個案例:
萬一妳是一家企業呢?那最好使用內部的主機架設成為安裝伺服器來安裝你的 domain-U 比較妥當。
以下鳥哥以 NFS 的方式來簡單說明一下建置 CentOS5 的安裝伺服器囉。
- 選擇容量大於 5GB 以上的磁碟分割槽:
由於完整的 CentOS5 原版光碟含有好多的套件,至少也需要 3500MB 以上的容量來容納 DVD 碟內的所有資料。
但是鳥哥的主機當初沒有額外規劃擴充性的問題,因此就得要加掛硬碟啦!
鳥哥是將我的 CentOS5 原版光碟放置到俺的 /disk1/yum/centos5 目錄下的,
這個目錄為另外一個獨立的 partition ,關於 partition 的處理方法請自行參考基礎篇的說明,這裡不贅述了。
- 複製所有需要的套件:
先掛載 CentOS5 的光碟或 DVD 碟,然後直接複製即可:
[root@linux ~]# mount /dev/cdrom /mnt
[root@linux ~]# mkdir -p /disk1/yum/centos5
[root@linux ~]# cp -a /mnt/* /disk1/yum/centos5
[root@linux ~]# umount /mnt
|
如果妳是使用光碟的話,那麼上述的動作就得要進行六次,因為 CentOS5 共有六片光碟。
而且每片光碟內會有一些重複的檔案,因此系統會警告妳『是否要覆蓋?』此時按下『y』去覆蓋即可。
- 建立安裝所需要的檔案關連性資料
一般來說,使用 yum 的系統在他 RPM 檔案所在的目錄下都會有一個名為 repodata 的目錄,
該目錄記錄著檔案的相關性以及一些基本的安裝資訊。但因為我們將資料複製到自己的主機上,
因此一些基本資料可能就不會吻合,所以我們需要重新製作出這個目錄才行。
製作這個目錄必須要安裝 createrepo 套件,預設的情況下是不會安裝該套件的,
因此我們可以這樣做:
[root@linux ~]# yum install createrepo
# 就是安裝某個套件而已,這個套件就是用在製作 repodata 目錄的。
[root@linux ~]# cd /disk1/yum/centos5
[root@linux centos5]# cp repodata/comps.xml /tmp
# 先將某些安裝資訊給他複製出來,準備利用。
[root@linux centos5]# rm -r repodata
# 原本的資料不需要了,將他刪除掉再說。
[root@linux centos5]# createrepo -g /tmp/comps.xml .
# 重新建立好 repodata 目錄囉!
|
- 啟動與設定 NFS 檔案系統
接下來就是設定 NFS 啦!為什麼要選擇 NFS 呢?因為他夠簡單!哈哈!
[root@linux ~]# vi /etc/exports
/disk1/yum/centos5 *(ro)
# 先設定好 NFS 所要分享的目錄所在
[root@linux ~]# chcon -t public_content_t -R /disk1/yum/centos5/
# 確定一下你的這個目錄是可以透過 SELinux 來管理分享的!
[root@linux ~]# /etc/init.d/portmap start
[root@linux ~]# /etc/init.d/nfs start
[root@linux ~]# /etc/init.d/nfslock start
# 將服務給他啟動吧!
[root@linux ~]# showmount -e localhost
Export list for localhost:
/disk1/yum/centos5 *
|
如果可以看到最終的結果,那就表示你的 NFS 製作妥當了!
最終可以知道我們是:
- 安裝協定使用 NFS
- 主機名稱為妳這部主機的 IP, 注意,不要使用 127.0.0.1 來安裝!
- NFS 的路徑為 /disk1/yum/centos5
好了,開始來安裝乾淨的 Linux 系統在 domain-U 上面吧!
利用 virt-install
指令安裝乾淨的 CentOS
CentOS5 所提供的一個實例
雖然 virt-install 已經有夠好用了,不過在某些情況下還是無法執行的。首先, virt-install 要求 domain-U
在安裝時一定要給予 256MB 的記憶體,如果妳的記憶體少於 256MB 時,肯定無法執行 virt-install ~
再者在 SELinux 啟動的情況下,可能還會有無法執行 virt-install 的情況發生。
還好, CentOS5 提供了一個可以驅動安裝程式的核心給我們來進行安裝過程!
接下來我們將以 CentOS5 官網所提供的 kernel file 來進行安裝的實作喔!
其實整個過程挺簡單的,最重要的就是必須要使用 CentOS5 官網所提供的核心與虛擬磁碟映像檔,
有這兩個東西就能夠處理安裝的程序了。底下我們就一步一步來處理這個設定吧!
0. 建立網路連線所需的 DHCP 伺服器
在預設的情況下 Xen 使用的網路環境為利用橋接方式 (bridge) 來連結實際的網路環境。
但在這種模式底下 domain-U 在安裝時,取得 IP 的方式主要為利用 dhcp 協定,
使用手動的方式來設定 IP 卻是不可行的方案!除非要轉成利用 NAT 的模式來處理。
假設我們都先不更改 Xen 的預設環境,那麼我們就得要針對 Xen 的網路模式來建立一部 dhcp 伺服器了。
詳細的 dhcp 伺服器建置方法請參考 伺服器架設篇的介紹,
鳥哥在這裡僅利用一些時間很快的將整個流程處理一下吧!
需要注意的是,如果妳的網域內已經有一個 public 的 dhcp 了,那麼您在建置這個給 domain-U 用的 DHCP 時,
特別留意不要影響到其他的 dhcp 主機喔!鳥哥這裡假設我的 domain-U 的 MAC 為 00:16:3E:00:00:11 ,
所以有針對這個 MAC 來處理喔!
1. 先檢查妳的 domain-0 是否有安裝 dhcp 呢?
[root@linux ~]# rpm -qa | grep dhcp
dhcp-3.0.5-5.el5
# 如果沒有出現上述的套件時,請自行使用 yum install dhcp 吧!
2. 修改 DHCP 的設定檔
[root@linux ~]# vi /etc/dhcpd.conf
ddns-update-style none;
subnet 192.168.1.0 netmask 255.255.255.0 {
option routers 192.168.1.254;
option subnet-mask 255.255.255.0;
option domain-name "xen.test";
option domain-name-servers 168.95.1.1;
range 192.168.1.20 192.168.1.25;
default-lease-time 21600;
max-lease-time 43200;
host dic1 {
hardware ethernet 00:16:3E:00:00:11;
fixed-address 192.168.1.31;
}
}
# 鳥哥就是利用那個 hardware ethernet 來控制某個網卡來源的要求的啦!
3. 啟動與觀察
[root@linux ~]# /etc/init.d/dhcpd start
[root@linux ~]# netstat -tlunp
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
udp 0 0 0.0.0.0:67 0.0.0.0:* 22285/dhcpd
# 重點在那個 port 67 囉~
4. 防火牆的處理!
[root@linux ~]# iptables -I INPUT -p udp --dport 67 -j ACCEPT
[root@linux ~]# iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
# 重點在開放用戶端對於主機的連線囉!這個要設定好!
|
如此一來 DHCP 主機就設定好了,簡單吧!再來開始其他的處理吧!
1. 建立 domain-U 所需要的虛擬磁碟
同樣的,利用 dd 這個指令來建立他吧!鳥哥依舊將我的映像檔放置到 /disk2/xen 底下去。
[root@linux ~]# dd if=/dev/zero of=/disk2/xen/centos5.office.img \
> bs=1M count=3072 oflag=direct
[root@linux ~]# chcon -t xen_image_t /disk2/xen/centos5.office.img
[root@linux ~]# ll -Z /disk2/xen/centos5.office.img
-rw-r--r-- root root user_u:object_r:xen_image_t centos5.office.img
|
除了要建立這個大檔案之外,不要忘記那個可愛又可怕的 SELinux 類型也需要同時變更!
這點大家都很容易忘記!包括鳥哥在內~ @_@
2. 設定終端機介面
這個動作在前面的小節中已經講過了,這裡特別再列出來,因為如果妳沒有作這個動作,
很可能在 domain-U 的地方會讓您無法使用 console 的方式登入 domain-U
,屆時您可能需要使用類似 ssh 的網路連線方式才能夠登入 domain-U 哩!
而且,如果沒有作這個動作,你的 domain-0 則會一直在 /var/log/messages 出現一些錯誤~實在討厭~
實作的方法很簡單:
[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
|
3. 下載 CentOS5 用來安裝 Xen 的核心與映像檔
CentOS5 官網提供的可安裝 Xen 核心在底下的連結,分為 i386 與 x86_64 版本:
鳥哥使用的是 i386 的版本。下載與處理的方式可以這樣做:
[root@linux ~]# cd /boot
[root@linux boot]# wget \
> http://mirror.centos.org/centos/5/os/i386/images/xen/vmlinuz
[root@linux boot]# wget \
> http://mirror.centos.org/centos/5/os/i386/images/xen/initrd.img
# 先下載這兩個檔案下來,為了方便記憶,所以鳥哥習慣將檔名修改一下:
[root@linux boot]# mv vmlinuz centos5_xen_vmlinuz
[root@linux boot]# mv initrd.img centos5_xen_initrd.img
[root@linux boot]# restorecon /boot/*
# 最後一個動作 (restorecon) 在處理 SELinux 的問題啦!
|
所以我們已經取得 CentOS5 官網所提供的核心與映像檔了!準備處理設定檔囉~
4. 撰寫『安裝用』設定檔
接下來我們得先就可安裝的核心來進行設定檔的編寫。我這裡比較有趣的地方在於幾個部分:
- 我具有 NFS 安裝伺服器,該伺服器 IP 為 192.168.1.254,路徑為 /disk1/yum/centos5
- domain-U 在安裝時的 MAC 假設為 00:16:3e:00:00:11,且透過 DHCP 取得 IP;
- 使用 kickstart 方式來安裝,而 kickstart 的設定檔放置到安裝伺服器的 /disk1/yum/centos5/ks.xen.centos5.txt 內
什麼是 kick start 呢?我們剛剛在前一小節使用 virt-install 安裝時,不是有很多的選擇畫面嗎?
所謂的 kick start 就是將所有的選擇項目都寫入某一個設定檔,如此一來,就可以免除手動去挑選的困擾了。
因此,我們會有兩個檔案需要建立。首先,我們建立 Xen 的設定檔,檔案如下:
[root@linux ~]# vi /etc/xen/centos5_xen_install
kernel = "/boot/centos5_xen_vmlinuz"
ramdisk = "/boot/centos5_xen_initrd.img"
extra = "text ks=nfs:192.168.1.254:/disk1/yum/centos5/ks.xen.centos5.txt"
name = "centos5_xen_install"
memory = "128"
disk = [ 'file:/disk2/xen/centos5.office.img,xvda,w', ]
vif = [ 'mac=00:16:3e:00:00:11, bridge=xenbr0', ]
vcpus = 1
on_reboot = 'destroy'
on_crash = 'destroy'
# 上面比較特別的只有那個 extra 而已,那個是核心的額外參數說明!
|
我們還得建立 kick start 的設定檔內容。其實你的 CentOS 本來就有 kickstart 的設定檔了,
詳情請參考你自己的 /root/anaconda-ks.cfg 檔案,您就曉得囉!更詳細的 kickstart 請先參考如下網頁:
鳥哥這裡僅作個簡單的設定而已:
[root@linux ~]# vi /disk1/yum/centos5/ks.xen.centos5.txt
# 1. 與安裝有關的設定,尤其是 NFS 的設定最要緊!
install
nfs --server=192.168.1.254 --dir=/disk1/yum/centos5
# 2. 語系的支援以及鍵盤對應表
lang en_US.UTF-8
langsupport --default en_US.UTF-8 zh_TW.BIG5 zh_TW.UTF-8 zh_HK.UTF-8 \
zh_CN.GB18030 en_US.UTF-8
keyboard us
# 3. 網路設定,記住,要與 NFS 安裝伺服器同網域才行!
network --device eth0 --bootproto dhcp
# 4. 密碼與防火牆還有 SELinux 與時區的相關設定
rootpw --iscrypted $1$NGE.r9ik$D9iqc2bfdpi1DYvqC2CwP.
firewall --enabled --port=
authconfig --enableshadow --enablemd5
selinux --enforcing
timezone Asia/Taipei
# 5. 開機管理程式,注意那個 driveorder 項目,我們的硬碟是虛擬的喔!
bootloader --location=mbr --driveorder=xvda --append="console=xvc0"
reboot
# 6. 磁碟分割表的操作以及安裝的套件資料
clearpart --all --initlabel --drives=xvda
part /boot --fstype ext3 --size=100 --ondisk=xvda
part / --fstype ext3 --size=2048 --ondisk=xvda --asprimary
part swap --size=512 --ondisk=xvda
%packages
@core
# 如果妳曾經安裝過 Linux ,那麼上面的選項對妳來說,應該不難瞭解。
# 比較特殊的是 rootpw 那個項目,鳥哥是由 /etc/shadow 複製加密的密碼來的,
# 如此則 root 的密碼也設定妥當,而且是加密過的資料。
# 在本案例中的 root 密碼為 123456789 喔!
[root@linux ~]# chcon -t public_content_t \
> /disk1/yum/centos5/ks.xen.centos5.txt
|
如此則將兩個設定資料給他設定好了。接下來就是進行安裝的流程喔~
5. 實際安裝過程
實際安裝真是太簡單了!直接啟動 Xen 即可啊!請下達:『xm create -c centos5_xen_install』吧!
然後在出現一小段時間的 IP 偵測、硬體偵測、套件資料分析等畫面後,就會主動的進入實際安裝套件的畫面!
接下來我們啥事都不需要擔心,所有的安裝過程 kickstart 系統都會幫我們搞定的。
實際上,妳要做的就只是...喝茶看報紙吧!不過如果妳的 domain-0 系統非常的高效能,
老實說,喝茶的時間實在是不夠用~ @_@,因為可能 3 分鐘就安裝完畢了~ ^_^
kickstart 就是這麼好用!妳可以將這一組設定放在妳的安裝伺服器上面,未來想要安裝一模一樣的環境時,
直接在安裝的過程載入這個檔案即可,我們不需要還手動挑選有的沒有的啦! ^_^
6. 修改成為可以正常開機的設定檔
在上述第四個步驟時,我們所建立的 /etc/xen/centos5_xen_install 是專門用來安裝用的設定檔。
既然已經安裝妥當了,這個檔案就不能繼續的使用,否則每次都會重複的進入安裝的畫面,
會一直不斷的重新安裝....
所以接下來我們得要修改一下設定檔才行。設定檔可以改成底下的模樣喔:
[root@linux ~]# vi centos5_xen_run
name = "centos5_xen_run"
memory = "128"
disk = [ 'file:/disk2/xen/centos5.office.img,xvda,w', ]
vif = [ 'mac=00:16:3e:00:00:11, bridge=xenbr0', ]
vcpus = 1
on_reboot = 'restart'
on_crash = 'restart'
bootloader = "/usr/bin/pygrub"
# 其實就是加入那個 pygrub 的執行檔而已。該檔案的作用就是
# 作為一個開機載入器來載入 domain-U 開機所需使用的核心與虛擬磁碟。
|
接下來如果想要使用剛剛完成的 domain-U 來登入時,請使用:『 xm create -c centos5_xen_run 』來啟動吧!
啟動的畫面如下所示,妳會發現,怎麼透過終端機可以跟在螢幕前面一個模樣!還能看到 grub 哩!
真是有夠棒的!
圖 3-26、啟動 domain-U 的畫面
選擇好妳所需要的開機選項後,嘿嘿!就能夠在 pietty 之類的環境完整的操作你的 domain-U 了!
說實在的,用在教學上,實在是很棒的一個好主意!
參考資料
2007/10/20:經過多日的奮戰,終於將 Xen 的半虛擬化安裝與操作的方法寫出來!全虛擬化的部分還在構思中~
2007/10/24:透過網友 lvan 的回報,發現沒有建置 /dev/xvc0 會有終端介面的問題,所以補上;
2007/10/24:同樣透過 lvan 兄的回報,可以使用 [ctrl]-] 來離開 domain-U 的終端介面!謝謝 lvan 兄!
2008/09/09:感謝討論區網友donyingle提供的AMD的64位元CPU的相關資訊,終於有CPU的flags了!
|
|