認識與建立 Linux Container( Linux 容器系統)
在雲端技術(運算)的領域,虛擬系統扮演了重要的角色,但不管虛擬系統怎樣的演進,效能如何的提升,不可否認的,虛擬系統(Guest OS)對實體系統(Host OS)來說,卻也是沈重的負擔。
虛擬系統由早期完全透過軟體來模擬硬體裝置的全虛擬化(Full virtualization),演進到以修改系統(Guest OS)核心的方式,來簡化 CPU 與週邊裝置操作指令轉譯的複雜度, 以提升虛擬系統的效能的半虛擬化(Paravirtualization),一直到目前 Linux 核心支援的原生虛擬化技術(Linux Kernel-base virtual machime,簡稱 Linux KVM),可以明顯的發現,虛擬系統在發展的過程中,嘗試利用各種方式來減輕軟體虛擬化的程度,而後期因為硬體(CPU)技術與規格的提升,讓 CPU 直接支援虛擬化技術,加上 Linux 核心直接內建虛擬化的核心,並透過 Hypervisor 的管理程序,讓虛擬化技術以裸機架構(Bare-Metal)的模式來運作,而也由於 CPU 與系統核心皆支援虛擬化技術,讓虛擬系統的核心命令可以直接通透到實體電腦的 CPU,以模組化的方式來執行核心指令,以提升運作效能。
然而,話雖如此,即使如 Linux KVM 利用支援虛擬化技術的實體 CPU 與系統核心,強化了CPU 指令運算的效能,但大部分的周邊裝置,像是網路卡、網路卡等,卻還是要倚賴軟體來(例如 QEMU)將其虛擬化之後使用,在實際的應用面上,也會明顯拖累整體系統的效能,尤其是網路卡更是明顯,所有的虛擬網路卡都是以同一張實體網路卡來當做對外聯繫的窗口(如果所有的虛擬網路卡都有對外連線的需求時),這勢必會影響原先實體系統的網路運作,只要虛擬電腦的數量越多,影響的程度就越大。
1.1 簡介 Linux Container
難道,我們就不能對虛擬系統(虛擬電腦)的效能,有更高的要求嗎?當然可以,就是利用 Linux Container,這是一套不需要透過虛擬化平台(Hypervisor)來模擬所有的硬體裝置,而是直接可以使用實體主機硬體裝置的虛擬系統架構,讓虛擬化的電腦能達到最大的效能。
Linux Container,或稱 Linux 容器系統(工具),也簡稱 LXC,其本身僅提供最低程度虛擬化(硬體)的功能,且可利用兩個系統管理工具(cgroup 與 App Armor),來有效的管理、控制,並隔離虛擬電腦與實體電腦的資源運用,另外, Linux Container 並不需要再透過複雜的程序,來解譯虛擬電腦與實體電腦之間 CPU 指令的運算,或是週邊裝置的虛擬化,簡單來說,Linux Container 就是可以直接使用實體電腦上的軟硬體資源,而最特別的地方,就是 Linux Container 與實體系統共享相同的核心與函式庫。
Linux Container 這樣的技術,是由 IBM 所開發,除早期運用在 IBM 的大型主機上面,也存在一些非 Linux 的系統之中,而直到 Linux 核心版本為 2.6.29 之後,才開始支援 Linux Container。
安裝 Linux Container(LXC)與建置 LXC 虛擬電腦
筆者這邊以 Ubuntu Desktop 12.04.1 64位元的作業系統為示範系統(Host OS),確認系統內的所有套件都已經更新到最新版本之後(apt-get update 與 apt-get upgrade),接著在終端機內輸入以下指令:
$ sudo apt-get install lxc
按下 Enter 鍵之後,大致要安裝的套件如下圖所示:
當然,以上所安裝的套件數量與名稱,僅供參考,實際狀況還是取決於實際系統的狀態。
輸入〝y〞,並按下 Enter 鍵之後,就會進行 LXC 與其相依套件的安裝,而安裝完成之後,讓我們先來確認一件事,那就是,到底 LXC 可以安裝哪些系統?
一般,或者說大部分的虛擬系統,目前念得出名字的作業系統幾乎都可以安裝到虛擬電腦內,那 LXC 呢?前面有提到,LXC 與實體系統共享相同的核心與函式庫,簡單來說,就是 LXC 只能安裝 Linux ,或與 Linux 相關的作業系統,因此,在 LXC 的世界中,Windows 系統就出局啦!
LXC 建置範本
然而,也並不全然所有的 Linux 系統都可以透過 LXC 線上安裝的模式,安裝到實體電腦之內,那要怎知道目前安裝的 LXC,可以安裝哪些作業系統進來呢?利用在終端機內用以下指令來查詢就可以知道:
$ ll /usr/lib/lxc/templates(或 ls -la /usr/lib/lxc/templates)
圖中顯示的這些檔案,就是目前 LXC 所可以安裝的作業系統,那這些檔案是什麼呢,簡單來說,就是安裝這些系統所需的設定檔,由 Bash Script 所撰寫,內容就是安裝此作業系統的相關設定與所需下載與安裝的檔案,換句話說,如果可以了解整個設定檔的內容,要創造一個其他作業系統的設定檔,也是有可能的。
建置(立) LXC 虛擬系統
了解目前 LXC 所能安裝的作業系統類型之後,接下來我們就實際在 LXC 內安裝 Ubuntu 系統吧,要在 LXC 內安裝作業系統(如 Ubuntu),只需在終端機內輸入以下指令:
$ sudo lxc-create -t ubuntu -n myUS1204
不用懷疑,指令就試著麼簡單,按下 Enter 鍵之後,若提示需要輸入密碼,請輸入使用者登入密碼,接著 LXC 就會依照所指定安裝的作業系統,檢查此作業系統設定檔內的設定值,並依照此設定值來下載,並安裝所需的套件:
而以上的指令是基本安裝模式,若沒有加入任何參數,則 LXC 會依照指定的模版、Host OS 的系統類型,來建置 LXC 虛擬電腦,例如,Host OS 若是 x86_64 的系統,則安裝的 LXC 虛擬電腦也會是 x86_64 的,當然,若是加入適當的參數,例如,〝sudo lxc-create -t ubuntu -n lpdev -- -r lucid -a i386〞,在這個命令列中,就明確指定了要安裝的 Ubuntu 版本(lucid)與類型(i386)。
作業系統安裝時間的長短,則取決於網路的速度,因為大部分所需的套件,都需要透過網路來下載之後再安裝,而安裝完成之後,就會看到如下圖的訊息:
而註解符號(#)之後的訊息,就是預設使用者帳號、密碼等基本資訊,以及所使用的模版(template),與電腦名稱(myUS1204)。
那安裝好的系統到底在哪裡?只要利用以下指令,就可以知道 LXC 內作業系統安裝的位置與檔案結構:
$ tree -L 2 /var/lib/lxc/
這邊就可以明顯的看到,LXC 內虛擬電腦的主要檔案結構,其中,config 為此虛擬電腦的設定檔案,而整個系統的主要檔案結構(目錄),則是在 rootfs 的檔案夾之內。
啟動與使用 LXC 虛擬電腦
安裝好 LXC 虛擬電腦之後,要如何啟動它呢?很簡單,只需要利用以下指令就可以啟動:
$ sudo lxc-start -n myUS1204
按下 Enter 鍵之後,就會啟動 LXC 虛擬電腦,並以終端機的連線模式進入登入畫面:
而系統預設的登入帳號與密碼,在剛剛安裝好系統的時候,終端機就有顯示,以這邊安裝的 Ubuntu 系統來說,預設的帳號與密碼都是 ubuntu,輸入之後,就可以登入系統了:
接著一貫裝好新系統的標準動作,當然就是系統套件的版本的檢查與升級,就 Ubuntu 系統來說,輸入以下指令來檢查與升級套件:
$ sudo apt-get updata(檢查套件)
$ sudo apt-get upgrade(升級套件)
對使用者來說,使用 LXC 虛擬電腦,在操作與指令上完全跟使用實體電腦一模一樣,不僅如此,還可以發現,系統整體的反應速度,可使幾乎跟實體電腦一模一樣喔,光是這點,就可以打掛一票其他虛擬系統內的虛擬電腦了。
那啟動的 LXC 虛擬電腦,要怎關機呢?很簡單,有兩種方式可以將 LXC 虛擬電腦關機:
複製與刪除 LXC 虛擬電腦
LXC 有提供指令來直接備份現有的 LXC 虛擬電腦,而備份的指令如下:
$ sudo lxc-clone -o myUS1204 -n myUS1204_Backup
指令輸入好,按下 Enter 鍵之後,就會開始備份的程序:
就 Linux KVM 來說,在目前版本的 virt-manager 裡面,就有提供複製(clone)的功能,而 LXC 也不遑多讓,且這對 LXC 來說,可是最基本的功能喔!
當然,為了資料的完整性與一致性,在進行系統複製的時候,原則上,最好還是先將 LXC 虛擬電腦關機之後,再利用指令進行複製,是比較妥善的作法!
OK,備份完成之後,那到底備份的資料是存放在哪邊呢?其實備份的資料,跟原本 LXC 虛擬電腦的資料都放在相同目錄下,一樣利用以下的指令就可以看到:
$ tree -L 2 /var/lib/lxc/
這邊就可以清楚的看到備份資料的位置與檔案結構,且若獨立在啟動備份的 LXC 虛擬電腦來當做第二台 LXC 虛擬電腦來使用也是沒有任何問題的!
那既然可以備份 LXC 虛擬電腦,當然就可以刪除備份的檔案(或原始檔案),而刪除的指令如下:
$ sudo lxc-destroy -n myUS1204_Backup
刪除之後,可以再利用〝tree -L 2 /var/lib/lxc/〞的指令來查看,就可以發現剛剛備份的檔案,已經被我們刪除了。