差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
linux:kernel:cgroup:cgroup_management_daemon [2013/12/04 15:35] – tenforward | linux:kernel:cgroup:cgroup_management_daemon [2013/12/11 11:11] (現在) – tenforward | ||
---|---|---|---|
行 1: | 行 1: | ||
+ | < | ||
Hi, | Hi, | ||
行 9: | 行 10: | ||
those limits to your tasks as you like. | those limits to your tasks as you like. | ||
- | 何度か言及してきたように,私はスタンドアローンで動く cgroup 管理デーモンを書きたいと思っている.基本的な要求仕様は,それがスタンドアローンであることである.つまり,ホスト上で動くシングルインスタンスであることが任意の深さにネストするコンテナから使うのに適しており,設定された制限を外れる事を許さず,属していないタスクを配下に置くことを許さず,与えられた制限内で思うようにタスクに制限を分配できることである. | + | 何度か言及してきたように,私はスタンドアローンで動く cgroup 管理デーモンを書きたいと思っている. |
+ | 基本的な要求仕様は,それがスタンドアローンであることである. | ||
+ | つまり,ホスト上で動くシングルインスタンスであることが任意の深さにネストするコンテナから使うのに適しており, | ||
+ | 設定された制限を外れる事を許さず,属していないタスクを配下に置くことを許さず, | ||
+ | 与えられた制限内で思うようにタスクに制限を分配できることである. | ||
Additionally, | Additionally, | ||
行 18: | 行 23: | ||
features. | features. | ||
So I'm basing the API loosely on the lmctfy command line API. | So I'm basing the API loosely on the lmctfy command line API. | ||
+ | |||
+ | さらに,Tejun はユーザに cgroupfs の実装にあまりにも密接に関係させたくないと規定した. | ||
+ | なので,コマンドは cgroupfs のファイル名と値を指定するよりは少し一般的になるだろう. | ||
+ | 私の知る限りでは,機能的に冗長であってはいけないので,特定のコントローラを指定するのを避けることすらするかもしれない. | ||
+ | 一方で,あまりに一般的にもしたくない.なので,私はおおまかには Lmctfy のコマンドライン API っぽいものにする. | ||
One of the driving goals is to enable nested lxc as simply and safely as | One of the driving goals is to enable nested lxc as simply and safely as | ||
行 25: | 行 35: | ||
doesn' | doesn' | ||
than our own. | than our own. | ||
+ | |||
+ | 向かうゴールの一つは,可能な限り簡単に安全にネストされた lxc を可能にする事である. | ||
+ | もしこのプロジェクトが成功したら,大量のコードが lxc から削除できるようになる. | ||
+ | 私はこのプロジェクトは lxc プロジェクトの大きな一部分だと考えている. | ||
+ | しかし,それがどれくらい重要であるかと仮定すると,我々ほど重要ではない他の誰かのニーズを考慮することを意味しないシステム管理である. | ||
This document consists of two parts. | This document consists of two parts. | ||
行 32: | 行 47: | ||
controller keys which can be set is very incomplete at this point, | controller keys which can be set is very incomplete at this point, | ||
serving mainly to show the approach I was thinking of taking. | serving mainly to show the approach I was thinking of taking. | ||
+ | |||
+ | この文書は二つのパートからなっている.最初は,構築されるデーモン (cgmanager) の意図と,どのように安全に対する要求を強制するかを述べる. | ||
+ | 二つ目はクライアントがマネージャに送る事が出来るコマンドについて述べる. | ||
+ | 設定することが可能なコントローラのキーのリストは,現時点ではほぼ未完成であり,提供を考えていたアプローチを示す事を主に提供する. | ||
Summary | Summary | ||
行 40: | 行 59: | ||
/ | / | ||
containers, so that one daemon can support the whole system. | containers, so that one daemon can support the whole system. | ||
+ | |||
+ | それぞれの「ホスト」(別々の Linux kernel のインスタンスで識別される) は,control groups を管理するためのデーモンを厳密に一つだけ持つ. | ||
+ | このデーモンは / | ||
+ | このソケットは多数のコンテナ内に bind mount 可能であるので,一つのデーモンでシステム全体をサポートできる. | ||
Programs will be able to make cgroup requests using dbus calls, or | Programs will be able to make cgroup requests using dbus calls, or | ||
indirectly by linking against lmctfy which will be modified to use the | indirectly by linking against lmctfy which will be modified to use the | ||
dbus calls if available. | dbus calls if available. | ||
+ | |||
+ | プログラムは dbus 呼び出しで cgroup リクエストを作成でき, | ||
+ | もし可能であるなら dbus を使うように変更された lmctfy をリンクして間接的に cgroup リクエストを作成できる. | ||
Outline: | Outline: | ||
- | . A single manager, cgmanager, is started on the host, very early | + | |
+ | * A single manager, cgmanager, is started on the host, very early | ||
during boot. It has very few dependencies, | during boot. It has very few dependencies, | ||
/proc, /run, and /sys to be mounted, with /etc ro. It will mount | /proc, /run, and /sys to be mounted, with /etc ro. It will mount | ||
行 52: | 行 79: | ||
(clone_children, | (clone_children, | ||
will open a socket at / | will open a socket at / | ||
+ | | ||
+ | * cgmanager という単一のマネージャがホスト上で,ブート時の初期に起動する. | ||
+ | 依存関係は極めて少なく,/ | ||
+ | このマネージャはプライベートの名前空間内で cgroup の階層構造をマウントし,デフォルトを設定する | ||
+ | (clone_children, | ||
+ | | ||
. A client (requestor ' | . A client (requestor ' | ||
/ | / | ||
requirements for r are listed below. | requirements for r are listed below. | ||
+ | | ||
+ | . クライアント (requestor ' | ||
+ | r に対する詳細な特権の要求事項は以下に述べる. | ||
+ | | ||
. The client request will pertain an existing or new cgroup A. r's | . The client request will pertain an existing or new cgroup A. r's | ||
privilege over the cgroup must be checked. | privilege over the cgroup must be checked. | ||
privilege over A if A is owned by r's uid, or if A's owner is mapped | privilege over A if A is owned by r's uid, or if A's owner is mapped | ||
into r's user namespace, and r is root in that user namespace. | into r's user namespace, and r is root in that user namespace. | ||
+ | | ||
+ | * クライアントリクエストは既存または新しい cgroup A に関係する.r の | ||
+ | cgroup に対する特権はチェックしなければならない.r は,もし A が r | ||
+ | の uid の所有である場合は A に対する特権を持つと考えられている.も | ||
+ | しくはもし A のオーナーは r のユーザ名前空間にマップされている場合, | ||
+ | r はそのユーザ名前空間内では root となる. | ||
+ | | ||
. The client request may pertain a victim task v, which may be moved | . The client request may pertain a victim task v, which may be moved | ||
to a new cgroup. | to a new cgroup. | ||
行 65: | 行 109: | ||
and r is root in its userns. | and r is root in its userns. | ||
and v is mapped in r's pid namespace. | and v is mapped in r's pid namespace. | ||
+ | | ||
+ | * クライアントリクエストは,新しいグループに移動する対象のタスク v に | ||
+ | 関係するかもしれない.この場合,両方の cgroup に対する r の特権と v | ||
+ | はチェックする必要がある.もし v が r の PID 名前空間にマップされて | ||
+ | おり,v の uid が r のユーザ名前空間にマップされており,r がそのユー | ||
+ | ザ名前空間内で root であるのなら v に対する特権を持っていると考えら | ||
+ | れる.もしくは,もし r と v が同じ uid で,v が r の PID 名前空間に | ||
+ | マップされている場合も. | ||
+ | |||
. r's credentials will be taken from socket' | . r's credentials will be taken from socket' | ||
pid and uid are translated. | pid and uid are translated. | ||
+ | |||
+ | * r の認証情報はソケットの peercred から継承し,pid と uid が変換され | ||
+ | ることを保証する. | ||
+ | |||
. r passes PID(v) as a SCM_CREDENTIAL, | . r passes PID(v) as a SCM_CREDENTIAL, | ||
translated global pid. It will then read UID(v) from / | translated global pid. It will then read UID(v) from / | ||
which is the global uid, and check / | which is the global uid, and check / | ||
UID is mapped there. | UID is mapped there. | ||
+ | |||
+ | * r は PID(v) を SCM_CREDENTIAL として渡す.そして cgmanager は変換 | ||
+ | されたグローバルな pid を受け取る.そして,/ | ||
+ | ら UID(v) を読み取る.これはグローバルな uid である.そして,UID | ||
+ | がそこにマップされているかどうかを見るために / | ||
+ | をチェックする. | ||
+ | |||
. dbus-send can be enhanced to send a pid as SCM_CREDENTIAL to have | . dbus-send can be enhanced to send a pid as SCM_CREDENTIAL to have | ||
the kernel translate it for the reader. | the kernel translate it for the reader. | ||
A' will require a SCM_CREDENTIAL to be sent. | A' will require a SCM_CREDENTIAL to be sent. | ||
+ | | ||
+ | * dbus-send は,Reader のためにカーネルに (TODO: 何を?) 変換させるた | ||
+ | めに SCM_CREDENTIAL として pid を送るように改良することが可能であ | ||
+ | る. | ||
+ | |||
Privilege requirements by action: | Privilege requirements by action: | ||
* Requestor of an action (r) over a socket may only make | * Requestor of an action (r) over a socket may only make | ||
changes to cgroups over which it has privilege. | changes to cgroups over which it has privilege. | ||
+ | |||
+ | * ソケットを通してのアクション (r) の要求元は,持っている特権を通し | ||
+ | て cgroup に変更を加えるだけだけかもしれない. | ||
+ | |||
* Requestors may be limited to a certain #/depth of cgroups | * Requestors may be limited to a certain #/depth of cgroups | ||
(to limit memory usage) - DEFER? | (to limit memory usage) - DEFER? | ||
+ | |||
+ | * 要求元は (メモリ消費を制限するために) cgroup の深さをある程度に制 | ||
+ | 限するかもしれない - 保留? | ||
+ | |||
* Cgroup hierarchy is responsible for resource limits | * Cgroup hierarchy is responsible for resource limits | ||
+ | |||
+ | * cgroup の階層構造は,リソース制限に対して責任を持つ | ||
+ | |||
* A requestor must either be uid 0 in its userns with victim mapped | * A requestor must either be uid 0 in its userns with victim mapped | ||
ito its userns, or the same uid and in same/ | ito its userns, or the same uid and in same/ | ||
victim | victim | ||
+ | | ||
+ | * 要求元は,その userns にマップされた対象と共に,その userns 内で | ||
+ | uid 0 でなければならないか,もしくは対象と同じか同じ祖先の pidns | ||
+ | 内にいて,同じ uid でなければならない. | ||
+ | | ||
* If r requests creation of cgroup '/ | * If r requests creation of cgroup '/ | ||
as relative to r's cgroup. | as relative to r's cgroup. | ||
under its own current cgroup. | under its own current cgroup. | ||
+ | |||
+ | * r が cgroup /x の作成をリクエストした場合,/ | ||
+ | らの相対パスに変換される.r は自身のカレント cgroup 以下の | ||
+ | cgroup に変更を加えることはできない. | ||
+ | |||
* If r is not in the initial user_ns, then it may not change settings | * If r is not in the initial user_ns, then it may not change settings | ||
in its own cgroup, only descendants. | in its own cgroup, only descendants. | ||
we could require the use of extra cgroups when wanted, as lxc does | we could require the use of extra cgroups when wanted, as lxc does | ||
currently) | currently) | ||
+ | |||
+ | * r が初期 userns 内にいない場合,自身の cgroup 内の設定を変えられ | ||
+ | ず,子孫だけを変えられるかもしれない (厳密に必要ではない.現在 | ||
+ | lxc でやっているように,必要な時に特別な cgroup の使用が必要にな | ||
+ | ることもあり得る) | ||
+ | |||
* If r requests creation of cgroup '/ | * If r requests creation of cgroup '/ | ||
to its own cgroup | to its own cgroup | ||
+ | |||
+ | * r が cgroup /x の作成をリクエストした場合,自身の cgroup に対す | ||
+ | る書き込み権を持っていなければならない (厳密に必要ではない) | ||
+ | |||
* If r requests chown of cgroup /x to uid Y, Y is passed in a | * If r requests chown of cgroup /x to uid Y, Y is passed in a | ||
ucred over the unix socket, and therefore translated to init | ucred over the unix socket, and therefore translated to init | ||
userns. | userns. | ||
+ | |||
+ | * r が cgroup /x に対して uid Y への chown をリクエストした場合,Y | ||
+ | は Unix socket 経由で ucred に渡される.そのため,init userns に | ||
+ | 変換される. | ||
+ | |||
* if r requests setting a limit under /x, then | * if r requests setting a limit under /x, then | ||
. either r must be root in its own userns, and UID(/x) be mapped | . either r must be root in its own userns, and UID(/x) be mapped | ||
行 106: | 行 211: | ||
(see devices.allow/ | (see devices.allow/ | ||
which don't support setns for pid. | which don't support setns for pid. | ||
+ | |||
+ | * r が /x 以下の制限を設定するリクエストをした場合, | ||
+ | - r は自身の userns で root であり,UID(/ | ||
+ | ピングされていなければならないか,UID(r) == UID(/x) でなければ | ||
+ | ならないかのどちらかである. | ||
+ | - /x は / であってはならない (厳密に必要ではない.全てのユーザが | ||
+ | / が cgroup の特別なレイヤーであることを知っている) | ||
+ | - setns(UIDNS(r)) が動かない.これはカーネル内の capable() チェッ | ||
+ | クを満たさないためである.それゆえ,特権チェックを我々自身が行 | ||
+ | う必要がある.そして,ホストの root ユーザとして書き込みを行う | ||
+ | (see devices.allow/ | ||
+ | できない古いカーネルをサポートする必要がある. | ||
+ | |||
* If r requests action on victim V, it passes V's pid in a ucred, | * If r requests action on victim V, it passes V's pid in a ucred, | ||
so that gets translated. | so that gets translated. | ||
行 217: | 行 335: | ||
Delete-force < | Delete-force < | ||
Kill < | Kill < | ||
+ | </ |