読者です 読者をやめる 読者になる 読者になる

TenForward

技術ブログ。はてなダイアリーから移転しました

cgmanager を試す (1)

cgmanager についてはドキュメントがほぼないため,以下には間違いが含まれている可能性があります.見つけたら指摘してくださいね.

Linux Containers - CGManager - Introduction は名前通り cgroup を管理するソフトウェアです.cgroup の管理を D-Bus 経由で行います.主に LXC からの使う事を考えて作られています.開発は Github 上で行われています.

現在,Linux の cgroup の実装は再構築が進んでいて,将来的には今のようにお気軽に誰でも cgroupfs 以下にディレクトリを作ったりするものではなくなるようです (→ Linux カーネルのすべて: cgroup の再設計 を参照).そしてシステム上には 1 つだけ cgroup を管理するようなソフトウェアが実行されるようになる,という風な事が考えられているようです.

その流れとして,init として systemd が使われる環境では cgroup の管理は将来的には全て systemd が請け負うことになりますので,cgmanager が使われることはないでしょう.これは cgroup を管理する仕組みを持たない init が動いてるシステムで使われることになります.LXC 自体が Ubuntu の人たちによって開発されているので,主に Upstart の環境でテストされていると思いますが,同様な理由で sysvinit なシステムでも動作するはずです.(現時点では systemd が動いているシステムでも動くはずです)

同様のソフトに,先に紹介した Google によって開発されている lmctfy があります.こちらはコンテナスタックということなので cgroup に限らず namespace も扱うようになるのかもしれません.

cgmanager の開発はほとんど追ってないのですが,現時点でも簡単な操作は可能になっているようですので,簡単に試してみました.テストは Plamo-5.2 (kernel 3.12.5) 上で行っています.cgmanager は 0.19 の頃作ったものです(ちょっと古い).

  1. cgmanager は dbus を扱うのに libnih を使いますので,まずはこれをインストールします.
  2. cgmanager のリポジトリを clone します (or アーカイヴを取得します)
    $ git clone https://github.com/cgmanager/cgmanager/releases
  3. ビルド&インストールします (ここはこの方法で良いのか知らない ^^;)
    $ cd cgmanager
    $ cp /usr/share/libtool/config/ltmain.sh .
    $ autoscan && aclocal && autoheader && automake -a -c && autoconf
    $ ./configure --prefix=/usr --libdir=/usr/lib64 --sysconfdir=/etc --localstatedir=/var --man=/usr/share/man
    $ make && make install

実行は以下のようにするようです.

# cgmanager --daemon

以下のようにソケットが作られます.

# ls -l /sys/fs/cgroup/cgmanager/
合計 0
srwxrwxrwx 1 root root 0  2月 27日  20:30 sock=

まずは "memory" という cgroup (メモリコントローラ) 以下に "test" というグループを作ってみます.

# /usr/bin/dbus-send \
        --print-reply \
        --address=unix:path=/sys/fs/cgroup/cgmanager/sock \
        --type=method_call \
                /org/linuxcontainers/cgmanager \
                org.linuxcontainers.cgmanager0_0.Create \
                string:'memory' string:"test"
method return sender=(null sender) -> dest=(null destination) reply_serial=1
   int32 -1
# ls -ld /sys/fs/cgroup/memory/test
drwxr-xr-x 2 root root 0  2月 27日  21:39 /sys/fs/cgroup/memory/test/

ハイ,できてますね (当たり前).

値を設定してみます.上記で作成した 'test' に対して memory.limit_in_bytes を 100000 に設定します.

# /usr/bin/dbus-send \
        --print-reply \
        --address=unix:path=/sys/fs/cgroup/cgmanager/sock \
        --type=method_call \
                /org/linuxcontainers/cgmanager \
                org.linuxcontainers.cgmanager0_0.SetValue \
                string:'memory' string:'test' string:'memory.limit_in_bytes' string:'100000'
method return sender=(null sender) -> dest=(null destination) reply_serial=1
# cat /sys/fs/cgroup/memory/test/memory.limit_in_bytes 
102400

'test' グループを削除します.

# /usr/bin/dbus-send \ 
        --print-reply \
        --address=unix:path=/sys/fs/cgroup/cgmanager/sock \
        --type=method_call \
                /org/linuxcontainers/cgmanager \
                org.linuxcontainers.cgmanager0_0.Remove \      
                string:'memory' string:"test" int32:0
method return sender=(null sender) -> dest=(null destination) reply_serial=1
   int32 1
# ls -ld /sys/fs/cgroup/memory/test
ls: /sys/fs/cgroup/memory/test にアクセスできません: そのようなファイルやディレクトリはありません