Linux Container (LXC)

Transcript from Mr.Q Blog:http://littleqnote.blogspot.tw/2012/11/linux-container-lxc-virtualization.html

(1) 安裝 lxc

首先,透過 apt-get 安裝 lxc,

sudo apt-get install lxc

透過 apt 安裝有一個好處,就是網路介面、cgroup 等等東西都不用自己設定,裝好的時候就幫你建立好了,ifconfig 裏面可以發現多了橋接介面,用於連接 lxc containers 的網路。

(2) 建立 Container

和 Virtual Machine 一樣,在開始使用之前要先建立 VM,所以我們也要開始創建一個 Container,透過 lxc-create 這個指令就可以馬上建立一個全新的 Container

lxc-create -t ubuntu -n test-1

-t: template
-n: container name(這裏 test-1 可以代換成你想要的名字)

這時候 lxc 就會跳出一堆 blahblah,幫你建立了,如果你之前沒有幫 root 建立 public key,他會在過程中詢問且建立一個。

第一次建立 Container 會久一點,因爲他要從網路上抓全新的 ubuntu 環境下來,大約 400 MB 左右,不過之後就可以省掉這個步驟了,大概 20 秒就可以開好一個。

建立完後可以用 lxc-list 看到 Containers 的狀態。

RUNNING
lxc-lab

FROZEN

STOPPED
ejcluster1

(3) 運行建立好的 Container

lxc-start -n test-1 -d

-n: container name
-d: run as daemon

這個指令會運行已經建立好的 Container 然後放到背景運行,強烈建議一定要加上 -d 選項,之後再用 lxc-console 指令或 ssh 連進去就好。

(4) 連入運行中的 Container

lxc-console -n test-1

記著:離開的指令是 然後按 。

預設的帳號密碼應該都是 ubuntu。

(5) 關閉運行中的 Container

lxc-stop -n test-1

這樣就可以把不用的 Container 關起來。

LXC Template Problem and Solution on Mint 16

我安裝的 Linux Mint 版本是 16 MATE

在使用 apt-get install lxc 安裝好 LXC 以後

按照網路教學就要直接建立一個新的 VM

所以我用 lxc-create -t ubuntu -n test-lxc

但是一直出現以下的錯誤訊息:

lxc-create: No such file or directory - bad template: ubuntu

lxc-create: bad template: ubuntu

上網 Google 不太到這樣的問題,最終在 PTT 的 Linux 板上問得 soom 大大的建議看法是沒有 lxc-template

Mint 下好像除了安裝 lxc, 還要安裝 lxc-template 和 debootstrap 兩個套件

安裝好以後再下一次 lxc-create -t ubuntu -n test-lxc 就可以了

LXC Start Problem and Solution on Mint

解決了在 Mint 上無法找到 Template 的問題,接著建立好一個 VM,就準備要啟動它了!

但是就在期待中輸入 lxc-start -n test-lxc -d ( -d : launch as daemon)

竟然出現了:

lxc-start: command get_init_pid failed to receive response

以為只是某個 Calling 失敗,所以還是試著用 lxc-console 連看看,果然是 test-lxc is not running

同樣是 PTT 上 soom 大大提供的資料,在 The Linux Mint Distribution 網站
有人提報了這個問題:https://bugs.launchpad.net/linuxmint/+bug/1257109

一樣是相依套件的問題,所以額外在安裝了:

sudo apt-get install bridge-utils cgroup-lite cloud-image-utils distro-info distro-info-data euca2ools libaio1 libboost-thread1.53.0 liblxc0 librados2 librbd1 libseccomp1 python-boto python-distro-info python-m2crypto python3-lxc qemu-utils sharutils

如此就成功 launch 並且可以連入 VM 了!

Terminal_001.png

相關連結:
– KVM:http://www.linux-kvm.org/page/Main_Page
– LXC:https://linuxcontainers.org/
– Docker:https://www.docker.io/
– Linux KVM 研究室:http://linuxkvm.blogspot.tw/
– Mr. Q – Linux Container (lxc) – 物美價廉的 Virtualization

Compare of Xen, KVM, LXC and Traditional VM

* 以下將 VMware、Virtual Box、Virtual PC 歸類為 Traditional Vitual Machine,簡稱 TVM

TVM 和 其他虛擬化技術 的最主要差異是主系統的資源共享
  • TVM 這是完整一個系統,這裡的系統包含了所有軟體模擬出來的硬體設備,因此他的執行效能最差,但是能夠完整模擬出一個不同於主系統的環境
  • Xen 是在 Linux 環境下最早出來的虛擬化技術,這是在硬體與 Linux 核心之間插入一個 Xen 程序,讓開機時的 bootloader 原本是要載入 Linux Kernel Code,改成 loading Xen code,而 Linux Kernel 和其他 VM 則是由 Xen 來管理
  • LXC 是緊接著出來的技術,由 IBM 創立,後來才納入 Linux Kernel),這個作法是在主系統的 Processes 中,將虛擬機的 process"es" 偽裝成主系統的 process,讓主系統的 OS 將之加入 Process Scheduling 中

會說是偽裝,是因為主系統中本身會有一套屬於作業系統的 Process,這些 Process 也會在虛擬機的系統中存在,例如 Linux 的 init (PID = 1),如果直接將虛擬機的 Process 插入主系統的排成,可能造成系統錯亂,因此 container 會將虛擬機的 process 偽裝成其他號碼的 process 後才加入排程

螢幕快照 2014-05-20 下午6.00.28.png

container 要求的虛擬機環境要跟主系統一樣,例如你在 Ubuntu 上安裝並建立一個 container,則 container 的環境就只能是 Ubuntu (因此 -t ubuntu 只是將一個已經包裝好的 ubuntu template (image) 下載下來),適合 hadoop 那樣需要相同平台的

  • KVM 是最新的虛擬化技術,這跟 TVM 的架構有點像,不同的在於,這個技術的虛擬機器上所有的 Process 都是由主系統的 Linux Kernel 管理,而 TVM 則是由虛擬系統自己管理,而且 TVM 需要用軟體模擬硬體(增加 Process),所以效能較差,KVM 則因為是跟主系統共享資源,因此不會增加硬體模擬的負擔,效能較好
螢幕快照 2014-05-20 下午6.03.48.png

從效能上來看,TVM 架構下的主系統(host)需要切割實體資源給 Virtual Machine,這些資源就被 Virtaul Machine 佔用了;而 KVM 和 LXC 因為是共享 host 的實體資源,資源的共享就跟 process 或 thread 的佔用與釋放一樣,不會有永久持有,所以硬體資源可以更充分利用,當一個機器(host 或 vm)需要較多資源時,主系統就可以協調另一機器的資源來使用

另一方面,KVM 和 LXC 因為共享主系統資源,所以不需要將檔案從主系統複製或移動到虛擬機器上,即可在虛擬機上存取或運行,如此一來對於要做快速測試的開發專案而言,可以達到快速測試或佈署的目的

在進一步拿目前效能最好的 KVM 跟 LXC 做比較,KVM 的效能略遜於 LXC,因為它是完整的一個作業系統,有自己完整同主系統的 Process,但是 LXC 是一個 container 自己就是一個 process,因此使用的資源較少,但是 LXC 相較上來說彈性較差,因為它要求與主系統相同的環境

額外補充資料:

  • KVM:Kernel-bases Virtual Machine
  • LXC:LinuX Container
  • Xen