sudoユーザーはsched_setscheduler SCHED_RRを使用できますが、rootが利用できないのはなぜですか?

sudoユーザーはsched_setscheduler SCHED_RRを使用できますが、rootが利用できないのはなぜですか?

私はRaspberry Pi 2でArch Linuxを実行しています。

wiringPi私は特にGordonのライブラリを使用するユーザースペースプログラムを持っています。piHiPri()機能現在のプロセスに最も高い優先順位を設定してみてください(使用sched_setschedulerSCHED_RRパターン)。この機能を使用するにはスーパーユーザー権限が必要です。

Arch Linuxをインストールすると、rootユーザーはデフォルトユーザーなので、という名前のユーザーをbuilder作成しsudoersますvisudo

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

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

sudo myProgramしかし、while beingで実行してみるとすべてがうまくなり、命令で優先builder順位が変わったことがわかる。top

rootユーザーのUIDが0ではない可能性があると考えて確認しましたが、id -u root0が返されました。

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

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

編集する:

Gillesが提案したとおりに実行しましたが、ulimit -rすべての場合に0(builderおよび)が返されましたroot

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

到着する:* - rtprio 99

ulimit -rこれは期待される出力に影響を与え、99を返します。

その後、プログラムを再実行してみましたが、rootまだ同じOperation not permittedエラーが発生しました。もう動作しませんsudoOperation not permitted上記と同じ)...奇妙です!

調査中に以前の設定を復元しました/etc/security/limits.conf

答え1

私もこの問題のため悩みです。私の場合、dockerデーモンはデフォルトのcgroupを再設定したことがわかりました。その結果、root ユーザーの cgroup スライスはcpu.rt_runtime_us0 に設定されます。リアルタイムスケジューラ(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, …)

それでも役に立たない場合は、システム構成ではなくプログラムに問題がある可能性があります。投稿する問題を再現できる小さな、独立したソースコード、存在するスタックオーバーフロー(プログラミングは余談です。UnixとLinux)。

関連情報