USB 장치의 기능을 차단할 수 있습니까?

USB 장치의 기능을 차단할 수 있습니까?

무선 휴대용 리모컨(Dupad G20S Pro Plus)과 통신하는 USB 장치가 있습니다. 내 데비안 상자에서는 잘 작동합니다. 제가 해결하려는 문제는 리모컨의 전원 버튼으로 시스템이 꺼지는 것을 방지하는 것입니다(제 생각에는 리모컨이 스마트 TV에 더 적합한 것 같습니다).

나는 적어도 lsusb를 통해 문제의 장치 기능이 다음과 같다는 것을 알아냈습니다.

% lsusb -vd 4842:0001
...
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0
      bInterfaceProtocol      1 Keyboard
      iInterface              0
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               2.01
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength     121
          Report Descriptor: (length is 121)
...
            Item(Local ): Usage, data= [ 0x81 ] 129
                            System Power Down
...

일부 커널 수준에서 이 기능을 방지할 수 있는 방법이 있습니까? 나는 systemd-inhibit를 사용하여 일반적인 종료를 방지할 수 있다는 것을 알았지만 더 낮은 수준(예: udev)을 사용하는 것을 선호했습니다.

고쳐 쓰다:

이는 Debian 서버용입니다(데스크톱 아님). 홈 자동화 목적으로 주요 이벤트가 캡처되고 있습니다.

답변1

(시스템 기반 Linux 호스트의 경우) 솔루션에 대한 단서는 다음에서 나옵니다.사람들 login.conf(8).

"power-switch" udev 태그가 있는 입력 장치만 키/뚜껑 스위치 이벤트에 대해 모니터링됩니다.

실제로 이 라벨을 만든 사람은기본 udev 규칙:

SUBSYSTEM=="input", KERNEL=="event*", ENV{ID_INPUT_KEY}=="1", TAG+="power-switch"

이 파일(/etc/udev/rules.d/70-power-switch.rules)의 규칙에 주석을 달아 이를 방지할 수 있었습니다.

추가 정보:

나의 초기 수정 시도는 새 파일에서 이 새로운 규칙을 사용하여 태그를 제거하는 것이었습니다 /etc/udev/rules.d/80-power-switch.rules(사후 처리에서 70-power-switch.rules).

SUBSYSTEM=="input", KERNEL=="event*", TAG-="power-switch"

내 버전의 systemd가 태그 제거(249)를 지원하지만 작동하도록 할 수 없습니다. 내 추측으로는 systemd가 원래 태그에 대한 경고를 받았으며 태그 제거를 지원하지 않는다는 것입니다.

답변2

해결하려는 문제는 리모컨의 전원 버튼으로 시스템이 종료되지 않는 것입니다.

알아보는 것이 가장 먼저 할 일이다.어떻게이것은 Linux에서 작동하며 Linux 시스템의 어느 부분이 "전원 버튼" 이벤트를 수신하는지(실제로 그 일부가 전혀 수신한다는 사실에 놀랐습니다). 설명자는 포함될 수도 있고 포함되지 않을 수도 있습니다.

/dev/input/by-*내가 시도한 첫 번째 일은 입력 장치를 식별하는 것이었습니다( 특정 장치에 매핑하는 심볼릭 링크의 심볼릭 링크를 참조하십시오 . 이를 사용하여 입력 장치 중 어느 것이 다른 키 누르기를 생성하는지 확인할 /dev/input/eventX수 있습니다 . 그런 다음 해당 장치에 대한 작업을 수행하고 전원이 버튼이 작동을 멈춥니다. 이후 단계에서 처리됩니다(예: 데스크탑 환경이므로 어떤 환경을 사용하고 있는지 확인하고 구성할 수 있는지 확인하세요). 여전히 유효하다면 이전 단계(커널 모듈이므로 부팅해야 함)입니다. ). 커널 보기).evtestevtest --grab

답변3

로그인할 때 리모컨의 전원 버튼으로만 시스템이 종료된다면 데스크탑 환경에서 처리되고 있는 것일 수 있습니다.

데비안의 기본 데스크탑 환경은 GNOME이며, gsd-media-keysGNOME 설정 데몬용 플러그인을 통해 이러한 작업을 처리합니다. 나는 KDE를 선호하기 때문에 이것을 테스트할 GNOME 시스템이 없습니다. 하지만 인터넷 검색을 통해 이와 같은 구성을 수행하는 이전 방식이 최신 버전의 GNOME에서는 더 이상 작동하지 않는다는 것을 발견했습니다.


로그인한 사람이 없을 때 리모컨의 전원 버튼으로 인해 시스템이 종료되는 경우 에서 이를 처리할 수 있습니다 logind. 이 경우 해결책은 간단할 수 있습니다.

에는 /etc/systemd/logind.conf특정 특수 키와 스위치를 처리하는 방법을 결정하는 주석 처리된 행이 많이 있습니다.

기본적으로 이러한 모든 행은 주석 처리되어 있으며 logind키와 스위치가 일반적으로 수행해야 하는 작업을 수행합니다. 예를 들어 키보드의 "전원" 키는 제어된 종료를 트리거합니다. 리모컨의 전원 버튼이 USB 키보드의 "전원" 키를 가장할 수 있으므로 이것이 바로 비활성화하려는 것입니다!

다음과 같이 주석 처리된 줄을 찾을 수 있습니다 /etc/systemd/logind.conf.

#HandlePowerKey=poweroff

해당 줄의 주석 처리를 제거하고 다음과 같이 변경하려면 파일을 편집해야 합니다.

HandlePowerKey=ignore

logind솔직히 말해서 구성 변경 사항이 즉시 적용되는지 아니면 재부팅 후에만 적용되는지 잘 모르겠습니다 . 매뉴얼 페이지에는 이 사실이 언급되지 않은 것 같으며 logind구성을 다시 로드해야 함을 나타내는 문서화된 방법도 없는 것 같습니다 .

관련 정보