sysfs는 /proc/acpi/button/lid/LID/state를 대체합니다.

sysfs는 /proc/acpi/button/lid/LID/state를 대체합니다.

procfsACPI는 새 커널 버전에서 더 이상 사용되지 않습니다. 무엇 sysfs을 교체해야 할지, 뚜껑 버튼의 상태를 읽을 수 있는 깔끔한 방법을 모르겠습니다. 이를 수행하는 새로운 방법은 무엇입니까?

답변1

요약: 이 정확한 기능은 낮은 노트북 품질과 NDA 통과 펌웨어의 결함 으로 인해 영원히 사라졌습니다 .하지만 해결책이 있습니다.

~에 따르면이 스레드Linux 커널 버그 추적기에서 너무 많은 노트북의 펌웨어가 부팅 시 내부 덮개 상태 변수를 0으로 초기화합니다.폐쇄. 덮개가 닫힌 상태에서는 누구도 노트북을 열 수 없다는 사실에도 불구하고(전원을 켜기 전에 항상 펌웨어에서 확인함) 실제 상태와 펌웨어에서 보고한 상태가 명백히 일치하지 않습니다.

따라서 커널은 펌웨어가 정적으로 보고한 상태를 완전히 무시합니다. 자체 상태를 유지하기 위해 장치가 부팅된 후 펌웨어의 ACPI 인터럽트 이벤트에만 의존하여 상태 변경을 보고합니다. 달리 입증되지 않는 한 열려 있는 상태라고 가정합니다.

루트 사용자커널 상태는 해당 입력 장치를 호출하여 직접 확인할 수 있습니다. C 코드는 간단하지만 evtest아래와 같이 기존 유틸리티를 계속 사용할 수 있습니다.스튜어트 P. 벤틀리의 답변:

evtest --query "/dev/input/EVENT_N" "EV_SW" "SW_LID" && echo "open" || echo "closed"

권한이 없는 사용자logind상태는 D-Bus(v240부터)의 systemd를 통해서만 쿼리할 수 있습니다.

dbus-send --system --print-reply=literal \
    --dest="org.freedesktop.login1" "/org/freedesktop/login1" \
    "org.freedesktop.DBus.Properties.Get" \
        string:"org.freedesktop.login1.Manager" string:"LidClosed" | \
            awk 'NR == 1 { print $3 == "true" ? "closed" : "open" }'

또는

busctl get-property "org.freedesktop.login1" "/org/freedesktop/login1" \
    "org.freedesktop.login1.Manager" "LidClosed" | \
        awk 'NR == 1 { print $2 == "true" ? "closed" : "open" }'

답변2

나에게도 같은 문제가 있습니다. 불행히도 그런 문제는 없는 것 같습니다(적어도 내 시스템이 설정된 방식으로는). ㅏ2010년에 Linux 커널 메일링 리스트에 패치가 제출되었습니다.그러면 GPIO 스위치의 상태를 쿼리하기 위해 sysfs에 파일이 추가되지만 패치는철회된 것 같습니다제출자에게 ioctl()이 기사의 열람 요청을 통지한 후( EVIOCG*).

내가하려는 해결책은 다음과 같습니다.시험스위치 상태 쿼리(뚜껑이 열려 있으면 출구 0, 뚜껑이 닫혀 있으면 출구 10):

sudo evtest --query /dev/input/event5 EV_SW SW_LID

그러나 루트 액세스가 필요하지 않은 이 솔루션 버전이 있다면 좋을 것입니다.

관련 정보