在 CentOS 5 上安裝及應用 OpenVZ

ArtWork/WikiDesign/icon-admonition-info.png

請注意 OpenVZ 內核是 OpenVZ 計劃的產品,而且並不由 CentOS 支援。

OpenVZ 計劃緊貼 RHEL 所發行的內核,並適時地在新版的 Red Hat(和 CentOS)內核發行後提供更新。因此以 RHEL 為基礎的 OpenVZ 內核十分適合在 RHEL 及 CentOS 主機上應用,並(差不多)支援相同的硬件。不過請留意 OpenVZ 內核將某些硬件的支援直接編譯在內,因此它的模組性較標準的 Red Hat/CentOS 內核為低。

我們建議你完整地閱讀完這篇教學文章後才嘗試當中所示範的步驟。

1. OpenVZ 是甚麼?

OpenVZ 是採用修改過的 Linux 內核在操作系統層進行虛擬化的技術,它讓一台實體伺服器能夠執行多個被隔離、名為容器虛擬私人伺服器(VPS)或虛擬環境(VE)的實例。現時「容器」是最流行的名稱。容器有時會被比擬為 chrootjail 類的環境,但容器其實在隔離、安全性、功能、及資源管理方面都更優勝。

OpenVZ 包括一個特製的 Linux 內核(由 OpenVZ 計劃提供)及一些用戶級的工具。OpenVZ 的可㩦性非常高,它並不依賴 CPU 內的 VT 支援,因此它可供 x86、x86-64、IA-64、PowerPC 及 SPARC 等中央處理器家族所應用。

操作系統層的虛擬化與 VMware ServerParallels WorkstationVirtualBox, QEMUKVM、及 Xen 等以機器/硬件進行虛擬化的產品有頗大分別,這就是在 OpenVZ 下你只能在 Linux 上將 Linux 虛擬化。

OpenVZ 修改 Linux 內核將進階的容器化功能加入其中,藉此容許隔離了的進程組別在一個 init 的旗下執行,附帶的還有二十多個控制容器資源應用方法的動態資源管理參數。OpenVZ 計劃維護著三個穩定的內核分支:

  1. 本於 RHEL4/CentOS4 的 2.6.9
  2. 本於 RHEL5/CentOS 5 的 2.6.18
  3. 本於原裝的 2.6.18

此外還有數個不穩定的分支本於較新版的 Linux 內核,它們也許會漸漸達至穩定的狀態。

2. 為何採用 OpenVZ?

由於它較為輕省,相比起機器/硬件級虛擬化,操作系統級虛擬化提供了不少優點:

  1. 它的效率較高
  2. 它的擴展性較高
  3. 它提供較高的機器密度
  4. 它提供較多的資源管理參數
  5. 採用動態資源管理,因此無須重新啟動容器

OpenVZ 能夠取得較優越的效率(與原生效率接近至很難量度)、擴展性及密度是由於只有單一個 Linux 內核在實體主機上執行,至於每個容器只佔用當中的進程/服務所需的資源,而不必耗用整個操作系統的額外資源。一個基本的容器在主機上也許會是 8 至 14 個額外的進程。只要配合適切的資源管理設定,OpenVZ 亦能處理更進階的程式,例如擁有數百個進程/執行緒的巨型 Java 應用程式。

OpenVZ 的另一個優點就是它提供了廣泛的動態資源管理參數,包括記憶體使用量、進程的數目、處理器使用量、磁碟空間使用量等等……它們全都可以在容器運行時被修改。OpenVZ 在容器內亦支援容器的磁碟配額,及(選擇性地)支援用戶和群組的磁碟配額。

OpenVZ 提供數項進階的功能,包括「檢查點」及將容器由一台主機「遷移」到另一台。遷移共有兩種方式:

  1. 即時遷移減少停機的時間(只須數秒),並且保持機器的運行時間及網絡連線。
  2. 離線遷移就是將機器停止,遷移它,然後重新開啟它。

OpenVZ 的遷移功能「並不」須要一個共用的儲存方案,而是利用 rsync 將容器的目錄整全地由一台實體主機複製到另一台。

何時不要用操作系統級虛擬化

雖然在很多應用案例下你都可以考慮使用操作系統級虛擬化,在某些情形下操作系統級虛擬化並不合適,而機器/硬件級虛擬化會是較好的選擇:

  1. 當你想執行非 Linux 的操作系統
  2. 當你想執行多個內核版本
  3. 當你需要一個多方面自訂的內核

3. OpenVZ 的歷史

SWsoft(現稱為 Parallels)在 2001 年針對 Linux 發行了一個名叫 Virtuozzo 的產品。他們的現有產品名叫 Parallels Virtuozzo Containers。微軟 Windows 版的 Virtuozzo 在 2005 年被發行。同樣在 2005 年,SWsoft 成立了 OpenVZ 計劃,以 GPL 2 授權方式公開 Virtuozzo 背底後的技術。

縱使操作系統級虛擬化在媒體裡所穫的關注不及某些新興的機器/硬件級虛擬化產品般多,自 2001 年(Virtuozzo)及 2005 年(OpenVZ)的發行,它們在環球數萬台伺服器上已證明了自已效率高、穩定、安全及耐用。時至今日,Linux 的操作系統級虛擬化(包括了 Linux-VServer)可算是歷史最悠久和最廣泛部署的 Linux 虛擬化平台。

4. 操作系統級虛擬化與 OpenVZ 的未來

在數個於 2007 及 2008 年發表、關於 Linux 內核的未來的簡報裡,Andrew Morton 認定容器是他唯一能肯定會在 Linux 內核出現的東西,因為有數位利益關係人如 IBM、Google 及 OpenVZ 計劃等都正在研究它。

容器的功能自 2.6.24 版內核開始出現於主線的內核中,更多功能將會在其後的版本相繼被加入。這些功能普遍被稱為 control groups(簡稱為 cgroups),而數個內核子系統(如排程器、記憶體管理器等)已穫修改來支援 cgroup。現時亦未知主線 Linux 內核中的 cgroup 支援仍需多久才會功能全備、穩定、及被廣泛採用……因此 OpenVZ 似乎仍會逗留一段日子。

還有一個針對 Linux 的操作系統級虛擬化產品名叫 Linux-Vserver。Linux-VServer 同樣是一個高質素的產品/計劃,但它與 OpenVZ 之間有數個分別。Parallels/OpenVZ 正在與主線 Linux 內核的開發者合作,為要將容器的功能加進主線 Linux 內核裡。Linux-VServer 的開發者以獨立型式運作,並決定在可見的未來保持 Linux-VServer 為樹幹以外的修正。這並不是說 OpenVZ 將會直接被放進主線的內核裡,因為事情並非如此。cgroup 方面的努力來自所有利益關係人的共識。不過明顯地 OpenVZ 計劃在主線內核裡已經貢獻了很多源代碼

5. 安裝 OpenVZ

OpenVZ 計劃的網頁(www.openvz.org)內備很多高質素的文檔,包括一份用戶指南 PDF、一份快速安裝指南、及 wiki 內豐富的教學及排除疑難文章。這篇文章會簡短地涵蓋安裝的過程。在下面所有步驟中你都須要是 root 用戶。

添加 OpenVZ 的 yum 軟件庫

在一台 CentOS 4 或 CentOS 5 的主機上安裝 OpenVZ 很簡單,因為 OpenVZ 計劃提供了 openvz.repoyum 使用。你只須下載 openvz.repo 這個檔案並將它放置在 /etc/yum.repos.d/ 這個目錄內。請檢視 openvz.repo 這個檔案,因為它收錄了數個軟件庫的定義,其中兩個預設是被啟用的:(一)以 RHEL5 為基礎的內核及(二)OpenVZ 的工具。請編輯它來乎合你的需要。

匯入 OpenVZ 的金鑰

rpm --import http://download.openvz.org/RPM-GPG-Key-OpenVZ 

安裝 OpenVZ 內核

視乎你需要哪一種內核架構,你可簡單地執行:

yum install ovzkernel.i386 

yum install ovzkernel.x86_64 

OpenVZ 內核安裝完成後便是時候重新開機,但在開機前仍有些額外的細節須要處理:

  1. 檢視 /etc/grub.conf 來確定已預設所需的內核,

  2. 編輯 /etc/sysctl.conf 來啟用 OpenVZ 所需的某些內核功能和

  3. 確定 SELINUX 已被停用。

我不會涵蓋如何編輯 /etc/grub.conf,因為這是項很普遍、非 OpenVZ 專屬的工作。

編輯 /etc/sysctl.conf

你喜歡的話,請將原裝的 sysctl.conf 檔案備份(cp /etc/sysctl.conf /etc/sysctl.conf.original)。請利用你喜歡的文字編輯器修改 /etc/sysctl.conf 這個檔案並加入以下內容:

# 在硬件節點上我們普遍需要
# 啟用封包轉發及停用代理 arp
net.ipv4.ip_forward = 1
net.ipv4.conf.default.proxy_arp = 0
# 啟用來源路由檢驗
net.ipv4.conf.all.rp_filter = 1
# 啟用 magic-sysrq
kernel.sysrq = 1
# TCP Explict Congestion Notification
# net.ipv4.tcp_ecn = 0
# 我們不想所有網絡介面送出轉遞
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.all.send_redirects = 0 

停用 SELINUX

很不幸 SELINUX 無法與 OpenVZ 內核兼容,亦不包含在其中。要停用 SELINUX,請利用你喜歡的文字編輯器修改 /etc/sysconfig/selinux 這個設定檔並將它設定為停用:

SELINUX=disabled 

現在是時候重新啟動你的電腦進入 OpenVZ 內核。

安裝工具

要安裝 OpenVZ 的工具程式,請簡單地執行:

yum install vzctl vzquota 

當你安裝了 vzctl 後,你便要這樣做來啟動 OpenVZ 這個服務:

service vz start 

vz 這個服務應該已經被設定為自動啟動,但你可隨意用以下方法來檢查:

chkconfig --list vz 

現在 OpenVZ 的安裝已經完成,而你亦準備好建立你的首個容器,但你首先要取得所需 Linux 發行版本的安裝媒體。

6. 利用 OpenVZ

操作系統範本 —— Linux 發行版本的安裝媒體

vzctl 這個指命是用來建立及設置 OpenVZ 容器。在你建立一個容器之前,你須要擁有你想安裝的 Linux 發行版本的安裝媒體。OpenVZ 無法應用 CD/DVD 安裝媒體(又或者 .iso 光碟映像檔)。OpenVZ 需要它稱為操作系統範本旳東西來為某個 Linux 發行版本建立一個容器。你可以從 OpenVZ 的網頁下載一些預製的操作系統範本。這是建議給新 OpenVZ 用戶的途徑。當你對 OpenVZ 更為熟識,你或許會想按照 OpenVZ wiki 上的眾多方法從頭建立你個人的操作系統範本。你可以這些地方找由 OpenVZ 劃計提供的預製操作系統範本:

http://download.openvz.org/template/precreated/

你亦可以在這裡找到由社區所貢獻的操作系統範本:

http://download.openvz.org/contrib/template/precreated/

請下載所需的操作系統範本並將它放在你的 CentOS 5 主機內的 /vz/template/cache 目錄。

建立你的首個容器

要建立一個容器,請採用 vzctl 這個指令,連同 create 選項及數個參數。你須要選擇一個獨特的容器識別碼(CTID)。你也須要一些額外的資料:你想從哪個操作系統範本進行安裝?它會擁有哪個 IP 位置?你想給它甚麼主機名稱?你初步想將甚麼資源賦予它(取自設定檔)?這一切都可以透過以下參數來設定:

--ostemplate {範本名稱}
--conf {設定檔名稱}
--ipadd {nn.nn.nn.nn}
--hostname {完整域名} 

這裡有一個完整的範例:

vzctl create 101 \
--ostemplate centos-5-i386-default \
--conf vps.basic \
--ipadd 199.199.199.199 \
--hostname mynew.container.com 

這樣便會建立一個名叫 /vz/private/{容器識別碼} 的目錄並將操作系統範本解壓到其中。它也會複製指定的檔案到 /etc/vz/conf/{容器識別碼}.conf 作為該容器的設定檔。請留意 --ostemplate--conf 的值與操作系統範本名稱或檔案名稱並不吻合……它們較為簡短。

vps.basic 這個設定檔正如其名,是十分基本……它分配給容器的資源亦比較保守。你若果想查閱與資源相關參數及它們的值,請看看位於 /etc/vz/conf 這個目錄內的設定檔。你可以利用 vzsplit 這個指令(man vzsplit)來建立自訂的範例設定檔(不限數量),或者複製現有的設定檔到新的檔案來進行編輯。

當你建立了一台機器後,你需利用 vzctl set 這個指令來設定數個額外的參數。下面是一個例子:

vzctl set 101 \
--name mynew \
--nameserver "205.171.2.65 205.171.3.65" \
--diskspace 10G:10G \
--save 

這樣做會更新你的容器的設定檔(在這個範例中是 /etc/vz/conf/101.conf)。當你執行 vzctl set 這個指令時不包含 --save 這個參數時,它便不會將改動儲存到你的設定檔內……不過假若該容器正在運作中,它會為該工作階段動態地更改這些參數。你基本上會經常為 vzctl set 這個指令加入 --save 作為最後一個參數。

啟動你的新容器

你只需執行以下的指令來啟動你的新容器:

vzctl start {容器識別碼} 

或者在我們的範例裡:

vzctl start 101 

你應該會看見一則信息關於容器正在啟動中。若果你沒有打錯任何參數,它應該立即運行。

一如你所期望,stoprestart 這些關鍵字都會如你預料般運作。假若一個容器沒有運行,你可以 destroy 它來移除它的設定檔及從主機的檔案系統刪除它的目錄架構(/vz/private/{容器識別碼})。

進入你的新容器

當你的容器已在運作時,它應該如同一部實體的伺服器般可以在網絡上被存取。但由於你位於主機上,你可以利用 vzctl 這個捷徑直接進入容器而不須 root 的憑證。

vzctl enter {容器識別碼} 

在我們的範例中這是

vzctl enter 101 

你應該在新的容器內取得一個新的指命符號。你多數會想利用 passwd 這個指令來設定 root 的密碼,或者在主機上執行以下指令:

vzctl set {容器識別碼} --userpasswd {user}:{password} --save 

這裡假設你是一個不錯的 Linux 系統管理員而且害怕指令行。請到處看看你的新系統。它在外觀及行動上都應該與一台實體的機器無異。你可以安裝軟件(見下文關於 yum 的部份)、建立戶口、新增系統服務及修改它們的設定。

你可以查閱一個容器的 /proc/user_beancounters 檔案來檢視有多少資源被分配給它。你可以查閱主機上的 /proc/user_beancounters 來檢視每個容器的所有參數。資源管理已經超越了這篇文章的範疇,因此詳情請參閱 vzctl 的使用手冊或 PDF 版的用戶指南 。

7. 假若 yum 不在我的容器裡,怎樣辦?

在 2009 年 1 月前,OpenVZ 計劃所提供的預製操作系統範本並未安裝 yum,而這導致很多用戶生氣。原因是某些 OpenVZ 系統管理員較喜歡在主機上應用一個名叫 vzyum 的工具,它能在容器裡進行類似 yum 的操作。為甚麼它們喜歡這樣做?因為假若每個容器都各自利用 yumyum 的資料庫及快取檔案有時可以佔用大量的磁碟空間(及頻寬)。在主機上應用 vzyum,只有一個 yum 資料庫/快取會存在,而每個套件只須下載一次。

在 2009 年 1 月 OpenVZ 計劃為發行了更新版的預製 CentOS 操作系統範本,當中包含了 yum,因此這個問題已經不再存在。官方的操作系統範本大約每個月更新一次,故此你沒有理由採用未安裝 yum 的舊版操作系統範本。如果你的 CentOS 操作系統範本並不包含 yum,它要不是舊過 2009 年 1 月,就是來自 OpenVZ 計劃以外的源頭。

如果你仍然在應用一個未安裝 yum 的 CentOS 容器,OpenVZ 的 wiki 有一頁解釋如何在容器內安裝 yum。基本上你要下載 yum 所須的一切 rpm 套件然後利用 rpm 安裝它們。盼望這個問題已經成為過去。

8. 結語

這篇文章只處理了 OpenVZ 的最基本部份。未涵蓋的主題包括監測容器、資源管理、編輯/建立設定檔(參閱 vzsplit 使用手冊)、容器檔案系統、與及要成為一位有效率的 OpenVZ 系統管理員的所有額外工序。另外也請留意 OpenVZ 擁有兩款網絡配接卡,而這裡只處理了基本/預設的 venet 類型。veth 這款網絡配接卡擁有更多元化的功能。

OpenVZ 計劃所提供的文檔質素很高,數量亦多。請切記閱讀 PDF 版的用戶指南作為最全面的文檔。不過這份指南有一點過時,因為它是在 veth 網絡裝置、檢查點及遷移功能被加入前寫成的。還有就是不同指令的使用手冊。當你需要遷移容器時,務請閱讀 vzmigrate 的使用手冊。

我們鼓勵你參予及投身在 OpenVZ 計劃,方法包括瀏覽 OpenVZ 網站、應用論壇和 IRC 頻道(Freenode IRC 網絡上的 #openvz)、與及在 http://bugzilla.openvz.org 匯報你碰到的錯誤。請讓自己熟悉 OpenVZ 的網站,因為它收藏了很多材料。

9. 額外資源

OpenVZ 計劃的網站
OpenNode Bare-metal CentOS-based distro with OpenVZ and KVM
訪問 OpenVZ 計劃經理
OS Virtualization vs. Hardware Virtualization video presentation from Linuxfest Northwest 2008
遷移容器的示範影片
Performance evaluation of Xen vs. OpenVZ by HP Labs
OpenVZ 網誌
Parallels Inc.
Linux-VServer 的網站
訪問 Linux-VServer 計劃的領導人

這是本教學文檔的初版,而本人(Scott Dowdle)計劃加入額外資訊作為更新,尤其是當我收到讀者的回饋。我鼓勵各位提供建議及評語。請電郵至:dowdle at montanalinux.org 。

請勿將關於 OpenVZ 的問題電郵到 CentOS 郵件列表或帶到 CentOS 的 IRC 頻道上。請改用 OpenVZ 的 IRC 頻道及其它用來支援 OpenVZ 的資源。 

Translation of revision 19

zh-tw/HowTos/Virtualization/OpenVZ (last edited 2019-12-09 09:11:32 by anonymous)