LXC簡介及經過LXC在CentOS上構建單機集羣

LXC介紹

linux container(LXC)就是一種操做系統級的虛擬化技術。是基於Linux操做系統的虛擬化技術,翻譯爲linux 容器。它能夠提供輕量級的虛擬化,以便隔離進程和資源,並且不須要提供指令解釋機制以及全虛擬化的其餘複雜性。 linux

容器有效地將由單個操做系統管理的資源劃分到孤立的組中,以更好地在孤立的組之間平衡有衝突的資源使用需求。與虛擬化相比,這樣既不須要指令級模擬,也不須要即時編譯。容器能夠在覈心 CPU 本地運行指令,而不須要任何專門的解釋機制。此外,也避免了半虛擬化和系統調用替換中的複雜性。經過提供一種建立和進入容器的方式,操做系統讓應用程序就像在獨立的機器上運行同樣,但又能共享不少底層的資源。例如,能夠有效地共享公共文件(好比 glibc)的頁緩存,由於全部容器都使用相同的內核,並且全部容器還經常共享相同的 libc 庫(取決於容器配置)。這種共享經常能夠擴展到目錄中其餘不須要寫入內容的文件。 shell

容器在提供隔離的同時,還經過共享這些資源節省開銷,這意味着容器比真正的虛擬化的開銷要小得多。Linux Container提供了在單一可控主機節點上支持多個相互隔離的server container同時執行,Linux Container有點像chroot,提供了一個擁有本身進程和網絡空間的虛擬環境。LXC 經過利用內核的CGroup來提供用戶空間的對象,用來保證資源的隔離和對於應用或者系統的資源控制,經過namespaces提供資源隔離。 centos

LXC是一種不一樣於KVM的另類的虛擬化實現方案,容器有效地將由單個OS管理的資源(計算,存儲,網絡)劃分到孤立的組中,與傳統的虛擬化相比,這樣不須要指令級模擬。避免了虛擬化中系統調用替換中的複雜性。容器是下列兩個技術的結合,在chroot的基礎上,使用namespace加強chroot環境的隔離性,使之成爲有效的容器: 緩存

1)chroot,在linux系統中,根目錄就是」/」,但使用chroot能夠用任意指定的目錄做根目錄 bash

2)namespace, 至關於單獨的TCP/IP進程,用於網絡資源的隔離 網絡

經過提供一種建立(建立容器就是將一個名稱與一個配置文件關聯,lxc-create-n name -f configfile)和進入容器的方式(ssh,VNC (GUI), VT: tty (text),VT:X(GUI),操做系統讓應用就像在獨立的機器上運行同樣,但又能共享不少底層的資源。LXC配置文件的例子以下: 架構

lxc.utsname = my_ssh_container
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.ipv4 = 10.0.2.16/24
lxc.network.name = eth0
lxc.mount = ./fstab
lxc.rootfs = ./rootfs

不管配置文件如何,用LXC工具啓動的容器有本身的系統進程視圖,以及本身的掛載樹和可用的進程間通訊(IPC)資源視圖。除了這些之外,當一個容器啓動時,配置中未提到的任何類型的資源都被認爲是與主機共享。 ssh

經過LXC構建單機集羣

LXC隨Kernel-2.6.27發佈,在Kernel-2.6.29提供完整功能。我所試驗的系統是CentOS-6.0。在CentOS上試驗LXC是很麻煩的,若是不是必須的話,仍是建議在Ubuntu上試驗和應用,都很方便。 分佈式

1. 構建虛擬的根文件系統。虛擬的根文件系統是虛擬操做系統獨立的根文件系統,與其餘虛擬的根文件系統相隔離。咱們採用拷貝宿主主機的文件系統來實現。 工具

1)首先肯定容器的根文件系統在宿主操做系統的文件系統中的位置。這裏選擇的是/lxc/${container_name},執行mkdir –p /lxc/${container_name},也能夠放在其餘目錄好比/var/lxc/${container_name},都同樣的。容器名稱我這裏選擇的是cpt, container_name=cpt 所以,實際路徑是/lxc/cpt。

2)直接拷貝宿主操做系統的根文件系統。先關閉selinux,不然拷貝/selinux目錄時會報錯。編輯/etc/selinux/config,將SELINUX=enforcing改成SELINUX=disabled. 而後重啓。以centos6爲例,centos minimal包安裝後有以下目錄:bin, cgroup, etc, lib, lost+found, mnt, proc ,sbin, srv, tmp, var, boot, dev ,home ,lib64 ,media, opt, root, selinux, sys, usr. 不拷貝sys,proc,dev目錄,僅建立sys,proc, dev目錄,由於這三個目錄不存放在某個磁盤上,而是由核心在內存中產生。其他目錄都拷貝過去,不拷貝容器根文件系統所在的目錄/lxc.

2. 設置宿主操做系統

1)安裝lxc用戶態工具。包括gcc ,lxc-0.7.5以及依賴的軟件包,建立目錄:mkdir -p /usr/local/var/lib/lxc/ 用於存放lxc-create執行後,lxc生成的配置文件。

2)配置網橋。宿主主機和容器間經過bridge來通訊,修改/etc/sysconfig/network-scripts/目錄下的網卡配置文件。建立/etc/sysconfig/network-scripts/ifcfg-br0,設置相應的DEVICE,IPADDR等選項,修改/etc/sysconfig/network-scripts/ifcfg-eth0文件,去掉IPADDR等內容,設置BRIDGE=br0。而後重啓網絡/etc/init.d/network restart。具體腳本以下:

etc/sysconfig/network-scripts/ifcfg-br0:

DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
BROADCAST=10.1.255.255
IPADDR=10.1.29.4
NETMASK=255.255.0.0
NETWORK=10.1.0.0
GATEWAY=10.1.0.254
ONBOOT=yes

/etc/sysconfig/network-scripts/ifcfg-eth1:

# Realtek Semiconductor Co., Ltd. RTL8101E/RTL8102E PCI Express Fast Ethernet controller
DEVICE=eth1
#BOOTPROTO=static
HWADDR=E0:CB:4E:B9:EB:77
#TYPE=Ethernet
#IPADDR=10.1.29.4
#NETMASK=255.255.0.0
#NETWORK=10.1.0.0
#GATEWAY=10.1.0.254
#USERCTL=no
#IPV6INIT=no
#PEERDNS=yes
ONBOOT=yes
BRIDGE=br0

3)檢查宿主操做系統的/etc/fstab文件   確保宿主文件系統中已經掛載/cgroup,不然用lxc-start容器時,會報spawn錯誤。要在宿主系統的/etc/fstab中添加none  /cgroup cgroup defaults 0 0這一行。

4)撰寫容器配置文件。須要設置容器名稱,容器的網絡類型,容器的ip地址,容器的虛擬根文件系統的路徑等。

5)撰寫容器掛載文件系統的配置文件。須要掛載/lxc/cpt/proc,/lxc/cpt/sys等目錄,不能掛載{$rootfs}/var/lock/subsys,{$rootfs}/var/run,不然容器啓動時,這兩個目錄會被隱藏,使容器啓動時報錯,可是這類錯誤不是重要錯誤,不會影響容器的主要功能使用。若是容器啓動了nfs相關服務,須要掛載/lxc/cpt/var/lib/nfs/rpc_pipefs,掛載語句以下:sunrpc /lxc/cpt/var/lib/nfs/rpc_pipefs rpc_pipefs defaults 0 0。

6)建立容器的虛擬設備。由於容器非運行在實際的硬件上,因此須要建立虛擬設備,經過mknod命令在/lxc/cpt/dev/下建立console, pts, shm, tty等設備。例如:mknod -m 666 /lxc/cpt/dev/null c 1 3

7)其餘系統設置(不是必須的)好比修改主機名,修改/etc/hosts等。

3. LXC的系統配置

1)首先切換到容器的虛擬根文件系統中。用chroot切換到容器的虛擬根文件系統中進行: chroot   /lxc/cpt /bin/bash.

2)清空容器的/etc/fstab文件。由於容器啓動時,lxc-start會根據配置文件/lxc/fstab.cpt掛載。執行:rm  -f /etc/fstab; touch /etc/fstab。

3)刪除容器虛擬文件系統網卡配置文件。lxc-start會根據配置文件/lxc/cpt.conf啓動虛擬網卡。執行:rm  -f /etc/sysconfig/network-scripts/ifcfg-eth0。

4)修改容器系統啓動配置文件和啓動腳本。容器啓動和實際操做系統啓動仍是有很多差異。不少語句不須要執行,對於centos,修改/etc/rc.d/rc.sysinit。通常是清除原文件,從新寫,須要刪除/var/run下後綴是pid的文件,以及/var/lock/subsys/*下的文件,清空/etc/mtab文件,語句以下:rm -f $(find /var/run -name '*pid'); rm -f /var/lock/subsys/*; rm -f /etc/mtab; touch /etc/mtab。

5)檢查/etc/inittab。確保從level 3啓動,語句以下: id:3:initdefault:。

6)設置容器啓動時須要同時啓動的服務用chkconfig命令開啓和關閉相關服務。

7)修改主機名和root密碼等信息。編輯/etc/sysconfig/network,修改HOSTNAME後的值爲本身設定的容器的主機名。執行password命令,修改root密碼。修改/etc/hosts文件,配置主機名和ip的對應關係。

8)配置容器完畢,exit退出。

4. 啓動容器

1)建立。lxc-create  -n  cpt  -f  /lxc/cpt.conf。lxc-create必定要用-f參數指定配置文件,不然建立的容器的配置文件是空的(/usr/local/var/lxc/cpt/config爲空)

2)啓動。前臺啓動:lxc-start -n cpt。後臺啓動:lxc-start -n -d cpt。

3)中止。lxc-stop –n cpt。

分佈式平臺的架構與部署

一般的分佈式平臺都是由一個或者多個管理節點,一個或者多個計算節點構成,以三個節點爲例,每一個節點須要運行在獨立的操做系統上。所以選擇二個容器,再加上一個宿主節點,構成有三個節點的集羣。建立普通用戶,將分佈式平臺所須要的配置文件模板,庫文件,可執行文件拷貝到相應的目錄,修改配置,設置好權限,編寫啓動腳本,便可完成分佈式平臺的部署。

1. 基本配置步驟以下:

1)先以root身份登陸,並建立一個ndsa組和ndsa用戶

# groupadd ndsa
# useradd -m ndsa -g ndsa
2)切換到ndsa用戶,將壓縮包複製到根目錄後解壓縮,此壓縮包包含分佈式平臺相關的配置文件,庫文件,可執行文件。
# su - ndsa
ndsa@:~ > tar xvfz dist2010.tgz

3)修改平臺相關配置,編寫啓動中止腳本。

2. 經過在容器的宿主主機的/etc/rc.local文件中設置相關的啓動命令,能夠實現啓動虛擬機時,啓動整個分佈式平臺,以及相關的管理程序。啓動容器和啓動分佈式平臺之間須要間隔幾秒,由於容器的啓動須要花費時間。

一些命令:

建立容器:lxc-create -n name -f configfile
列出容器: lxc-info -n name
顯示容器中的進程:lxc-ps
啓動系統容器,系統容器相似於虛擬機,但比虛擬機的隔離級別要低:lxc-start -n name init 
啓動應用容器,應用容器只是建立一個隔離一個應用程序的單獨的名稱容間:lxc-execute -n name cmd
發信號到某個容器的全部進程 :lxc-kill -n name -s SIGNAL
暫停,至關於級容器的全部進程發SIGSTOP信號:lxc-freeze -n name
恢復: lxc-unfreeze -n name
中止容器,將殺死容器內的全部進程:lxc-stop -n name
相關文章
相關標籤/搜索