Dockerのプライベートcgroup名前空間にcgroup.subtree_controlを埋める方法は?

Dockerのプライベートcgroup名前空間にcgroup.subtree_controlを埋める方法は?

cgroupv2の場合、Dockerはデフォルトでcgroupのプライベートネームスペースを使用します。これは--cgroupnsforフラグdocker runとデーモンオプションによってdefault-cgroupns-mode制御されます。コンテナ内にサブcgroupを作成する必要がありますが、問題は、コンテナ内のルートcgroupに空のグループがあることですcgroup.subtree_controlコンテナが実行されていると、このルートcgroupにすでにプロセスがあるため、コンテナにそれを入力できません。これを試みると、「デバイスまたはリソースが使用中です。」エラーが発生します。


--cgroupns hostこれは回避策ですが、可能であれば維持したいプライベートネームスペースを使用しません。追加の質問は現在絶対作成ファイルで設定します。


調べてみると--cgroup-parentできる作成ファイルを介して設定します。しかし、私はこの設定が本当に理解されていません。ホストにcgroupを作成してここに書き込み、subtree_controlそのcgroupを親コンテナとして使用してコンテナを起動しようとしました。このエラーが発生してもわかりません。

デーモンのエラー応答:systemd cgroupのcgroup-parentは 'xxx.slice'という有効なスライスでなければなりません。

私の考えでは、この設定は、cgroup_namespacesマンページの次の参照で「現在のcgroupsディレクトリ」を変更することです。

プロセスが CLONE_NEWCGROUP フラグとともに clone(2) または unshare(2) を使用して新しい cgroup 名前空間を作成すると、現在の cgroups ディレクトリが新しい名前空間の cgroup ルートディレクトリになります。

それにもかかわらず、コンテナを起動する前にホストでcgroupを手動で設定する必要があるのは面倒な作業です。cgroup.subtree_control必要なコントローラをコンテナで有効にするには、どのような選択肢が必要ですか?

ベストアンサー1

コンテナに子cgroupを作成し、各PIDを/sys/fs/cgroup/cgroup.procs子cgroupに移動して/sys/fs/cgroup/cgroup.subtree_controlから、「デバイスまたはリソースの使用中」エラーなしで書き込むことができます。

おすすめ記事