2012年11月15日 星期四

Linux Container (lxc) - 物美價廉的 Virtualization

今天因爲工作的需要又裝了一次 Container,沒想到在 Ubuntu 下面裝 Container 已經變得如此簡單,所以趁着記憶新鮮的時候講 Setup 的步驟記錄下來,希望可以讓更多人用到這們好的東西。



在這之前先講講 Container 是什麼東西,簡單來講,我們常常透過 Virtual Machine 來當做測試、開發用的 「沙盒(Sandbox)」,目的就是爲了不要污染原本電腦中的環境,也保持環境的乾淨度以利測試或開發進行,但是 Virtual Machine 耗費的資源過於龐大,一下就得佔走一顆 CPU 和一定數量的 Memory,唯一的好處就是可以裝不一樣的作業系統,但要是不需要不一樣的作業系統的時候呢?這時候我們就可以用 Container 啦,而 LXC 就是在 Linux 底下可以方便使用這個機制的一套工具!

Container 是基於 chroot 的概念出發的機制,由於 Linux 系統底下「萬物皆檔案」,所以只要能把檔案系統分開來,看起來就是另外一臺不一樣的電腦啦!

Container 的 Wikipedia: http://en.wikipedia.org/wiki/Operating_system-level_virtualization

接下來來講講如何 Setup 吧!




雖然講的是 Ubuntu,但是由與筆者的電腦是 Linux Mint(骨子還是 Ubuntu 的另外一套 Linux distro),所以中間步驟會有一點差異,但是差異不大,大概就是沒差異啦。

(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

記著:離開的指令是 <Ctrl-a> 然後按  <q>。

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

(5) 關閉運行中的 Container

lxc-stop -n test-1

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

2 則留言:

  1. Hi ! Mr. Q
    I have a problem on Linux Mint.

    我安裝好後要建立 VM,這樣: lxc-create -t ubuntu -n text-lxc
    一直都會報錯:
    lxc-create: No such file or directory - bad template: ubuntu
    lxc-create: bad template: ubuntu
    我的環境是 Linux PLSM-Veck 3.11.0-12-generic #19-Ubuntu SMP Wed Oct 9 16:20:46 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

    後來找到的解決方法是:安裝額外的套件 lxc-template 和 debootstrap
    就可以成功 lxc-create 了!

    回覆刪除