lmctfy:讓我用集裝箱為你的程式打包

發表於2013-10-04

lmctfy (Let Me Contain That For you,發音是lem-kut-fee)是谷歌Google開發的容器棧,可以為Linux應用提供容器(container)。這些容器可以讓一臺機器上的不同應用使用相互隔離的資源,以獨佔的方式執行在同一臺機器上。這些應用也可以擁有容器,因此能夠建立和管理屬於他們自己的子容器。

這項專案旨在提供一組以使用者的意圖為原點的高階API,來實現對容器概念的抽象化。這些建立的容器自身也透過繼承也可以擁有了自己的容器、也能夠被其他的使用者程式所管理。

Lmctfy是為某些特定的場景(配置環境)設計、實現的,所以可能不能在所有場景(配置環境)中正常運作。我們的目標是為更多的場景(配置環境)提供更多的支援,所以你可以為這項專案貢獻你的補丁或是在郵件列表中傳送郵件,這樣我們可以朝著既定的路線圖前進。

lmctfy 內包含一個C++庫和一個CLI(命令列介面程式)

最新進展

lmctfy 還是一個在beta階段的應用,目前仍在主要開發中。最新的版本是0.1。她目前只支援CPU和記憶體資源的隔離。點選檢視我們的路線圖來了解各部分的開發情況,點選檢視貢獻

從此開始

這一節描述如何編譯你的CLI,執行所有的UI測試,和初始化機器的細節。 CLI這節提供了一些CLI操作的例子,C++ 庫描述了這個庫的使用詳情。

依賴

編譯本程式需要使用make和g++4.7。 lmcfy使用了C++11,所以需要支援這項功能的編譯器。我們在 Ubuntu 12.04+ 上測試過編譯。如果有為其他環境的編譯提供支援的補丁,我們很高興而且希望這越多越好。

lmctfy 依賴下列幾個庫,需要這些庫存在於你的計算機系統裡。

編譯CLI

編譯lmctfy的CLI:

make -j <執行緒數> lmctfy

CLI程式會生成在 bin/lmctfy/cli/lmctfy

編譯C++庫

編譯lmctfy的庫:

make -j <執行緒數> liblmctfy.a

庫檔案會生成在 bin/liblmctfy.a.

執行測試

編譯和執行所有的UI測試:

make -j <執行緒數> check

初始化

lmctfy已經在 Ubuntu 12.04+ 上的 3.33.8 核心上測試過。 lmctfy在一臺機器的所有容器都是執行它的時候運轉得最好,所以不建議讓她執行在LXC或者其他container系統上(儘管在某些特殊得配置下這能夠跑起來)。

為了執行lmctfy,我們必須首先初始化計算機。這隻需要執行一次就可以,而且一般是在計算機第一次啟動時候就完成了。當cgroup的hierarchies已經掛載了,接下來通常一個空的配置會可以讓lmctfy自動監測到目前的掛載。

lmctfy init ""

如果cgroup的hierarchies沒有被掛載,那麼必須指明這些資源,這樣lmctfy才可以掛載他們。目前版本需要以下cgroup的hierarchies資源cpucpusetcpuacctmemoryfreezercpucpuacct 是目前唯一可以被共享掛載的,其他的必須被單獨地掛載。具體配置說明可以檢視lmctfy.proto中的InitSpec節。以下的例子是一個掛載了/dev/cgroup中的所有hierarachies的配置檔案:

lmctfy init "
  cgroup_mount:{
    mount_path:'/dev/cgroup/cpu'
    hierarchy:CGROUP_CPU hierarchy:CGROUP_CPUACCT
  }
  cgroup_mount:{
    mount_path:'/dev/cgroup/cpuset' hierarchy:CGROUP_CPUSET
  }
  cgroup_mount:{
    mount_path:'/dev/cgroup/freezer' hierarchy:CGROUP_FREEZER
  }
  cgroup_mount:{
    mount_path:'/dev/cgroup/memory' hierarchy:CGROUP_MEMORY
  }"

這樣,機器就可以被lmctfy使用、進行容器的操作。

容器的命名

容器的命名系統簡化了檔案系統的路徑,因為以後只需要一系列容器的繼承(容器的容器、子容器、子子容器)就可以了♪───O(≧∇≦)O──── ♪。

容器名稱允許的字符集:

  • 英文字母+阿拉伯數字 ([a-zA-Z0-9]+)
  • 下劃線 (_)
  • 橫縣 (-)
  • 英文句號 (.)

絕對路徑是從容器(比如是/sys/subcont)的根目錄(/)開始計算的。容器的名字也可以是相對的(比如subcont)。一般地(除非特殊情況說明),都是沿用一般的檔案路徑方式。

例子

	/ 		: 容器的根目錄
	/sys 		: "sys" 容器
	/sys/sub	: "sub" 容器,"sys"容器的子容器
	. 		: 當前的容器
	./ 		: 當前的容器
	.. 		: 當前的容器的父容器
	sub 		: 當前的容器的"sub" 子容器
	./sub 	: 當前的容器的"sub" 子容器
	/sub 		: "sub" 容器
	../sibling	: 當前的父容器的“sibling”子容器

 

CLI

建立

建立一個容器:

lmctfy create <名稱> <引數>

更完整的細節參見lmctfy.proto

例子 (建立一個記憶體限制在100MB的容器):

lmctfy create memory_only "memory:{limit:100000000}"

銷燬

銷燬一個容器:

lmctfy destroy<名稱>

列表

從根目錄遞迴顯示當前機器的所有容器:

lmctfy list containers -r /

你也可以只列出當前的子容器:

lmctfy list containers

執行

在一臺容器中執行命令:

lmctfy run <名稱> <命令列>

 

例子:

lmctfy run test "echo hello world"

lmctfy run /test/sub bash

lmctfy run -n /test "echo hello from a daemon"

其他

鍵入lmctfy help檢視全部的命令和文件

C++ Library

此庫包含了::containers::lmctfy::ContainerApi 用來建立、獲取、銷燬、監測::containers::lmctfy::Container型別的物件,並且被獨立的容器相互交流。具體的lmctfy C++庫的文件可以檢視標頭檔案lmctfy.h(你是認真的嗎( ̄▽ ̄))。

路線圖

lmctfy專案透過兩個層(CL1、CL2)來實現一個容器棧。CL1圍繞著驅動程式,並執行CL2制定的容器策略。CL1會為更高層建立和維護容器的抽象。她應當是唯一直接和核心交流以維護容器的層。 CL2發展和設定容器策略,她使用CL1來執行策略和操控容器。比如,CL2(後臺程式)實現了一個策略:所有容器的CPU和記憶體使用總和不可以超過現提供的CPU和記憶體資源(以防止對記憶體資源的過度使用)。為了執行這條策略,她(CL2)會使用CL1(library/CLI)來建立帶這條記憶體限制規則的容器。另一條對應的策略可能包括了允許過度使用X%的機器資源或者對不同資源的多重層次控制。

lmcfty專案現在提供了CL1元件,CL2還沒有實現。

CL1

現在只提供高效能CPU和記憶體隔離。在我們的路線圖中我們還需要實現以下幾項:

  • 磁碟IO隔離: 這部分幾乎完成了,但是我們還缺少控制器和資源處理器。
  • 網路隔離: 這部分和cgroup實現還在計劃中。
  • 名稱空間支援: 給所有名稱空間支援並且整合到相關的資源中。
  • 根檔案系統支援: 識別並建立根檔案系統。
  • 磁碟映象: 可以匯入和匯出容器的根檔案系統的映象。
  • 支援暫停/繼續: 使用繼承的freezer。
  • 還原點恢復: 可以建立還原點並恢復到不同機器的容器中。

CL2

最基礎的CL2 應當有一個容器策略來保證在機器不允許超載執行情況下的資源合理分配。我們的目標是CL2最終實現提供不同層次的服務。在這個框架下一些層次可以比其他的獲得更多好的服務。

  • 監控和統計支援。
  • 管理功能和功能檢查。
  • 服務的質量保證和執行。

核心支援

lmctfy 最初的設計和實現是在一個自定義的核心上(一個原生linux核心外加一些列自選的補丁)上。由此,一些特性在這些核心補丁上跑得最理想。但是lmctfy應該在沒有他們得情況下正常執行。她應當監測可用得核心支援並且與之適應。我們已經在原生的 Ubuntu3.33.8 系列核心上測試過。如果你發現在其他版本核心下的問題,請彙報。

一些相關的核心補丁:

  • CPU 延時: 這個補丁為cpu hierarchy增加了cpu.lat的cgroup 檔案。她限制了cgroup能預測的CPU喚醒延時時間。
  • CPU 柱狀圖統計: 這個補丁為cpuacct hierarchy增加了cpuacct.histogram cgroup 檔案。她為CPU計劃行為提供了多種柱狀圖方案。
  • OOM 管理: 一系列的補丁,用於在記憶體用盡的情況下執行優先權。

貢獻

對專案感到興趣了?看看我們的路線圖,看你是不是由很多想貢獻的方向呢? 從此開始,你應該可以執行我們的程式。如果無法執行,請讓我們知道,這樣我們可以改進這份指南。

郵件列表

本專案的郵件列表是lmctfy@googlegroups.com。本郵件列表用來發布、討論、一般性支援。

 

原文: https://github.com/google/lmctfy/

本文由LCTT 原創翻譯,Linux中國 榮譽推出

譯者:Chilledheart 校對:wxy

相關文章