“systemd-inhibit --what=idle”的访问被拒绝

“systemd-inhibit --what=idle”的访问被拒绝

问题

在 Debian 12 上我使用IdleAction=poweroff和。这按预期工作,机器闲置足够长时间后会自行关闭。IdleActionSec=…logind.conf

我希望能够systemd-inhibit --what=idle作为普通用户使用。我发现这应该是可能的(例子)。事实上,在我的一个 Debian 12 系统中这是可能的,我们称之为 Debian成功的;但我还有其他 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 直接使用其硬件。一失败Debian安装在HP ProLiant DL380 G5上;其他失败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 和每个失败一是图形用户界面。有Xorg,sddm以及相关流程成功的。但正如我所说,我根本不登录 GUI。不知道和这个问题有没有关系。也许这只是一条红鲱鱼。

答案1

在创建问题时,我注意到polkitd在运行成功的系统,但不在任何失败一。我知道这个问题与 polkit 有很大关系,所以我在一个 Debian 上尝试了一下失败团体:

sudo apt-get install polkitd

是的,就是这样,问题解决了。现在我可以systemd-inhibit --what=idle作为普通用户使用了。

我认为关于成功的安装Debianpolkitd是因为其他软件包(例如network-manager)依赖于它。

本来这个问题不应该是我自己回答的,我真的需要帮助。一个例子橡皮鸭调试, 我猜。

相关内容