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