web-dev-qa-db-ja.com

cgroupの管理にはrootアクセスが必要ですか?

2つの異なるオペレーティングシステム(UbuntuとCentOS)のコントロールグループを操作しようとしています。私が聞きたいことはほとんどありません。

cgcreateコマンドを使用してコントロールグループを作成しようとしていますが、マシンでrootアクセスが必要なようです。これまでに見たすべての例では、コントロールグループを作成または変更するためにrootユーザーである必要があることについては何も述べていません。

Rootユーザーである必要は本当にありますか?最終的な目標は、libcgroupAPIを使用してリソースを制御するための制御グループを作成および管理するC++アプリケーションを作成することです。ただし、C++アプリケーションはrootユーザーによって実行されることはありません。通常のユーザーである可能性があります。

12
Rambo

通常のシナリオでは、cgcreatecgsetcgdeletecggetなどをrootとして設定します。最終的には、多くのリソースへの吸引を制限することを目的としたプログラム/スクリプトが、通常のユーザーとして実行されます。したがって、rootとしてセットアップし、ユーザーとして使用および実行します。

これは、cgcreateコマンド(rootとして実行)の-aおよび-tパラメーターを使用して実行されます。ですから、グループを設定するときはすでにです。私の場合:

cgcreate -t​​ monero:monero -a monero:monero -g memory、cpu:monerogroup

ここで、moneroは、cgroup制限付きでプログラムを実行および実行する将来のユーザーのユーザー名です。 -aサブパラメータと-tサブパラメータの細かい違いについては、cgcreateのマニュアルページを参照してください。

男cgcreate

ほとんどの場合、それは両方とも同じユーザーです。

次に、制限を設定します(まだrootとして):

cgset -r memory.limit_in_bytes = $((4 * 1024 * 1024 * 1024))monerogroup

cgset -r cpu.shares = 128 monerogroup

必要に応じてエントリを確認します。

cgget -g memory:/ monerogroup | grepバイト

そして、最終的にユーザー、私の場合はユーザーmoneroを、適切なフォルダーから切り替えます。

cgexec -g memory、cpu:monerogroup ./monerod

ユーザー専用に設定するので、ユーザーは権限などに問題はありません。

4
oceansailor

これのセキュリティへの影響はさておき、setuidビットを設定できます

chmod +s /bin/cgcreate
chmod +s /bin/cgdelete

そのプログラムを実行する非ルートユーザーにルートパワーを与えるため。

その後、通常のユーザーアクセスを削除することをお勧めします

chmod 550 /bin/cgcreate
chmod 550 /bin/cgdelete

cgcreateの使用を許可する特別なグループを作成しますIE cgusers

groupadd cgusers

これらのファイルのグループメンバーシップをそのグループに変更します。

chgrp cgusers /bin/cgcreate
chgrp cgusers /bin/cgdelete

これらはすべてrootによって実行され、その後、cgusersグループ内のすべてのユーザーは、cgcreatecgdeleteを自分自身ではなくrootとして実行します。適切なグループの下にこの力を持たせたいメンバーが必要です。

2
Gravy

Cgroupは、最終的にはcgroupファイルシステムを介して処理されます。 cgroupを作成する機能は、単にその下にディレクトリを作成してファイルに書き込む機能である必要があります。 cgroup FSをより手の込んだアクセス許可でマウントする場合、またはそのアクセス許可をその場で変更する場合、特定のユーザーが何かを実行できるはずです。もちろん、他のユーザーのプロセスのプロセスIDをタスクファイルに追加することはできません。追加できるのはユーザーのみです。

そうは言っても、上記がグローバルであるかどうかはわかりません。つまり特定のcgroupがこれをサポートしていない可能性があります。

全体として、最善のアプローチは、cgroupにタスクを関連付けるように指示できるcgroupマネージャーを使用することです。 cgmanagerはこのようなことをしていると思います。

1
V13