From: KATOH Yasufumi Date: Sun, 27 Jun 2021 15:10:09 +0000 (+0900) Subject: doc: Add eBPF-based device controller semantics to Japanese man page X-Git-Tag: lxc-5.0.0~144^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5793ff9bd2233822832d8b3ff926650502ce990b;p=thirdparty%2Flxc.git doc: Add eBPF-based device controller semantics to Japanese man page Update for commit 5025f3a69053bbddbe6c76ffb55b4bbd5759dcc8 Signed-off-by: KATOH Yasufumi --- diff --git a/doc/ja/lxc.container.conf.sgml.in b/doc/ja/lxc.container.conf.sgml.in index 190bcecce..60ffd8c99 100644 --- a/doc/ja/lxc.container.conf.sgml.in +++ b/doc/ja/lxc.container.conf.sgml.in @@ -2027,7 +2027,7 @@ by KATOH Yasufumi - Control group + Control group ("cgroup") + カーネルにおける cgroup 実装は長年にわたって大きく変化してきました。 + Linux 4.5 で新しい cgroup ファイルシステムのサポートが追加されました。通常は "cgroup2" や "unified hierarchy"(単一階層構造) と呼ばれています。 + それ以来、通常は古い cgroup ファイルシステムは "cgroup1" や "legacy hierarchies"(レガシー階層構造)と呼ばれています。 + この 2 つのバージョンの違いについての詳細な説明は、cgroup のマニュアルページをご覧ください。 + + + + + LXC は cgroup1(レガシー階層構造)と cgroup2(単一階層構造)に対する設定を、異なる設定プレフィックスを使って区別しています。 + cgroup1 に対する設定を変更するには というプレフィックスを使う必要があり、cgroup2 の設定を変更するには を使う必要があります。 + LXC は、cgroup2 だけが使われているシステム上の を無視します。逆に cgroup1 だけが使われているシステム上の を無視します。 + + + + + cgroup 階層の本質は、プロセスを階層的に構造化する方法です。通常は、cgroup 階層では 1 つ以上の「コントローラー」が有効になっています。 + 通常、cgroup 階層の「コントローラー」は階層に従って特定のタイプのシステムリソースを分配する役割を果たします。 + コントローラーには "pids" コントローラー、"cpu" コントローラー、"memory" コントローラーなどがあります。 + しかし、システムリソースの分配するという役割に該当しないコントローラーもあります。このようなコントローラーは「ユーティリティー」コントローラーと呼ばれたりします。 + ユーティリティーコントローラーの 1 つにデバイスコントローラーがあります。このコントローラーはシステムリソースを分配する代わりにデバイスへのアクセスを管理できます。 + + + + + cgroup1 では、デバイスコントローラーは他の多くのコントローラーと同様に、書き込みできるファイルのセットとして実装されていました。 + これらのファイルは "devices.allow" と "devices.deny" という名前のファイルでした。レガシーデバイスコントローラーは「許可リスト(allowlists)」と「拒否リスト(denylists)」の両方を実装できました。 + + + + + 許可リスト(allowlist)とは、すべてのデバイスへのアクセスをブロックするデバイスプログラムです。特定のデバイスへのアクセスを行うには、特定のデバイスもしくはデバイスクラスに対する「許可ルール(allow rules)」を指定する必要があります。 + 一方、拒否リスト(denylist)はデフォルトですべてのデバイスへのアクセスを許可するデバイスプログラムです。特定のデバイスへのアクセスを拒否するには、特定のデバイスもしくはデバイスクラスに対する「拒否ルール(deny rules)」を指定する必要があります。 + + + + + cgroup2 では、デバイスコントローラーの実装が完全に変わりました。読み書きするファイルの代わりに、 の eBPF プログラムを cgroup にアタッチできます。 + カーネルの実装が完全に変わったのにもかかわらず、LXC は cgroup1 のデバイスコントローラーと cgroup2 の eBPF ベースのデバイスコントローラーで同じセマンティクスに従えるようにしています。 + このあとの段落では、cgroup2 の eBPF デバイスコントローラーに対するセマンティクスを説明します。 + + + + + 先に述べたように、cgroup2 の eBPF ベースのデバイスコントローラーに対するデバイスルールを指定するフォーマットは、cgroup1 のデバイスコントローラーと同じです。ただし、設定キーのプレフィックスは変更されています。 + 具体的には、cgroup1 のデバイスコントローラーに対するデバイスルールは と を使って指定します。一方、cgroup2 の eBPF ベースのコントローラーでは と を使わなければなりません。 + + + + + + + 許可リスト(allowlist)のデバイスルール + + lxc.cgroup2.devices.deny = a + + は、カーネルに対してデフォルトですべてのデバイスへのアクセスをブロックするように LXC が指示します。 + デバイスへのアクセスを許可するには、デバイスに対する許可ルールを を使って追加する必要があります。これは「許可リスト」デバイスプログラムとして参照されます。 + + + + + + + 拒否リスト(denylist)のデバイスルール + + lxc.cgroup2.devices.allow = a + + は、カーネルに対してすべてのデバイスへのアクセスをデフォルトで許可するように LXC が指示します。 + デバイスへのアクセスを拒否するには、デバイスに対する拒否ルールを を使って追加する必要があります。これは「拒否リスト」デバイスプログラムとして参照されます。 + + + + + + + 前述の 2 つのルールのいずれかを指定すると、それ以前に指定していたルールがすべてクリアされます。つまり、デバイスリストがリセットされます。 + + + + + + + 許可リストプログラムが要求される場合、つまりデフォルトですべてのデバイスへのアクセスがブロックされている場合、個別のデバイスやデバイスクラスへの拒否ルールを指定しても無視されます。 + + + + + + + 拒否リストプログラムが要求される場合、つまりデフォルトですべてのデバイスへのアクセスが許可されている場合、個別のデバイスやデバイスクラスへの許可ルールを指定しても無視されます。 + + + + + + + + 例えば、次のようなルールの組 + + lxc.cgroup2.devices.deny = a + lxc.cgroup2.devices.allow = c *:* m + lxc.cgroup2.devices.allow = b *:* m + lxc.cgroup2.devices.allow = c 1:3 rwm + + + は、許可リスト(allowlist)デバイスプログラムを実装します。つまり、カーネルはこのリストで許可されるように設定されていないすべてのデバイスへのアクセスをブロックします。 + このプログラムでは、すべてのキャラクターデバイスとブロックデバイスが作成できますが、読み書きは /dev/null に対してしか行なえません。 + + + + + 代わりに先のルールから次のようなルールの組に変更したとすると、 + + lxc.cgroup2.devices.allow = a + lxc.cgroup2.devices.deny = c *:* m + lxc.cgroup2.devices.deny = b *:* m + lxc.cgroup2.devices.deny = c 1:3 rwm + + + LXC はカーネルに拒否リスト(denylist)の実装を指示します。つまりカーネルはこのリストで拒否を指定していないすべてのデバイスへのアクセスを許可します。 + このプログラムでは、キャラクターデバイスとブロックデバイスは作成できません。そして /dev/null の読み書きと作成は許可されません。 + + + + + ここで、同じプログラムでも、前述のようにデバイスのプログラムタイプを決定するような「グローバルルール」が続いている場合を考えてみましょう。 + + lxc.cgroup2.devices.allow = a + lxc.cgroup2.devices.deny = c *:* m + lxc.cgroup2.devices.deny = b *:* m + lxc.cgroup2.devices.deny = c 1:3 rwm + lxc.cgroup2.devices.allow = a + + + 最後の行は、デバイスプログラムのタイプを変更せずに、LXC がデバイスリストをリセットしてしまいます。 + + + + + 次のように指定した場合、 + + lxc.cgroup2.devices.allow = a + lxc.cgroup2.devices.deny = c *:* m + lxc.cgroup2.devices.deny = b *:* m + lxc.cgroup2.devices.deny = c 1:3 rwm + lxc.cgroup2.devices.deny = a + + + 前の例と違って最後の行によって、LXC はデバイスリストをリセットし、許可リスト(allowlist)から拒否リスト(denylist)にプログラムを変更してしまいます。 + - + @@ -2056,7 +2327,7 @@ by KATOH Yasufumi kernel running at the time the container is started, eg. --> - legacy な cgroup 階層 (cgroup v1) に設定する値を指定します。コントローラー名は control group そのままの名前です。 + レガシー cgroup 階層 (cgroup v1) に設定する値を指定します。コントローラー名は control group そのままの名前です。 許される名前や値の書式は LXC が指定することはなく、コンテナが実行された時に実行されている Linux カーネルの機能に依存します。 例えば のようになります。 @@ -2064,7 +2335,7 @@ by KATOH Yasufumi - +