ルートに書き込み権限がある場合、cgroup仮想ファイルシステムはルートに対して読み取り専用ですか?

ルートに書き込み権限がある場合、cgroup仮想ファイルシステムはルートに対して読み取り専用ですか?

私の質問のタイトルが示すように、cgroup仮想ファイルシステムのプロパティを編集しようとしています(新しいディレクトリの作成、特定のファイルのリソース制限の編集など)。ただし、実行するすべての書き込み操作は次のとおりです。

cannot do action in 'fs/cgroup/': Read-only file system

rootで実行してもchmod 755結果は同じです。ルートに書き込みアクセス権があることを確認したら、出力を確認してls -al次のことを確認しました。

drwx-xr-x 15 root root 380 Mar 31 09:28 cgroup

ファイルの編集/作成が最初のステップであるオンライン例を読むときに/cgroup/これを行うという言及はありません。解決策を探している間にcgroupがマウントされたため、問題が発生した可能性があると思いました。つまり、すべてのシステムプロセスがここにリストされているため、内容を編集することはできません。

この直感に基づいてcgroupを削除しようとしました。

umount cgroup

一般的な結果を返します。

target is busy.

私が理解したように、rootユーザーはroot書き込み権限を使用してroot所有ディレクトリに書き込もうとする必要があります。何が見えませんか?

私は、さまざまなマニュアルページ、オンラインカーネルサイト、次の便利なスタック交換の記事を読んでいます。cgroupを使用してホワイトリストを除くすべてのプロセスを単一のCPUに制限する方法は?。私が経験している問題への参照はどこにも見つかりません。

私の方向性を教えてくれる経験がある人はいますか?

修正する

Mountedにリストされているcgroupは、以下を実行して表示されますgrep cgroup /proc/mounts

tmpfs /sys/fs/cgroup tmpfs ro,nosuid,nodev,noexec,mode=755 0 0
cgroup2 /sys/fs/cgroup/unified cgroup2 rw,nosuid,nodev,noexec,relatime,nsdelegate 0 0
cgroup /sys/fs/cgroup/systemd cgroup rw,nosuid,nodev,noexec,relatime,xattr,name=systemd 0 0
cgroup /sys/fs/cgroup/devices cgroup rw,nosuid,nodev,noexec,relatime,devices 0 0
cgroup /sys/fs/cgroup/cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuset 0 0
cgroup /sys/fs/cgroup/net_cls,net_prio cgroup rw,nosuid,nodev,noexec,relatime,net_cls,net_prio 0 0
cgroup /sys/fs/cgroup/rdma cgroup rw,nosuid,nodev,noexec,relatime,rdma 0 0
cgroup /sys/fs/cgroup/perf_event cgroup rw,nosuid,nodev,noexec,relatime,perf_event 0 0
cgroup /sys/fs/cgroup/cpu,cpuacct cgroup rw,nosuid,nodev,noexec,relatime,cpu,cpuacct 0 0
cgroup /sys/fs/cgroup/freezer cgroup rw,nosuid,nodev,noexec,relatime,freezer 0 0
cgroup /sys/fs/cgroup/memory cgroup rw,nosuid,nodev,noexec,relatime,memory 0 0
cgroup /sys/fs/cgroup/pids cgroup rw,nosuid,nodev,noexec,relatime,pids 0 0
cgroup /sys/fs/cgroup/hugetlb cgroup rw,nosuid,nodev,noexec,relatime,hugetlb 0 0
cgroup /sys/fs/cgroup/blkio cgroup rw,nosuid,nodev,noexec,relatime,blkio 0 0

特定のコマンド出力

私が書きたい特定のコマンドとその出力は次のとおりです。

  1. /sys/fs/cgroup/unifiedにlsファイルがcgroup.subtree_controlあります。
echo "+cpu +memory" > cgroup.subtree_control
bash: echo: write error: No such file or directory
  1. 目的のコントローラを直接作成しようとすると、次のようにcgroup.controllersなります。
echo "cpu" > cgroup.controllers
bash: echo: write error: Invalid argument
  1. cgroup.subtree_controlを介してファイルに書き込もうとすると、クライアントはファイルを開きますが、nano画面nanoの下部に表示されます。
[ Error writing lock file ./.cgroup.subtree_control.swp: Permission denied ]
  1. /sys/fs/cgroup/unifiedファイルの生成を拒否します。
touch file
touch: cannot touch 'file': Permission denied
  1. /sys/fs/cgroup/unifiedディレクトリの作成を許可します。
mkdir newDir

cgroupファイルを入力しました。

ls newDir
cgroup.controllers  cgroup.max.descendants  cgroup.threads  io.pressure
cgroup.events       cgroup.procs            cgroup.type     memory.pressure
cgroup.freeze       cgroup.stat             cpu.pressure
cgroup.max.depth    cgroup.subtree_control  cpu.stat

ただし、今回も作成(配信)または編集することはできませんtouch

echo cpu > cgroup.controllers
bash: echo: write error: Invalid argument
  1. ルートcgroup.controllerファイルにいくつかのコントローラが含まれると予想しましたが、そうではありません。
cat cgroup.controllers
# returns an empty string

たぶんこれは問題のヒントですか?

このコマンドの出力に対する私の期待は、ここにあるカーネル文書に基づいています。https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html

アップデート2

cgroup バージョン 1 ファイルシステムをアンマウントした後、次のコマンドを使用します。

mount -t cgroup | cut -f 3 -d ' ' | xargs sudo umount

これで、名前付きルートunifiedファイルにcgroup.controllersコントローラ名が含まれます。

cat cgroup.controllers
cpuset cpu io rdma

この名前を次の人に書き込むことができますcgroup.subtree_controller

echo -n "+cpuset +cpu +io +rdma " >> cgroup.subtree_controller

ただし、新しいコントローラ(Controllerなど)を作成しようとするとmemory機能しません。

echo -n "+memory " > cgroup.subtree_controller
bash: echo: write error: No such file or directory

システム仕様

-オペレーティングシステム:Ubuntu 20.04.6 LTS

- カーネル: Linux 5.4.0-174-generic

答え1

この問題は、cgroup バージョン 1 と 2 の両方を使用するカーネルが原因で発生します。

私の質問では、cgroupバージョン1と2の両方を有効にすることができます。これは、リソースコントローラがcgroupバージョン1ファイルシステムに接続されているかのように、cgroupバージョン2ファイルシステムに接続できない可能性があるために問題になります。

考えられる解決策の 1 つは、cgroup バージョン 1 ファイルシステムをアンマウントし、そのコントローラを取り外してから、コントローラを cgroup バージョン 2 ファイルシステム (デフォルトでは /sys/fs/cgroup/unified/ にインストールされている) に再接続することです。これは起動するたびに実行する必要があります。

または、起動時にcgroupバージョン1がロードされないようにします。次の行を追加してこれを達成しました。

GRUB_CMDLINE_LINUX="systemd.unified_cgroup_hierarchy=1 cgroup_no_v1=all"

私の/etc/default/grubファイルに。これらのファイルの変更を有効にするには、次の手順を実行します。

update-grub

結果:cgroupバージョン2ファイルシステムはに直接マウントされます/sys/fs/cgroup。サブディレクトリはありませんunified。絶対パスはsys/fs/cgroupバージョン 2 マウントポイントです。

関連情報