Linux Cgroupは制御ファイルを作成し、CPUでは機能しますが、デバイスサブシステムでは機能しませんか?

Linux Cgroupは制御ファイルを作成し、CPUでは機能しますが、デバイスサブシステムでは機能しませんか?

root以外のユーザーにCgroupを設定しようとしています。ガラス魚

環境設定:

  • CentOS 7.2.1511
  • カーネル 3.10.0-327.el7.x86_64
  • Cgroup は /sys/fs/cgroup にマウントされます。

次のコマンドを実行して、root以外のユーザー用のCgroupを作成することが可能である必要があります。

  1. CPUサブシステムの場合:

    $ sudo mkdir /sys/fs/cgroup/cpu/${USER}
    $ sudo chown -R ${USER} /sys/fs/cgroup/cpu/${USER}
    
  2. デバイスサブシステムの場合:

    $ sudo mkdir /sys/fs/cgroup/devices/${USER}
    $ sudo chown -R ${USER} /sys/fs/cgroup/devices/${USER}
    

これは CPU サブシステムに適用されます。制御ファイルを次のように作成できるからです。ガラス魚たとえば、cpu.cfs_period_usは次のようになります。

    echo 43434 > cpu.cfs_period_us

ただし、デバイスサブシステムに書き込む(例:

    echo 'a *:* rwm' > devices.deny

その結果、次のエラーが発生します

    bash: echo: write error: Operation not permitted

CPUサブシステム権限

デバイスサブシステム権限

どんな助けでも大変感謝します。私は長い間この問題に閉じ込められていたので理解できません。

ベストアンサー1

私は同じ問題に直面しました。

再現段階:すべてのサブシステム(cpu、cpuset、メモリ、凍結、デバイスなど)の所有者とグループを変更しました。その後、デバイスcgroupのcgroup.procsに書き込もうとしましたが、「操作が許可されていません」というメッセージが表示されました。同じコマンドが他のすべてのサブシステムでもうまく機能します。

for i in cpuset nls_cls,net_prio perf_event devices pids cpu,cpuacct memory hugetlb blkio freezer systemd; do 
  mkdir -p /sys/fs/cgroup/$i/mygroup;
  mkdir -p /sys/fs/cgroup/$i/mygroup/subgroup;
  chown -R myuser:myuser /sys/fs/cgroup/$i/mygroup;
done

[~]$ echo 1943 > /sys/fs/cgroup/devices/mygroup/subgroup/cgroup.procs
-bash: echo: write error: Operation not permitted

ファイル(/sys/fs/cgroup/devices/mygroup/subgroup/cgroup.procs)には権限644があり、selinuxは無効になっており、lsattrには「フラグの読み込み中にデバイスに不適切なioctl」と表示されます(これは正常です)。ファイルの権限を666に変更しようとしましたが、同じエラーが発生しました。いずれにせよ、エラーは「許可拒否」ではなく、「操作が許可されていません」です。

このコマンドは sudo で実行すると正常に動作しますが、ポイントは mygroup を sudo ではなくユーザーに委任することです。

[解決方法]デバイスシステムのcgroup.procsに書き込むプロセスにはSYS_CAP_ADMINが必要です。文書は非常に混乱しています。しかし、ここでは2番目の段落で見ることができます。https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/devices.html#security

「ホワイトリストを変更したり、他のタスクを新しいcgroupに移動したりするには、CAP_SYS_ADMINが必要です。(もう一度変更したい場合があります)」

この行は他のサブシステム文書には表示されないため、明らかにデバイスサブツリーに制限されます。正しい使い方を得るために、実際のコード(上記のbashスクリプトではない)を修正し、sudo setcap cap_sys_admin=+ep <my_bin>正しく動作し始めました。

おすすめ記事