为什么 sudo 用户可以使用 sched_setscheduler SCHED_RR 而 root 不能?

为什么 sudo 用户可以使用 sched_setscheduler SCHED_RR 而 root 不能?

我在 Raspberry Pi 2 上运行 Arch Linux。

我有一个用户空间程序,它使用戈登的wiringPi库,特别是piHiPri()功能尝试为当前进程设置最高优先级(使用sched_setschedulerSCHED_RR模式)。该功能需要超级用户权限。

root 用户是安装 Arch Linux 时的默认用户,因此我创建了一个名为的用户,builder并将其添加sudoersvisudo.

我的问题是:当我与用户一起执行程序时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 (builderroot)。

我更改了一行/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_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)。

相关内容