在 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.policy
有poweroff
、reboot
、suspend
和的部分hibernate
,且allow_active
设置为 yes。但没有shutdown
.如果是这个原因,为什么会这样呢?
答案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
组中的任何用户视为管理员。因此系统会提示您进行自己的身份验证。)halt
,poweroff
,reboot
命令
poweroff
和reboot
工作分两步进行:- 如果在非 root 用户下调用并且
logind
可用,logind
则要求使用 polkit actions 执行操作org.freedesktop.login1.*
; - 否则,几乎等同于
systemctl poweroff
orsystemctl reboot
被执行,但是无需咨询 polkit。
halt
类似,但它总是走第二条路线(几乎相当于systemctl halt
)。没有通过登录停止的方法。注意“几乎相等”。如果你这样做
poweroff
在未登录的非 root 下,reboot
在未登录的非 root 下,halt
在非 root 下,
你会得到一个“必须是 root”。而不是
org.freedesktop.systemd1.manage-units
通过 polkit 进行身份验证。同时,使用systemctl poweroff
、systemctl reboot
或systemctl halt
您将有机会通过 polkit 进行身份验证。这可能是一个错误。- 如果在非 root 用户下调用并且
shutdown
该工具可用于安排延迟断电、暂停或重新启动。如果不带参数调用,则意味着 1 分钟的延迟。默认操作是关闭电源。从关闭(8):
时间字符串可以采用“hh:mm”格式,表示小时/分钟,指定执行关闭的时间,以 24 小时时钟格式指定。或者,它可以采用语法“+m”,指的是从现在开始的指定分钟数 m。 “now”是“+0”的别名,即触发立即关闭。如果未指定时间参数,则隐含“+1”。
如果未指定超时和挂墙消息,
shutdown
则相当于poweroff
、halt
或之一reboot
(请参阅#2)。如果指定了超时或留言墙,则
shutdown
需要 root 权限。poweroff
不关机确实应该如此。这可能是一个内核错误。