"systemd-inhibit --what=idle"에 대한 액세스가 거부되었습니다.

"systemd-inhibit --what=idle"에 대한 액세스가 거부되었습니다.

질문

Debian 12에서는 and 를 사용합니다 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이것은 단지 예일 뿐입니다. 궁극적으로 몇 가지 장기 실행 명령을 호출하고 싶고 이를 억제하는 것이 완벽합니다.


세부 사항

  • 성공적인그리고실패하다데비안 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. 아직 거기 있어실패하다시스템이 무시되는 것 같습니다.

  • 이것성공적인데비안은 하드웨어를 직접 사용합니다. 하나실패하다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}]
    

    다른 시스템은 다음에서 제공됩니다.실패하다그룹은 약간 다른 작업 세트를 실행할 수 있지만 모두 비슷하게 간결합니다.


관찰하다

큰 차이성공적인데비안과 모든실패하다하나는 그래픽 사용자 인터페이스입니다. 예 Xorg, sddm그리고 관련 프로세스성공적인. 하지만 앞서 말했듯이 저는 GUI에 전혀 로그인하지 않습니다. 이 문제와 관련이 있는지는 모르겠습니다. 어쩌면 이것은 단지 붉은 청어일지도 모릅니다.

답변1

문제를 생성할 때 polkitd실행 중이라는 것을 알았습니다.성공적인시스템이지만 어떤 시스템에도 없습니다.실패하다하나. 나는 이 문제가 polkit과 많은 관련이 있다는 것을 알고 있으므로 Debian에서 시도해 보았습니다.실패하다그룹:

sudo apt-get install polkitd

예, 문제가 해결되었습니다. 이제 systemd-inhibit --what=idle일반 사용자로 사용할 수 있습니다.

나는 생각한다성공적인Debian은 polkitd다른 패키지(예 network-manager: )가 의존하기 때문에 설치됩니다.

이 질문에 제가 직접 대답할 수는 없습니다. 정말 도움이 필요합니다. 한 가지 예고무 오리 디버깅, 아마도.

관련 정보