私の質問のタイトルが示すように、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
特定のコマンド出力
私が書きたい特定のコマンドとその出力は次のとおりです。
- /sys/fs/cgroup/unifiedに
ls
ファイルがcgroup.subtree_control
あります。
echo "+cpu +memory" > cgroup.subtree_control
bash: echo: write error: No such file or directory
- 目的のコントローラを直接作成しようとすると、次のように
cgroup.controllers
なります。
echo "cpu" > cgroup.controllers
bash: echo: write error: Invalid argument
cgroup.subtree_control
を介してファイルに書き込もうとすると、クライアントはファイルを開きますが、nano
画面nano
の下部に表示されます。
[ Error writing lock file ./.cgroup.subtree_control.swp: Permission denied ]
/sys/fs/cgroup/unified
ファイルの生成を拒否します。
touch file
touch: cannot touch 'file': Permission denied
/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
- ルート
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 マウントポイントです。