Arch Linux 上用于关闭、暂停等的默认 Polkit 权限是什么?为什么会这样?

Arch Linux 上用于关闭、暂停等的默认 Polkit 权限是什么?为什么会这样?

在 Arch Linux 上,使用 systemd,以下命令都是指向 的符号链接systemctl

/usr/bin/telinit
/usr/bin/poweroff
/usr/bin/runlevel
/usr/bin/reboot
/usr/bin/halt
/usr/bin/shutdown

我发现他们在授权方面的行为令人困惑:

$ shutdown
Must be root.
$ halt
Must be root.
$ telinit 3
# Asks for Polkit authorization

既不请求授权,poweroff也不reboot请求授权。poweroff实际上并没有关闭我的系统,笔记本电脑仍然处于打开状态,屏幕上有文字说明它正在无限期地关闭电源。

我没有修改 Polkit 规则,所以我想知道为什么他们的行为如此。

  • 所有命令均由我的非 root 管理员用户尝试过,该用户是wheel.
  • /etc/polkit-1/rules.d似乎只包含默认规则集:

    # tail /etc/polkit-1/rules.d/*
    // DO NOT EDIT THIS FILE, it will be overwritten on update
    //
    // Default rules for polkit
    //
    // See the polkit(8) man page for more information
    // about configuring polkit.
    
    polkit.addAdminRule(function(action, subject) {
        return ["unix-group:wheel"];
    });
    

仔细检查后,/usr/share/polkit-1/actions/org.freedesktop.login1.policypoweroffrebootsuspend和的部分hibernate,且allow_active设置为 yes。但没有shutdown.如果是这个原因,为什么会这样呢?

答案1

这相当复杂。让我们按照列举的顺序来解释这些命令。

  1. telinit

    各种参数telinit直接转换为 的各种(不同)子命令systemctl。按照远程初始化(8)(systemd 包中的文档):

    2, 3, 4, 5

    更改 SysV 运行级别。这被转换为runlevel2.target, , ...的激活请求,runlevel3.target并且相当于systemctl isolate runlevel2.target, systemctl isolate runlevel3.target, ...

    因此,这些命令转换为systemctl isolate,它本身由 polkit action 控制org.freedesktop.systemd1.manage-units。该操作的权限默认为需要管理员身份验证— 既适用于活动会话、非活动会话以及任何会话之外的进程。

    (顺便说一句,默认情况下 polkit 配置为将wheel组中的任何用户视为管理员。因此系统会提示您进行自​​己的身份验证。)

  2. halt, poweroff,reboot

    命令poweroffreboot工作分两步进行:

    • 如果在非 root 用户下调用并且logind可用,logind则要求使用 polkit actions 执行操作org.freedesktop.login1.*
    • 否则,几乎等同于systemctl powerofforsystemctl reboot被执行,但是无需咨询 polkit

    halt类似,但它总是走第二条路线(几乎相当于systemctl halt)。没有通过登录停止的方法。

    注意“几乎相等”。如果你这样做

    • poweroff在未登录的非 root 下,
    • reboot在未登录的非 root 下,
    • halt在非 root 下,

    你会得到一个“必须是 root”。而不是org.freedesktop.systemd1.manage-units通过 polkit 进行身份验证。同时,使用systemctl poweroffsystemctl rebootsystemctl halt您将有机会通过 polkit 进行身份验证。这可能是一个错误。

  3. shutdown

    该工具可用于安排延迟断电、暂停或重新启动。如果不带参数调用,则意味着 1 分钟的延迟。默认操作是关闭电源。从关闭(8):

    时间字符串可以采用“hh:mm”格式,表示小时/分钟,指定执行关闭的时间,以 24 小时时钟格式指定。或者,它可以采用语法“+m”,指的是从现在开始的指定分钟数 m。 “now”是“+0”的别名,即触发立即关闭。如果未指定时间参数,则隐含“+1”。

    如果未指定超时和挂墙消息,shutdown则相当于poweroffhalt或之一reboot(请参阅#2)。

    如果指定了超时或留言墙,则shutdown需要 root 权限。

  4. poweroff不关机

    确实应该如此。这可能是一个内核错误。

相关内容