종종 USB 키보드를 노트북에 연결하는데, 연결하면 기본 반복 속도가 원하는 대로 설정되지 않습니다. udev
규칙을 추가하여 스크립트를 사용하여 변경해 보았습니다.
`ACTION=="add", ATTRS{name}=="Dell Dell Multimedia Pro Keyboard", RUN+="set-keyboard.sh"`
set-keyboard.sh
스크립트 로 호출
xset -display :0 r rate 500 50; xset -display :0 b off
문제는 이렇게 하면 USB 키보드의 반복 속도와 경고음이 설정되는 것이 아니라 노트북 내장 키보드의 반복 속도와 경고음이 설정된다는 점입니다. (즉, xset q
내장 키보드로 입력하면 올바른 설정이 나오는데, xset q
USB 키보드로 입력하면 여전히 잘못된 속도로 설정되어 있습니다.)
어떤 키보드를 설정할지 알 수 있는 방법이 있나요 xset
? 아니면 이 문제를 해결하는 다른 방법이 있나요?
답변1
좀 더 탐색한 끝에 발견한https://bugzilla.redhat.com/show_bug.cgi?id=601853문제는 udev가 실행된 후 xorg가 키보드 속도를 재설정한다는 점일 수 있습니다. 따라서 내 udev 스크립트가 확실히 실행 중이더라도 해당 작업은 xorg에 의해 즉시 취소됩니다.
그러나 해당 페이지에는 수정 사항도 있습니다. options 으로 startx를 실행하면 startx -- -ardelay 500 -arinterval 20
새 키보드가 연결되어 있어도 설정이 유지됩니다.
답변2
이 명령을 시도하여 USB 키보드의 udev ID를 확인할 수 있습니다. 다음 명령을 실행하고 키보드를 연결하세요.
$ udevadm monitor --udev --subsystem-match=usb
예 - 모니터
나는 오래된 Sun Microsystems USB 키보드를 가지고 있습니다. 플러그를 뽑았다가 다시 연결하면 다음과 같은 udev 메시지가 나타납니다.
$ udevadm monitor --udev --subsystem-match=usb
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
UDEV [1375655040.466080] remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0 (usb)
UDEV [1375655040.557791] remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2 (usb)
UDEV [1375655044.586242] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2 (usb)
UDEV [1375655044.589087] add /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0 (usb)
UDEV [1375655049.880514] remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0 (usb)
UDEV [1375655049.905175] remove /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2 (usb)
따라서 규칙에 넣을 수 있는 udev ID는 위 출력의 이 부분을 활용하게 됩니다 /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2
.
예 - 내보내기
전체 udev DB를 내보내고 수동으로 스캔할 수도 있습니다.
$ udevadm info --export-db
...
P: /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2
N: bus/usb/002/009
S: char/189:136
E: UDEV_LOG=3
E: DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2
E: SUBSYSTEM=usb
E: DEVNAME=bus/usb/002/009
E: ID_VENDOR=0430
E: ID_VENDOR_ENC=0430
E: ID_VENDOR_ID=0430
E: ID_MODEL=0005
E: ID_MODEL_ENC=0005
E: ID_MODEL_ID=0005
E: ID_REVISION=0102
E: ID_SERIAL=0430_0005
E: ID_BUS=usb
E: ID_USB_INTERFACES=:030101:
E: MAJOR=189
E: MINOR=136
E: DEVTYPE=usb_device
E: DRIVER=usb
E: DEVICE=/proc/bus/usb/002/009
E: PRODUCT=430/5/102
E: TYPE=0/0/0
E: BUSNUM=002
E: DEVNUM=009
E: DEVLINKS=/dev/char/189:136
...
그리고 udev 규칙에서 위 출력의 다른 고유한 기능을 활용하세요.
인용하다
답변3
이 문제를 해결하기 위해 내가 만든https://github.com/SFTtech/xautocfg.
새 키보드가 연결되면 X 서버로부터 이벤트를 받습니다. 그런 다음 키 반복 속도 및 지연 설정과 같은 구성을 키보드에 적용할 수 있습니다.
루트 권한이 필요하지 않으며 부팅 옵션을 편집 -ardelay 200 -arinterval 20
하거나 해킹된 udev 규칙을 사용할 필요도 없습니다. xautocfg
사용자(바람직하게는 시스템 사용자로 제공)로 실행하고 장치 구성을 업데이트하세요.
답변4
그래서 1년간의 온라인 검색 끝에 마침내 오늘 작동하게 되었습니다.
원천:https://newbedev.com/udev-rule-to-auto-load-keyboard-layout-when-usb-keyboard-plugged-in
@TomYan이 이미 언급했듯이 xset
이것은 X11 프로그램입니다. 따라서 DISPLAY
및 env 변수를 XAUTHORITY
하드코딩 해야 합니다 .
기본적으로 해결 방법은 짧은 지연 시간을 두고 백그라운드에서 스크립트를 실행하는 것입니다. 따라서 udev는 xset 키보드보다 먼저 키보드를 활성화할 수 있습니다. 위에서 언급한 솔루션에서 udev는 백그라운드에서 두 번째 스크립트를 호출하는 스크립트를 호출하고 xset
실제로 이는 단일 스크립트로 단축될 수 있습니다.
Keyboard.sh 설정
#!/usr/bin/env bash
(
sleep 1
DISPLAY=":0.0"
XAUTHORITY="/home/your-profile/.Xauthority"
export DISPLAY XAUTHORITY
xset r rate 250 50
) &