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 규칙을 수정하지 않았는데 왜 그렇게 작동하는지 궁금합니다.

  • 모든 명령은 루트가 아닌 관리자인 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있는데 yes로 설정되어 있습니다 . 하지만 그렇지 않습니다 . 이것이 이유라면 왜 이런 일이 발생합니까?poweroffrebootsuspendhibernateallow_activeshutdown

답변1

이것은 매우 복잡합니다. 이러한 명령을 열거 순서대로 설명하겠습니다.

  1. telinit

    다양한 매개변수는 telinit다양한(다른) 하위 명령으로 직접 변환됩니다 systemctl. ~에 따르면원격 초기화(8)(systemd 패키지의 문서):

    2, 3, 4, 5

    SysV 런레벨을 변경합니다. 이는 runlevel2.target, ...에 대한 활성화 요청 으로 변환되며 , , ... runlevel3.target와 동일합니다 .systemctl isolate runlevel2.targetsystemctl isolate runlevel3.target

    따라서 이러한 명령은 으로 변환되며 systemctl isolate그 자체는 polkit 작업에 의해 제어됩니다 org.freedesktop.systemd1.manage-units. 이 작업에 대한 권한은 기본적으로관리자 인증이 필요합니다— 활성 세션, 비활성 세션 및 세션 외부의 모든 프로세스에 적용됩니다.

    (그런데 기본적으로 polkit은 wheel그룹의 모든 사용자를 관리자로 처리하도록 구성되어 있으므로 자신을 인증하라는 메시지가 표시됩니다.)

  2. halt, poweroff,reboot

    명령 poweroffreboot작업은 두 단계로 이루어집니다.

    • 루트가 아닌 사용자로 호출되고 logind사용 가능한 경우 logind작업을 수행하려면 polkit 작업이 필요합니다 org.freedesktop.login1.*.
    • 그렇지 않으면 거의 동등하거나 systemctl poweroff실행 systemctl reboot되고 있지만,폴킷에 문의할 필요가 없습니다.

    halt비슷하지만 항상 두 번째 경로로 이동합니다(거의 동일함 systemctl halt). 로그인해서 멈출 수 있는 방법은 없습니다.

    "거의 같음"에 주목하십시오. 당신이 그렇게한다면

    • poweroff루트가 아닌 로그인에서
    • reboot루트가 아닌 로그인에서
    • halt루트가 아닌 경우,

    "루트여야 합니다"라는 메시지가 표시됩니다. polkit을 통해 인증하는 대신 org.freedesktop.systemd1.manage-units. 또한 systemctl poweroff또는 을 사용하면 polkit을 통해 인증 systemctl rebootsystemctl halt수 있습니다. 이는 버그일 수 있습니다.

  3. shutdown

    이 도구는 지연된 중단, 일시 중지 또는 다시 시작을 예약하는 데 사용할 수 있습니다. 인수 없이 호출하면 1분 지연을 의미합니다. 기본 동작은 전원을 끄는 것입니다. ~에서닫기(8):

    시간 문자열은 시간/분을 나타내는 "hh:mm" 형식일 수 있으며 종료 수행 시간을 지정하고 24시간 형식으로 지정됩니다. 또는 지금부터 m까지의 특정 시간을 나타내는 "+m" 구문을 사용할 수도 있습니다. "now"는 즉시 종료를 트리거하는 "+0"의 별칭입니다. 시간 매개변수가 지정되지 않으면 "+1"이 암시됩니다.

    시간 초과 및 벽 메시지가 지정되지 않은 경우 또는 (#2 참조) 중 하나 와 shutdown동일합니다 .poweroffhaltreboot

    시간 초과 또는 메시지 월이 지정된 경우 shutdown루트 권한이 필요합니다.

  4. poweroff종료하지 마세요

    실제로 그래야 합니다. 이는 커널 버그일 수 있습니다.

관련 정보