我在 Raspberry Pi 2 上运行 Arch Linux。
我有一个用户空间程序,它使用戈登的wiringPi
库,特别是piHiPri()
功能尝试为当前进程设置最高优先级(使用sched_setscheduler
和SCHED_RR
模式)。该功能需要超级用户权限。
root 用户是安装 Arch Linux 时的默认用户,因此我创建了一个名为的用户,builder
并将其添加sudoers
到visudo
.
我的问题是:当我与用户一起执行程序时root
,该sched_setscheduler
函数返回“不允许操作”(从 获取errno
)。
如果我在执行时执行它,builder
我会收到“权限被拒绝”的消息。
sudo myProgram
但是,如果我用while being执行它builder
,一切都很好,我可以看到优先级已随top
命令而改变。
我认为root
用户可能没有 UID 0,所以我检查了一下,id -u root
但返回了 0。
ls -l myProgramm
给出-rwxr-xr-x 1 root root
.我也尝试过设置SUID,但chmod +s myProgramm
没有成功。
关于如何使我的程序可由 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
设置。
答案1
我也被这个问题困扰了。就我而言,事实证明 docker 守护进程已重新配置默认 cgroup。结果,root 用户的 cgroup 切片设置cpu.rt_runtime_us
为零。为了设置实时调度程序(RR 或 FIFO),您需要分配一些 CPU 时间。如果您的进程没有它(当cpu.rt_runtime_us
为零时),您将得到“权限被拒绝”。
有关与此问题相关的 cgroup 和 docker 的更多详细信息,请参阅 RedHat Bugzilla 的错误报告:https://bugzilla.redhat.com/show_bug.cgi?id=1467919
答案2
可以解释这种差异的一件事是,您是否最终得到了不同的最大实时优先级限制 ( ulimit -r
)。 Root 不能超过该限制,但可以提高该限制。如有必要,请在运行程序之前检查ulimit -r
(或在 C 语言中)getrlimit(RLIMIT_RTPRIO, …)
并提高限制。
如果这没有帮助,则可能是您的程序有问题,而不是系统配置有问题。发布一个小但独立的源代码,可以重现问题, 在堆栈溢出(编程是题外话Unix 和 Linux)。