cgroupv2の場合、Dockerはデフォルトでcgroupのプライベートネームスペースを使用します。これは--cgroupns
forフラグ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
から、「デバイスまたはリソースの使用中」エラーなしで書き込むことができます。