CGManager とは?

CGManager はシンプルな D-Bus API を通して全ての cgroup を管理する、特権を持つデーモンです。
CGManager はネストした LXC コンテナも、ユーザ名前空間での UID/GID の解決を含む特権を持たないユーザからのリクエストも受け付けるように設計されています。

Note

CGManager は 2014 年 4 月から Ubuntu の LXC でデフォルトで使われていました。その後、他のディストリビューションでも、非特権コンテナを実行することが必要になり使われるようになりました。

最近の Linux カーネルでは cgroup namespace が使われるため、現在は非推奨となっています。古いカーネルでは、LXCFS が CGManager の代わりに使える cgroup エミュレーションの機能を提供しており、既存のユーザースペースとより広く互換性があります。

コンポーネント

cgmanager

このデーモンはホスト上で実行します。ホストとは別のマウント名前空間内で cgroupfs をマウントし (なのでホスト上からは見えません)、D-Bus の問い合わせを受け付けるために /sys/fs/cgroup/cgmanager/sock をバインドし、ホスト上で実行されている全てのクライアントを扱います。

cgmanager は、名前空間をまたいだ uid、gid、pid の変換のために使う D-Bus + SCM 認証情報を使った認証リクエストも、ホストレベルから来る「非認証の」(初期の ucred) D-Bus を使ったリクエストも受け付けます。

cgproxy

このデーモンの実行は 2 種類のケースで目にするかも知れません。(PID名前空間へのアタッチがサポートされていない) 3.8 より古いカーネルのホスト上においてと、(cgproxy のみが実行される) コンテナ内においてです。

cgproxy は自身ではいかなる cgroup に対する設定の変更を行いません。しかし、代わりに名前が示すように、プロキシリクエストをメインの cgmanager プロセスに投げます。

cgproxy は、プロセスが直接 D-Bus を使って (例えば dbus-send を使って) /sys/fs/cgroup/cgmanager/sock と通信を行うのに必要です。

cgproxy はクエリから ucred を受信し、実際の cgmanager ソケットに認証された SCM クエリを投げ、ホストの名前空間にいる cgmanager が理解できるものに適切に変換できるように ucred 構造体を通して引数を渡します。

cgm

D-Bus サービスと通信するシンプルなコマンドラインツールです。コマンドラインを通して通常の cgroup の全ての操作が実行できます。

通信プロトコル

先に述べたように、cgmanager と cgproxy は D-Bus を使います。外部のクライアント (cgproxy は違います) は標準の D-Bus API を使い、不要で容易に間違いの起こる SCM cred プロトコルを実装しようとしないことを推奨します。

そうしないことで、/sys/fs/cgroup/cgmanager/sock と通信を行うことが常に正しいと簡単に仮定できます。

cgmanager API は独立した D-Bus ソケット上でのみ利用可能です。cgmanager 自身はシステムのバスには接続しません。なので、 dbus デーモンの実行は cgmanager/cgproxy に必須ではありません。

D-Bus API の更に詳しい情報は こちら で読むことができます。

ライセンス

CGManager はフリーソフトウェアで、コードのほとんどの部分が GNU LGPLv2.1+ の条項に基づいてリリースされています。GNU GPLv2 ライセンスに基づいてリリースされているバイナリもあります。

プロジェクトのデフォルトのライセンスは GNU LGPLv2.1+ です。

CGManager の stable リリースは各 Linux ディストリビューションの stable に対する修正とセキュリティアップデートのポリシーに依存します。