Raspberry Pi2でArchLinuxを実行しています。
GordonのwiringPi
ライブラリを使用するユーザースペースプログラムがあります。特に、現在のプロセスに最高の優先度を設定しようとする piHiPri()
function ( sched_setscheduler
およびSCHED_RR
モードを使用)。この関数にはスーパーユーザー権限が必要です。
Arch Linuxをインストールするときのデフォルトユーザーはrootユーザーなので、builder
という名前のユーザーを作成しました。これをsudoers
のおかげでvisudo
に追加しました。
私の問題は、root
ユーザーでプログラムを実行すると、sched_setscheduler
関数が「操作は許可されていません」(errno
から取得)を返すことです。
builder
のときに実行すると、「許可が拒否されました」というメッセージが表示されます。
ただし、builder
でSudo 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
設定に戻しました。
私もこの問題に見舞われました。私の場合、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
違いを説明できる1つのことは、最大リアルタイム優先度(_ulimit -r
_)の制限が異なる場合です。ルートは制限を超えることはできませんが、制限を上げることはできます。 _ulimit -r
_(または、Cではgetrlimit(RLIMIT_RTPRIO, …)
で確認し、必要に応じてプログラムを実行する前に制限を引き上げてください。
それでも問題が解決しない場合は、システム構成の問題ではなく、プログラムの問題である可能性があります。 問題を再現する小さいが自己完結型のソースコード を Stack Overflow に投稿します(プログラミングは nix&Linux ではトピックから外れています)。