web-dev-qa-db-ja.com

rootが使用できないのにSudoユーザーがsched_setschedulerSCHED_RRを使用できるのはなぜですか?

Raspberry Pi2でArchLinuxを実行しています。

GordonのwiringPiライブラリを使用するユーザースペースプログラムがあります。特に、現在のプロセスに最高の優先度を設定しようとする piHiPri() functionsched_setscheduler およびSCHED_RRモードを使用)。この関数にはスーパーユーザー権限が必要です。

Arch Linuxをインストールするときのデフォルトユーザーはrootユーザーなので、builderという名前のユーザーを作成しました。これをsudoersのおかげでvisudoに追加しました。

私の問題は、rootユーザーでプログラムを実行すると、sched_setscheduler関数が「操作は許可されていません」(errnoから取得)を返すことです。

builderのときに実行すると、「許可が拒否されました」というメッセージが表示されます。

ただし、builderSudo myProgramを使用して実行すると、すべて問題なく、topコマンドで優先度が変更されていることがわかります。

rootユーザーはUID0を持っていない可能性があると思ったので、id -u rootで確認しましたが、これは0を返します。

ls -l myProgramm-rwxr-xr-x 1 root rootを与えます。また、chmod +s myProgrammでSUIDを設定しようとしましたが成功しませんでした。

私のプログラムをrootで実行可能にする方法について何かアイデアはありますか?

編集:

Gillesがアドバイスしたように、私はulimit -rを実行しましたが、いずれの場合も0を返しました(builderおよびroot)。

/etc/security/limits.confの行を* - rtprio 0から変更しました

宛先:* - rtprio 99

これは、予想どおりulimit -rの出力に影響しました。99を返します。

次に、rootを使用してプログラムを再度実行しようとしましたが、同じOperation not permittedエラーが発生しましたが、現在は発生していません。 Sudo(上記と同じOperation not permitted)でもう動作します...奇妙です!

調査中、古い/etc/security/limits.conf設定に戻しました。

3
Vladimir T.

私もこの問題に見舞われました。私の場合、dockerデーモンがデフォルトのcgroupを再構成していることがわかりました。その結果、rootユーザーはcpu.rt_runtime_usがゼロに設定されたcgroupスライスを持っていました。リアルタイムスケジューラ(RRまたはFIFOのいずれか)を設定するには、CPU時間を割り当てる必要があります。プロセスにそれがない場合(cpu.rt_runtime_usがゼロの場合)、「許可が拒否されました」というメッセージが表示されます。

この問題に関連するcgroupとdockerの詳細は、RedHat Bugzillaのこのエラーレポートにあります: https://bugzilla.redhat.com/show_bug.cgi?id=1467919

2

違いを説明できる1つのことは、最大リアルタイム優先度(_ulimit -r_)の制限が異なる場合です。ルートは制限を超えることはできませんが、制限を上げることはできます。 _ulimit -r_(または、Cではgetrlimit(RLIMIT_RTPRIO, …)で確認し、必要に応じてプログラムを実行する前に制限を引き上げてください。

それでも問題が解決しない場合は、システム構成の問題ではなく、プログラムの問題である可能性があります。 問題を再現する小さいが自己完結型のソースコードStack Overflow に投稿します(プログラミングは nix&Linux ではトピックから外れています)。