root以外のユーザーにCgroupを設定しようとしています。ガラス魚。
環境設定:
- CentOS 7.2.1511
- カーネル 3.10.0-327.el7.x86_64
- Cgroup は /sys/fs/cgroup にマウントされます。
次のコマンドを実行して、root以外のユーザー用のCgroupを作成することが可能である必要があります。
CPUサブシステムの場合:
$ sudo mkdir /sys/fs/cgroup/cpu/${USER} $ sudo chown -R ${USER} /sys/fs/cgroup/cpu/${USER}
デバイスサブシステムの場合:
$ 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
どんな助けでも大変感謝します。私は長い間この問題に閉じ込められていたので理解できません。
ベストアンサー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>
正しく動作し始めました。