LXC-Linux Containers介紹


Linux Containers,Linux的容器,容器嘛,可以想象成一個大的裝東西的罐子,罐子口很大,里面可以裝很多同樣形狀,只不過大小不同的小罐子。專業的話,叫做基於容器的操作系統層面的虛擬化技術。

在這個大的容器里面,可以裝很多小的容器,每一個容器都具備完整的運行環境,如特定的CPU、memory節點、可分配的cpu時間,IO時間,受限的內存大小(包括內存和SWAP),提供對底層設備的訪問,擁有獨立的namespace(網絡、pid、ipc、mmt和uts)。

LXC項目地址:https://linuxcontainers.org/

LXC在github上的地址:https://github.com/lxc/lxc

 

一個LXC的實例,我們稱之為container,類比於PC機器上面的Virtual Box和Vmware。

LXC具體組成

LXC項目在Sourceforge上面的,它有一個Linux內核補丁和一些用戶空間的工具組成,其中內核補丁提供底層新特性,上層工具使用這些新特性,提供一套簡化的工具來維護容器。

LXC在資管管理方面,依賴與Linux內核密切相關的Cgroups子系統,這個子系統是Linux內核提供的一個基於進程組的資源管理框架,可以為特定的進程組限定可以使用的資源,借助cgroups子系統,在當前Linux環境下,實現一個輕量化的虛擬機。

LXC在隔離控制方面,依賴於Linux內核提供的namespace特性,具體來說,就是在clone的時候加入相應的flag。

 

LXC的優勢

LXC是操作系統層面的虛擬化技術,與傳統的HAL層次的虛擬化技術相比,有以下優勢:

1. 更小的虛擬化開銷。LXC的諸多特性基本有內核提供

2. 快速部署。只需要安裝LXC,就可以利用LXC的相關命令來創建並且啟動容器,為應用提供虛擬執行環節。而傳統的虛擬化技術,需要先創建虛擬機,然后安裝系統,再部署應用。

3. 虛擬機的rootfs就在/var/lib/lxc/container_name ,可以在宿主機上輕松修改container的文件系統。

4. LXC使用apparmor,應用程序訪問控制系統來確保主機不受容器內實例的惡意行為。

LXC的缺點

1. 缺少對磁盤限額(disk quota)的支持,目前使用LVM來限定支持。

2. 缺少對寫時復制(copy on write)的支持,對於每個容器來說,都是一份操作系統的用戶態實例,都有屬於自己的系統庫函數文件等必需文件。在一個系統有多個容器的情況下,這會造成磁盤空間的浪費。這里可以借鑒寫時復制的概念,對於容器共用的文件,在沒有對共享文件進行寫入之前,可以只保存一份拷貝,其他容器采用硬鏈接的方式來共享,當有容器對共享文件進行寫入時,為其單獨創建一份拷貝。

3. 進程和容器之間的動態關聯還不夠完善

    理想情況下,進程和容器之間是動態關聯的,進程可以在容器之間遷移。在LXC中,資源管理是通過cgroups實現的,進程可以在cgroup之間有條件的遷移。命名空間的隔離是通過namespace實現的,目前內核只支持進程變更有限的幾類命名空間。

4. 不支持checkpoint

    checkpoint技術可以將容器中所有的進程暫時frozen,將當時容器完整的狀態存儲在磁盤上,類似於Vmware的snapshot,目前LXC不支持checkpoint技術,只是借助cgroups的freezer子系統,將進程暫時frozen和resume,沒有完整的存儲容器的狀態。

5. 不支持容器的動態遷移

   動態遷移是指將正在運行的容器從一個機器上遷移到另一個機器上,在此過程中,容器中的進程無需停止,此項技術可以用來優化服務器集群的資源配置。目前LXC不支持動態遷移。

 

LXC安裝使用

在Ubuntu系統下,可以使用apt命令來安裝或者使用源碼來安裝,建議使用apt來安裝,這種方式在安裝過程中會自動安裝LXC所依賴的其他軟件.

image

在正確使用lxc之前,需要對其配置文件進行簡單的介紹,以便更好的理解LXC的工作原理.

a. /etc/lxc/lxc.conf    創建lxc容器的時候默認使用的配置文件,默認內容如下。

image

b. /usr/lib/lxc/templates/   該目錄保存當前LXC支持的各種發行版本的Linux模板配置文件

image

c. /var/lib/lxc/       該目錄存放每個創建的容器實例,只有root用戶才有權限訪問其內容

d. /var/cache/lxc   該目錄存放容器實例的cache,加快容器實例創建速度。

 

LXC根據容器類型的不同而有所不同,一種是系統容器,一種是應用程序容器。系統容器類似於虛擬機,

lxc-start –n name init ,運行init程序。

 

應用程序容器只是創建用於隔離一個應用程序的單獨的命名空間,類似的命令,lxc-execute –n name cmd

 

LXC常用命令

1. lxc-checkconfig   用於判斷Linux內核是否支持LXC

2. lxc-create          用於創建一個容器

   lxc-create –n name [ –f config_file ]

   name        創建的容器名稱

   config_file  容器配制文件的路徑

   備注: 容器名稱是全局的,也就是說,系統不允許存在重名的容器。lxc-create創建的容器,在停止運行后,不會自動銷毀。

3. lxc-destroy          用於銷毀一個容器

4. lxc-execute          用於在一個容器執行應用程序

   lxc-execute –n name [ –f config_file] [ –s KEY=VAL ] command

  name       容器名稱

  config_file 容器配制文件路徑

   -s 后面跟配制鍵值對 例如 lxc.cgroup.cpu.shares = 512

   command   待執行的命令

備注:如果不存在name容器,lxc-execute會自動創建一個,容器停止運行后會自動銷毀。

        執行過程中,有限選用 –f 指定的配置文件參數。 -s選項可以特別改變配置文件中的某一項參數值。

        lxc-execute 先創建lxc-init進程,然后在lxc-init中fork一個進行來執行命令,常用於在容器中執行應用程序。

5. lxc-start           用於在容器中執行給定命令

    lxc-start –n name [-f config_file ] [-c console_file ] [-d] [-s KEY=VAL]  [command]

    -d : 將容器當做守護進程執行

    -c : 指定一個文件作為容器的控制台輸出,默認為終端

備注:如果容器還不存在,lxc-start會自動創建一個,容器停止允許后會自動銷毀。它是直接創建進程來運行命令。

        lxc-start 用於在容器中啟動system

6. lxc-kill               用於發送信號給容器中的第一個用戶進程(容器內部進程號為1的為init,進程號為2的為第一個用戶進程),默認信號為SIGKILL。

     lxc-kill –n name [SIGNUM]

7. lxc-stop              用於停止容器中所有的進程

      lxc-stop –n name

  8. lxc-destroy         用於銷毀容器

      lxc-destroy –n name

  9. 其他命令,等到需要的時候再補充。

使用上述命令,需要root權限來執行。

在成成的虛擬機容器中,有config配置文件,可以在里面添加針對這個虛擬機的各種資源限制范圍。

 

 

經驗總結

1. 創建虛擬機,需要以root權限來創建和執行上述相關的命令

2. 當嘗試在容器中執行命令出現如下錯誤時,

image

由於LXC采用cgroup對容器進行資源管理,在實際使用lxc之前,必須執行mount none –t cgroup /cgroup 來掛載cgroup系統,或者將此命令寫到/etc/fstab中,讓系統每次啟動時,自動掛載cgroup。

解決方法: https://groups.google.com/forum/#!topic/ns-3-users/brjBDmGU4PE

image

 

Cgroup部分的配置都是以lxc.cgroup.[subsystem name].key=value的形式出現的.例如:

lxc.cgroup.cpu.shares=512

lxc.cgroup.cpuset.cpus=1.2

cgroup下面有cpu子系統、cpuset子系統、memory子系統、blkio子系統、network部分、rootfs部分這些來設置。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM