Linux中國

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

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資源cpu,cpuset,cpuacct,memory和freezer。 cpu和cpuacct 是目前唯一可以被共享掛載的,其他的必須被單獨地掛載。具體配置說明可以查看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


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國