Linux 容器的建立和簡單管理
cgroups 簡介
LXC 項目由一個 Linux 內(nèi)核補丁和一些用戶空間(userspace) 工具組成。這些工具使用由補丁增加的內(nèi)核新特性,提供一套簡化的工具來維護容器。2.6.29 版本后的 Linux 內(nèi)核版本已經(jīng)包含該補丁提供的大部分功能。所以強烈建議使用***的內(nèi)核源代碼。LXC 在資源管理方面依賴 Linux 內(nèi)核的 cgroups (Control Groups) 系統(tǒng),cgroups 系統(tǒng)是 Linux 內(nèi)核提供的一個基于進程組的資源管理的框架,可以為特定的進程組限定可以使用的資源。它最初由 Google 的工程師提出,后來被整合進 Linux 內(nèi)核。cgroups 也是 LXC 為實現(xiàn)虛擬化所使用的資源管理手段,可以說沒有 cgroups 就沒有 LXC。cgroups 文件系統(tǒng)結構見圖 1 。
圖 1.cgroups 文件系統(tǒng)結構
相關名詞解釋
控制族群(control group):控制族群就是一組按照某種標準劃分的進程。cgroups 中的資源控制都是以控制族群為單位實現(xiàn)。一個進程可以加入到一個控制族群,也可以遷移到另一個控制族群。
層級(hierarchy)??刂谱迦嚎梢越M織成 hierarchical 的形式,既一顆控制族群樹??刂谱迦簶渖系淖庸?jié)點控制族群是父節(jié)點控制族群的孩子,繼承父控制族群的特定的屬性。
子系統(tǒng)(subsytem)。一個子系統(tǒng)就是一個資源控制器,比如中央處理器子系統(tǒng)就是控制中央處理器時間分配的一個控制器。子系統(tǒng)必須附加(attach)到一個層級上才能起作用,一個子系統(tǒng)附加到某個層級以后,這個層級上的所有控制族群都受到這個子系統(tǒng)的控制。主要包括如下 9 個子系統(tǒng):
- blkio : 這個子系統(tǒng)為塊設備設定輸入/輸出限制,比如物理設備(磁盤,固態(tài)硬盤,USB 等)。
- cpu : 這個子系統(tǒng)使用調(diào)度程序提供對 中央處理器的 cgroup 任務訪問。
- cpuacct : 這個子系統(tǒng)自動生成 cgroup 中任務所使用的中央處理器報告。
- cpuset : 這個子系統(tǒng)為 cgroup 中的任務分配獨立中央處理器(在多核系統(tǒng))和內(nèi)存節(jié)點。
- devices : 這個子系統(tǒng)可允許或者拒絕 cgroup 中的任務訪問設備。
- freezer : 這個子系統(tǒng)掛起或者恢復 cgroup 中的任務。
- memory : 這個子系統(tǒng)設定 cgroup 中任務使用的內(nèi)存限制,并自動生成由那些任務使用的內(nèi)存資源報告。
- net_cls : 這個子系統(tǒng)使用等級識別符(classid)標記網(wǎng)絡數(shù)據(jù)包,可允許 Linux 流量控制程序(tc)識別從具體 cgroup 中生成的數(shù)據(jù)包。
- ns :ns 子系統(tǒng)提供了一個將進程分組到不同名稱空間的方法。在具體名稱空間中,進程可彼此互動,但會與在其它名稱空間中運行的進程隔絕。這些分開的名稱空間在用于操作系統(tǒng)級別的虛擬化時,有時也稱之為容器。
搭建***個 LXC 虛擬計算機
本文使用的 Linux 發(fā)行版是 Ubuntu 12.10 ,首先安裝軟件包:
- #apt-get install lxc
安裝軟件包后要檢查 Linux 發(fā)行版的內(nèi)核對 LXC 的支持情況,可以使用下面命令 lxc-checkconfig 查看,見圖 2 。
圖 2.lxc-checkconfig 命令
lxc-checkconfig 命令檢查之后如果所有項目顯示“enabled”表示可以直接使用 LXC。#p#
建立一個 Ubuntu Server LXC 虛擬計算機系統(tǒng)
使用如下命令構建(執(zhí)行過程見圖)3:
- #lxc-create -t ubuntu -n cjhlxc1
說明這里使用的是 ubuntu 模板,模板文件保存在/usr/lib/lxc/templates/目錄下,這個目錄下還有其他模板,可以使用如下命令查看,命令輸出如下:
- # tree /usr/lib/lxc/templates/
- /usr/lib/lxc/templates/
- ├── lxc-busybox
- ├── lxc-debian
- ├── lxc-fedora
- ├── lxc-opensuse
- ├── lxc-sshd
- ├── lxc-ubuntu
- └── lxc-ubuntu-cloud
圖 3.建立一個 Ubuntu Server LXC 系統(tǒng)
說明:安裝過程要持續(xù)一段時間,另外安裝過程要保證互聯(lián)網(wǎng)連接。
上面命令完成后, 會在 /var/lib/lxc 目錄中, 產(chǎn)生虛擬計算機 cjhlxc1 ,它的目錄結構見圖 4 。
圖 4.虛擬計算機 cjhlxc1 目錄結構
LXC 虛擬計算機的基本管理——了解 LXC 虛擬計算機的管理命令
LXC 常見命令說明見表 1:
表 1 LXC 常見命令說明
說明:更加詳細的 lxc 命令列表和使用方法請讀者參考官方網(wǎng)站文檔。
圖 5 是主要 LXC 命令執(zhí)行過程的示意圖
圖 5.LXC 命令執(zhí)行過程的示意圖
#p#
LXC 常見命令說明舉例
啟動 LXC 虛擬計算機
- # lxc-start -n cjhlxc1
確實的賬號和密碼都是 ubuntu 然后登錄虛擬計算機見圖 6:
圖 6.登錄虛擬計算機
列出當前系統(tǒng)所有的容器
檢查目前有哪幾個容器啟動(若沒有任何結果,則目前都沒有容器啟動):
- # lxc-ls
- cjhlxc1 foo
使用 console 登入容器第 3 個控制臺:
- $ lxc-console -n cjhlxc1 –t 3
說明:如果沒有指定 -t N 選項,則一個沒有被使用的控制臺將自動選擇。要退出控制臺,使用快捷鍵 Ctrl-a q 。
停止運行一個容器:
- # lxc-stop -n cjhlxc1
獲取一個容器的狀態(tài):
- # lxc-info -n ol6ctr1
把一個容器銷毀:
- # lxc-destroy -n cjhlxc11
復制一個容器:
- # lxc-clone -o cjhlxc1 -n ol6ctr2
暫?;蚧謴鸵粋€容器:
- # lxc-freeze -n cjhlxc1
- # lxc-unfreeze -n cjhlxc1
LXC 虛擬網(wǎng)絡接口設置
了解 LXC 內(nèi)置的網(wǎng)絡架構
不管是哪套虛擬系統(tǒng),只要是運作在 Linux 系統(tǒng)架構之內(nèi),所使用的虛擬網(wǎng)絡都是 Linux 系統(tǒng)缺省的虛擬網(wǎng)絡架構(即 TAP/TUP, Bridge)圖 7 是示意圖 。
圖 7.LXC 虛擬網(wǎng)絡接口示意圖
圖 7 這個結構中兩個容器使用 Veth Bridge,因為默認情況下,LXC 的模板腳本設置網(wǎng)絡都是基于 Veth Bridge。在這種模式下,容器從 dnsmasq 服務器獲取其 IP 地址。主機允許的容器連接到網(wǎng)絡的其余部分(使用 iptables 的 NAT 規(guī)則 ,但這些規(guī)則不允許傳入的連接到容器)。
除了 Veth Bridge 外,LXC 虛擬計算機還支持 Macvlan Bridge 和 Macvlan VEPA。有時我們可能需要一塊物理網(wǎng)卡綁定多個 IP 以及多個 MAC 地址,雖然綁定多個 IP 很容易,但是這些 IP 會共享物理網(wǎng)卡的 MAC 地址,可能無法滿足我們的設計需求,所以有了 MACVLAN 設備,其工作
MACVLAN 會根據(jù)收到包的目的 MAC 地址判斷這個包需要交給哪個虛擬網(wǎng)卡。限于篇幅這里介紹 Macvlan Bridge 和 Macvlan VEPA,感興趣的用戶可以參考參考文獻中的介紹。
與 KVM 相同 LXC 安裝完成,缺省就會產(chǎn)生一個網(wǎng)絡接口(包含以下功能:交換機(Switch Hub) + DHCP 服務器 + NAT + Cache DNS 服務器),網(wǎng)絡接口名稱也就是 lxcbr0,可以通過如下命令驗證:
- # brctl show
- bridge name bridge id STP enabled interfaces
- lxcbr0 8000.3eef2e882ac9 no vetheCYpw4
由上面的命令輸出圖就可以明顯看到 lxcbr0 的相關信息,而這個網(wǎng)絡接口,除了扮演交換機的功能之外,缺省也提供了 NAT 與 DHCP 的功能,簡單來說就是 lxcbr0 除了提供交換機的功能之外,也提供了 DHCP 服務與 DNS 緩存服務 , 再通過 iptables 啟動 NAT 的功能,由以下命令可以來證明,命令輸出如下:
- # iptables -t nat -L -n
- Chain PREROUTING (policy ACCEPT)
- target prot opt source destination
- Chain INPUT (policy ACCEPT)
- target prot opt source destination
- Chain OUTPUT (policy ACCEPT)
- target prot opt source destination
- Chain POSTROUTING (policy ACCEPT)
- target prot opt source destination
- MASQUERADE all -- 10.0.3.0/24 !10.0.3.0/24
DHCP 服務與 DNS 緩存服務的功能,可以通過如下命令驗證:
- #ps aux | grep lxc
命令輸出見圖 8:
圖 8.查看 DHCP 服務與 DNS 緩存服務
#p#
修改 LXC 網(wǎng)絡接口的方法
一般我們是通過修改 lxcbr0 的設置文件的方法來實現(xiàn)的。通過〝ifconfig lxcbr0〞的命令,可以得知 lxcbr0 本身的 IP 地址,而由〝ps aux | grep dnsmasq〞的命令,也可以清楚看到 DHCP Server 分配的 IP 范圍,因此可以知道 LXC 缺省虛擬網(wǎng)絡預設的 IP 區(qū)段為 10.0.3.0/24,那么,這些信息,可以修改嗎?當然可以,以上這些網(wǎng)絡信息,是 LXC 缺省預設的網(wǎng)絡設置,所以可以通過修改配置文件的方式,來修改相關信息,以符合實際應用的狀況,可以利用編輯器來修改 LXC 的網(wǎng)絡配置文件:
- # vi /etc/default/lxc
清單 1./etc/default/lxc 文件內(nèi)容:
- LXC_BRIDGE="lxcbr0"
- LXC_ADDR="10.0.3.1"
- LXC_NETMASK="255.255.255.0"
- LXC_NETWORK="10.0.3.0/24"
- LXC_DHCP_RANGE="10.0.3.2,10.0.3.254"
- LXC_DHCP_MAX="253"
- LXC_SHUTDOWN_TIMEOUT=120
用戶修改后要重新啟動網(wǎng)絡服務,使用如下命令:
- #service lxc-net restart
設置 LXC 使用物理網(wǎng)絡接口
相比 KVM 來說,LXC 可以直接使用物理網(wǎng)絡接口(比如在本文中物理網(wǎng)卡是 eth0、eth1,筆者準備把 eth0 分配給 LXC 虛擬網(wǎng)絡 )。首先使用“ ifconfig –a”命令查看一下,其中而 eth1 為實體計算機實際對外聯(lián)機所使用的網(wǎng)絡接口,所 eth0 ,就可以拿來設定給 LXC 虛擬計算機來使用。然后修改修改 LXC 虛擬計算機的配置文件:/var/lib/lxc/cjhlxc1/config。
- #vi /var/lib/lxc/cjhlxc1/config
清單 2 /var/lib/lxc/cjhlxc1/config 文件內(nèi)容:
- lxc.network.type=phys
- lxc.network.link=eth0
- lxc.network.flags=up
- lxc.utsname = cjhlxc1
- #lxc.network.hwaddr = 00:16:3e:f9:ad:be #此行要注釋掉#
- lxclxc.devttydir = lxc
- lxc.tty = 4
- lxc.pts = 1024
- lxc.rootfs = /var/lib/lxc/myt2/rootfs
- lxc.mount = /var/lib/lxc/myt2/fstab
- lxc.arch = amd64
- lxc.cap.drop = sys_module mac_admin
- lxc.pivotdir = lxc_putold
修改完成后存盤退出。簡單說明一下以上參數(shù):
lxc.network.type 指定用于容器的網(wǎng)絡類型,包括四種類型:
- empty:建立一個沒有使用的網(wǎng)絡接口
- veth:容器將鏈接到 lxc.network.link 定義的網(wǎng)橋上,從而與外部通信。之前網(wǎng)橋必須在預先建立。
- macvlan:一個 macvlan 的接口會鏈接到 lxc.network.link 上。
- phys: lxc.network.link 指定的物理接口分配給容器。
lxc.network.flags 用于指定網(wǎng)絡的狀態(tài),up 表示網(wǎng)絡處于可用狀態(tài)。
lxc.network.link 用于指定用于和容器接口通信的真實接口,比如一個網(wǎng)橋 br0 。
lxc.network.hwaddr 用于指定容器的網(wǎng)絡接口的 mac 地址。
下面修改主機網(wǎng)絡配置文件:
- #vim /etc/network/interface
注意此時配置文件是空文件,沒有內(nèi)容。通常可以設置為固定 IP 地址模式(見清單 3)或者通過 DHCP 服務器獲取 IP 地址模式(見清單 4)
清單 3.固定 IP 地址模式:
- auto lo
- iface lo inet loopback
- auto eth0
- iface eth0 inet dhcp
- dns-nameservers 10.0.0.4
清單 4.通過 DHCP 服務器獲取 IP 地址模式:
- auto lo
- iface lo inet loopback
- auto eth0
- iface eth0 inet static
- address 10.0.0.3
- netmask 255.255.255.0
- dns-nameservers 10.0.0.4
修改完成后存盤退出。然后重新啟動網(wǎng)絡服務:
- #/etc/init.d/networking restart
下面啟動 LXC 虛擬計算機:
- # lxc-start -n cjhlxc1
注意一旦 LXC 虛擬計算機啟動成功,在宿主計算機上使用〝ifconfig -a〞查看主機網(wǎng)絡接口,用戶會發(fā)現(xiàn)此時網(wǎng)絡接口 eth0 消失了,只有 eth1 。這是因為 eth0 已經(jīng)讓 LXC 虛擬計算機給使用了。然后我們使用如下命令“ lxc-console -n cjhlxc1”登錄 LXC 虛擬計算機發(fā)現(xiàn)此時 LXC 虛擬計算機的網(wǎng)絡接口是 eth0。然后我們可以使用 ping 命令測試一下 LXC 虛擬計算機和互聯(lián)網(wǎng)是否聯(lián)通。
總結
LXC 中文名稱就是 Linux 容器工具,容器可以提供輕量級的虛擬化,以便隔離進程和資源,使用 LXC 的優(yōu)點就是不需要安裝太多的軟件包,使用過程也不會占用太多的資源,本文循序漸進地介紹在 Linux 容器的建立和管理方法以及虛擬網(wǎng)絡接口的設置方法。