问题
在 Debian 12 上我使用IdleAction=poweroff
和。这按预期工作,机器闲置足够长时间后会自行关闭。IdleActionSec=…
logind.conf
我希望能够systemd-inhibit --what=idle
作为普通用户使用。我发现它应该是可能的(示例)。事实上,在我的一个 Debian 12 系统中这是可能的,我们称其为 Debian Success;但我还得到了其他 Debian 12 系统Access denied
,我们称这些为“失败”。我真正需要此功能的机器位于失败组中。
这不是暂时的怪癖(因为“需要重新启动”或其他原因)。我刚刚重新启动了成功的机器和一台失败的机器,该行为仍然存在。
为什么有区别?我该怎么做才能使失败的系统表现得像成功的系统一样?
我对诸如某些自定义包装器之类的解决方法并不真正感兴趣sudo
。我想“只是工作”,就像在成功systemd-inhibit --what=idle
系统上那样。我想尽可能地“通过 systemd/polkit 书”调整它的行为。
目前的行为
这就是它在成功系统上的工作方式。这就是我要的:
$ SYSTEMD_LOG_LEVEL=7 systemd-inhibit --what=idle true
Bus n/a: changing state UNSET → OPENING
sd-bus: starting bus by connecting to /run/dbus/system_bus_socket...
Bus n/a: changing state OPENING → AUTHENTICATING
Bus n/a: changing state AUTHENTICATING → HELLO
Sent message type=method_call sender=n/a destination=org.freedesktop.DBus path=/org/freedesktop/DBus interface=org.freedesktop.DBus member=Hello cookie=1 reply_cookie=0 signature=n/a error-name=n/a error-message=n/a
Got message type=method_return sender=org.freedesktop.DBus destination=:1.75 path=n/a interface=n/a member=n/a cookie=1 reply_cookie=1 signature=s error-name=n/a error-message=n/a
Bus n/a: changing state HELLO → RUNNING
Sent message type=method_call sender=n/a destination=org.freedesktop.login1 path=/org/freedesktop/login1 interface=org.freedesktop.login1.Manager member=Inhibit cookie=2 reply_cookie=0 signature=ssss error-name=n/a error-message=n/a
Got message type=method_return sender=:1.7 destination=:1.75 path=n/a interface=n/a member=n/a cookie=149 reply_cookie=2 signature=h error-name=n/a error-message=n/a
Successfully forked off '(inhibit)' as PID 3384.
Skipping PR_SET_MM, as we don't have privileges.
true succeeded.
Bus n/a: changing state RUNNING → CLOSED
$ echo $?
0
$
这就是它在失败系统上失败的方式:
$ SYSTEMD_LOG_LEVEL=7 systemd-inhibit true
Bus n/a: changing state UNSET → OPENING
sd-bus: starting bus by connecting to /run/dbus/system_bus_socket...
Bus n/a: changing state OPENING → AUTHENTICATING
Bus n/a: changing state AUTHENTICATING → HELLO
Sent message type=method_call sender=n/a destination=org.freedesktop.DBus path=/org/freedesktop/DBus interface=org.freedesktop.DBus member=Hello cookie=1 reply_cookie=0 signature=n/a error-name=n/a error-message=n/a
Got message type=method_return sender=org.freedesktop.DBus destination=:1.44 path=n/a interface=n/a member=n/a cookie=1 reply_cookie=1 signature=s error-name=n/a error-message=n/a
Bus n/a: changing state HELLO → RUNNING
Sent message type=method_call sender=n/a destination=org.freedesktop.login1 path=/org/freedesktop/login1 interface=org.freedesktop.login1.Manager member=Inhibit cookie=2 reply_cookie=0 signature=ssss error-name=n/a error-message=n/a
Got message type=error sender=:1.1 destination=:1.44 path=n/a interface=n/a member=n/a cookie=464 reply_cookie=2 signature=s error-name=org.freedesktop.DBus.Error.AccessDenied error-message=Permission denied
Failed to inhibit: Access denied
Bus n/a: changing state RUNNING → CLOSED
$ echo $?
1
$
true
这只是一个例子。最终,我想调用一些长时间运行的命令,对此抑制非常有意义。
细节
成功和失败是 Debian 12。
成功和每次失败时的内核是
6.1.0-17-amd64
。的输出
id
:@Successful $ id uid=1000(kamil) gid=1000(kamil) groups=1000(kamil),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),100(users),106(netdev),111(bluetooth),113(lpadmin),117(scanner),124(pcspkr)
@Failing1 $ id uid=1000(kamil) gid=1000(kamil) groups=1000(kamil),4(adm),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),108(netdev)
在每个系统上都
/usr/bin/systemd-inhibit
给出相同的结果,我得出结论,成功和失败md5sum
之间的文件是相同的;它们没有被篡改。印刷:ls -l /usr/bin/systemd-inhibit
-rwxr-xr-x 1 root root 22928 11-10 01:25 /usr/bin/systemd-inhibit
在每个系统上都
/usr/share/dbus-1/system.d/org.freedesktop.login1.conf
给出相同的结果,我得出结论,成功和失败md5sum
之间的文件是相同的;它们没有被篡改。相关(?)部分:<busconfig> <policy user="root"> <allow own="org.freedesktop.login1"/> <allow send_destination="org.freedesktop.login1"/> <allow receive_sender="org.freedesktop.login1"/> </policy> <policy context="default"> <deny send_destination="org.freedesktop.login1"/> [...] <allow send_destination="org.freedesktop.login1" send_interface="org.freedesktop.login1.Manager" send_member="Inhibit"/> [...] <allow receive_sender="org.freedesktop.login1"/> </policy> </busconfig>
在每个系统上都
/usr/share/polkit-1/actions/org.freedesktop.login1.policy
给出相同的结果,我得出结论,成功和失败md5sum
之间的文件是相同的;它们没有被篡改。相关(?)部分:<policyconfig> [...] <action id="org.freedesktop.login1.inhibit-block-idle"> <description gettext-domain="systemd">Allow applications to inhibit automatic system suspend</description> <message gettext-domain="systemd">Authentication is required for an application to inhibit automatic system suspend.</message> <defaults> <allow_any>yes</allow_any> <allow_inactive>yes</allow_inactive> <allow_active>yes</allow_active> </defaults> </action> [...] </policyconfig>
我想这
<allow_any>yes</allow_any>
就是所谓的普通用户使用能力的原因systemd-inhibit --what=idle
。仍然在失败的系统上,它似乎被忽略了。成功的Debian 直接使用其硬件。HP ProLiant DL380 G5 上安装了一台失败的Debian;其他失败的Debian 是 VMware ESXi 7 中的虚拟机。
我用来
ssh
连接到成功的系统和每个失败的系统。成功的系统提供了一个 GUI,但它是“以防万一”;目前sddm
只坐在那里,我不以这种方式登录。的输出
pstree -lu
:@Successful $ pstree -lu systemd-+-ModemManager---2*[{ModemManager}] |-NetworkManager---2*[{NetworkManager}] |-accounts-daemon---2*[{accounts-daemon}] |-atop |-atopacctd |-avahi-daemon(avahi)---avahi-daemon |-blkmapd |-bluetoothd |-cron |-cups-browsed---2*[{cups-browsed}] |-cupsd |-dbus-daemon(messagebus) |-dhcpd |-exim4(Debian-exim) |-hostapd |-nfsdcld |-openvpn |-polkitd(polkitd)---2*[{polkitd}] |-rpc.idmapd |-rpc.mountd |-rpc.statd(statd) |-rpcbind(_rpc) |-rtkit-daemon(rtkit)---2*[{rtkit-daemon}] |-sddm-+-Xorg---10*[{Xorg}] | |-sddm-helper---sddm-greeter(sddm)---11*[{sddm-greeter}] | `-{sddm} |-smartd |-sshd-+-sshd---sshd(bisztynek) | `-sshd---sshd(kamil)---bash---tmux: client |-systemd(sddm)-+-(sd-pam) | |-dbus-daemon | `-pulseaudio-+-gsettings-helpe---3*[{gsettings-helpe}] | `-2*[{pulseaudio}] |-systemd(kamil)-+-(sd-pam) | |-dbus-daemon | `-pulseaudio-+-gsettings-helpe---3*[{gsettings-helpe}] | `-{pulseaudio} |-systemd(bisztynek)-+-(sd-pam) | |-dbus-daemon | `-pulseaudio-+-gsettings-helpe---3*[{gsettings-helpe}] | `-{pulseaudio} |-systemd-journal |-systemd-logind |-systemd-timesyn(systemd-timesync)---{systemd-timesyn} |-systemd-udevd |-tmux: server(kamil)---bash---pstree |-transmission-da(debian-transmission)---3*[{transmission-da}] |-udisksd---4*[{udisksd}] |-upowerd---2*[{upowerd}] `-wpa_supplicant
@Failing1 $ pstree -lu systemd-+-VGAuthService |-agetty |-cron |-dbus-daemon(messagebus) |-dhclient |-nmbd |-rsyslogd---3*[{rsyslogd}] |-smbd-+-cleanupd | |-smbd | `-smbd-notifyd |-sshd---sshd---sshd(kamil)---bash---tmux: client |-systemd(kamil)---(sd-pam) |-systemd-journal |-systemd-logind |-systemd-timesyn(systemd-timesync)---{systemd-timesyn} |-systemd-udevd |-tmux: server(kamil)-+-2*[bash---nano] | `-bash---pstree `-vmtoolsd---2*[{vmtoolsd}]
失败组中的其他系统可能运行稍微不同的任务集,但它们都类似地简约。
观察
成功的Debian 和失败的Debian之间的一大区别是 GUI。还有Xorg
,sddm
相关流程就成功了。但正如我所说,我根本不登录 GUI。不知道和这个问题有没有关系。也许这只是一条红鲱鱼。
在创建问题时,我注意到在成功的
polkitd
系统中运行,但在任何失败的系统中都没有运行。我知道这个问题与 polkit 有很大关系,所以我在Failing组的一个 Debian 上尝试了一下:是的,就是这样,问题解决了。现在我可以
systemd-inhibit --what=idle
作为普通用户使用了。我认为Debian之所以成功
polkitd
安装是因为其他软件包(例如network-manager
)依赖于它。本来这个问题不应该是我自己回答的,我真的需要帮助。我猜是橡皮鸭调试的一个例子。