【问题标题】:Why does `sched_setscheduler()` require root priveledges?为什么`sched_setscheduler()`需要root权限?
【发布时间】:2014-12-29 18:43:44
【问题描述】:

为什么sched_setscheduler() 需要root 权限?

我正在编写一些受益于设置 SCHED_FIFO 的代码。但是如果我使用 sched_setscheduler() 我现在必须要求这个进程以 root 身份运行。为什么不允许sched_setscheduler()在没有root权限的情况下运行?

【问题讨论】:

    标签: c linux linux-kernel root


    【解决方案1】:

    大概是因为使用实时调度程序的进程可以完全接管一台机器,而不会将 CPU 分配给其他进程——这是普通用户不应该有的权力。

    Linux 允许您进行比以 root 身份运行更精细的控制,但您可以使用以下命令在可执行文件上设置 CAP_SYS_NICE capability(以 root 用户身份完成一次):

     setcap cap_sys_nice+ep ./your_program  
    

    这将允许您的可执行文件使用 sched_setscheduler,即使它不是以 root 用户身份运行。

    【讨论】:

    • 注意:按照您的描述运行 setcap 需要 root (至少在我的机器上。也许将 sudo 添加到您的命令中。
    • 强制我的程序以 root 身份运行,IMO 就像在进程真的只需要对一件特定事物的特殊访问权限时授予对所有内容的访问权限。所以这个解决方案似乎是安全意义上的最佳解决方案,因为它只为需要的东西而不是所有东西(即强制以 root 身份运行)提供最低限度的提升安全权限。
    • @TrevorBoydSmith 另一种常用的方法是将程序以setuid root 身份运行,这使得进程以 root 用户身份运行,而不管启动它的用户是什么,并让程序在之后以编程方式删除权限执行任何仅根功能(在您的情况下调用 sched_setscheduler() 之后)。
    • setcap 手册页指向cap_from_text 手册页,意思是添加(+e作用和p允许的 cap_sys_nice 功能。有效和允许的含义在capabilites手册页中有说明
    【解决方案2】:

    因为它允许您的进程更改其他进程获得多少 CPU,这可能会被滥用。

    【讨论】:

    • 如果我理解正确的话,本质上需要 root 是一个设计决策权衡。之所以选择需要 root,是因为利大于弊。
    猜你喜欢
    • 2015-01-26
    • 1970-01-01
    • 2020-06-02
    • 2011-04-13
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多