3

ラップトップで Ubuntu 9.10 (Karmic Koala) を実行していますが、USB キーボードが接続されている (numlock オン) か、接続されていない (numlock オフ) かに応じて NumLock を自動的に切り替えたいと考えています。

これを実現するために、最初に「numlockx」パッケージをインストールしました。numlockx onそして正常にnumlockx off動作します。

デバイス システムに接続するには、udev を使用すると考えました。私は StackOverflow に関する他の質問を見て、「Writing udev rules」を読みました。しかし、udev ルールを機能させるのに問題があります。

まず、dmesg出力の例を次に示します。

[20906.985102] usb 3-2: uhci_hcd とアドレス 6 を使用する新しい低速 USB デバイス
[20907.166403] usb 3-2: 1 つの選択肢から選択された構成 #1
[20907.192904] 入力: Microsoft Natural® Ergonomic Keyboard 4000 as /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.0/input/input20
[20907.193100] microsoft 0003:045E:00DB.000B: 入力、hidraw1: USB HID v1.11 キーボード [Microsoft Natural® Ergonomic Keyboard 4000] on usb-0000:00:1a.0-2/input0
[20907.217810] 入力: Microsoft Natural® Ergonomic Keyboard 4000 as /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21
[20907.217979] microsoft 0003:045E:00DB.000C: 入力、hidraw2: USB HID v1.11 デバイス [Microsoft Natural® Ergonomic Keyboard 4000] on usb-0000:00:1a.0-2/input1

以前udevadm infoはデバイス情報を収集していました:

> udevadm 情報 -a -p /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21

  デバイス '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21' を見ています:
    KERNEL=="input21"
    サブシステム=="入力"
    ドライバー==""
    ATTR{phys}=="usb-0000:00:1a.0-2/input1"
    ATTR{uniq}==""
    ATTR{modalias}=="入力:b0003v045Ep00DBe0111-e0,1,2,3,4,14,k71,72,73,74,75,77,79,7A,7B,7C,7D,7E,7F,80 ,81,82,83,84,85,86,87,88,89,8A,8B,8C,8E,90,96,98,9B,9C,9E,9F,A1,A3,A4,A5,A6 ,A7,A8,A9,AB,AC,AD,AE,B0,B1,B2,B3,B4,B5,B6,B8,B9,BA,BB,BC,BD,BE,BF,C0,C1,C2 ,CE,CF,D0,D1,D2,D5,D9,DB,DF,E2,E7,E8,E9,EA,EB,F0,100,162,166,16A,16E,178,179,17A,17B,17C,17D,17F ,180,181,182,185,18C,18D,192,193,195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA,1AB,1AC,1AD,1AE,1B0,1B1,1B7,r6,a20,m4 、lsfw」

  親デバイス '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1':
    KERNELS=="3-2:1.1"
    サブシステム =="usb"
    DRIVERS=="usbhid"
    ATTRS{bInterfaceNumber}=="01"
    ATTRS{bAlternateSetting} ==" 0"
    ATTRS{bNumEndpoints}=="01"
    ATTRS{bInterfaceClass}=="03"
    ATTRS{bInterfaceSubClass}=="00"
    ATTRS{bInterfaceProtocol}=="00"
    ATTRS{modalias} =="usb:v045Ep00DBd0173dc00dsc00dp00ic03isc00ip00"
    ATTRS{supports_autosuspend}=="1"

  親デバイス '/devices/pci0000:00/0000:00:1a.0/usb3/3-2' を見ています:
    KERNELS=="3-2"
    サブシステム =="usb"
    ドライバー=="USB"
    ATTRS{構成}==""
    ATTRS{bNumInterfaces}=="2"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bmAttributes} =="a0"
    ATTRS{bMaxPower}=="100mA"
    ATTRS{urbnum}=="532"
    ATTRS{idVendor}=="045e"
    ATTRS{idProduct}=="00db"
    ATTRS{bcdDevice}=="0173"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="8"
    ATTRS{速度}=="1.5"
    ATTRS{バス番号}=="3"
    ATTRS{devnum}=="6"
    ATTRS{バージョン} =="2.00"
    ATTRS{maxchild}=="0"
    ATTRS{癖} =="0x0"
    ATTRS{承認済み}=="1"
    ATTRS{メーカー}=="マイクロソフト"

  親デバイス '/devices/pci0000:00/0000:00:1a.0/usb3' を見ています:
    KERNELS=="usb3"
    サブシステム =="usb"
    ドライバー=="USB"
    ATTRS{構成}==""
    ATTRS{bNumInterfaces}=="1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bmAttributes} =="e0"
    ATTRS{bMaxPower}=="0mA"
    ATTRS{urbnum}=="127"
    ATTRS{idVendor}=="1d6b"
    ATTRS{idProduct}=="0001"
    ATTRS{bcdDevice}=="0206"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{速度}=="12"
    ATTRS{バス番号}=="3"
    ATTRS{devnum}=="1"
    ATTRS{バージョン} =="1.10"
    ATTRS{maxchild}=="2"
    ATTRS{癖} =="0x0"
    ATTRS{承認済み}=="1"
    ATTRS{manufacturer}=="Linux 2.6.31-16-generic uhci_hcd"
    ATTRS{product}=="UHCI ホスト コントローラー"
    ATTRS{シリアル} =="0000:00:1a.0"
    ATTRS{authorized_default}=="1"

  親デバイス '/devices/pci0000:00/0000:00:1a.0':
    KERNELS=="0000:00:1a.0"
    サブシステム=="pci"
    DRIVERS=="uhci_hcd"
    ATTRS{ベンダー} =="0x8086"
    ATTRS{デバイス} =="0x2937"
    ATTRS{subsystem_vendor}=="0x1558"
    ATTRS{subsystem_device}=="0x0860"
    ATTRS{クラス} =="0x0c0300"
    ATTRS{irq}=="16"
    ATTRS{local_cpus}=="ff"
    ATTRS{local_cpulist}=="0-7"
    ATTRS{modalias} =="pci:v00008086d00002937sv00001558sd00000860bc0Csc03i00"
    ATTRS{broken_parity_status}=="0"
    ATTRS{msi_bus}==""

  親デバイス '/devices/pci0000:00' を見る:
    KERNELS=="pci0000:00"
    サブシステム==""
    ドライバー==""

そこで、次のファイルを作成しました/etc/udev/rules.d/usb-keyboard.rules

# キーボードが接続されているときに NumLock をオンにします。
ACTION=="追加"、ATTRS{製造元}=="Microsoft"、SUBSYSTEM=="入力"、RUN+="/usr/bin/numlockx on"

# キーボードが抜かれたら NumLock をオフにします。
ACTION=="削除", ATTRS{製造元}=="Microsoft", SUBSYSTEM=="入力", RUN+="/usr/bin/numlockx off"

udevadm testルールが正しいことを確認するために使用しました:

> udevadm テスト --action=add /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21
run_command: 呼び出し: テスト
udevadm_test: バージョン 147

[...]
parse_file: 「/etc/udev/rules.d/usb-keyboard.rules」をルール ファイルとして読み取ります
udev_rules_new: ルールは 180864 バイトのトークン (15072 * 12 バイト)、31614 バイトのバッファを使用します
udev_rules_new: 使用される一時インデックス 49760 バイト (2488 * 20 バイト)
udev_device_new_from_syspath: デバイス 0x28d7d80 には devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21' があります
udev_rules_apply_to_event: RUN '/sbin/modprobe -b $env{MODALIAS}' /lib/udev/rules.d/80-drivers.rules:5
udev_rules_apply_to_event: RUN 'socket:@/org/freedesktop/hal/udev_event' /lib/udev/rules.d/90-hal.rules:2
udev_device_new_from_syspath: デバイス 0x28d8560 には devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1' があります
udev_device_new_from_syspath: デバイス 0x28d8708 には devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2' があります
udev_rules_apply_to_event: RUN '/usr/bin/numlockx on' /etc/udev/rules.d/usb-keyboard.rules:7
udevadm_test: UDEV_LOG=6
udevadm_test: DEVPATH=/デバイス/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21
udevadm_test: 製品=3/45e/db/111
udevadm_test: NAME="Microsoft Natural® Ergonomic Keyboard 4000"
udevadm_test: PHYS="usb-0000:00:1a.0-2/input1"
udevadm_test: UNIQ=""
udevadm_test: EV==10001f
udevadm_test: KEY==837fff 2c3027 bf004444 0 0 1 10f84 8a27c007 ff7f7bfa d9415fff febeffdf ffefffff ffffffff fffffffe
udevadm_test: REL==40
udevadm_test: ABS==1 0
udevadm_test: MSC==10
udevadm_test: MODALIAS=入力:b0003v045Ep00DBe0111-e0,1,2,3,4,14,k71,72,73,74,75,77,79,7A,7B,7C,7D,7E,7F,80,81, 82,83,84,85,86,87,88,89,8A,8B,8C,8E,90,96,98,9B,9C,9E,9F,A1,A3,A4,A5,A6,A7, A8、A9、AB、AC、AD、AE、B0、B1、B2、B3、B4、B5、B6、B8、B9、BA、BB、BC、BD、BE、BF、C0、C1、C2、CE、 CF,D0,D1,D2,D5,D9,DB,DF,E2,E7,E8,E9,EA,EB,F0,100,162,166,16A,16E,178,179,17A,17B,17C,17D,17F,180,181,182,185, 18C,18D,192,193,195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA,1AB,1AC,1AD,1AE,1B0,1B1,1B7,r6,a20,m4,lsfw
udevadm_test: ACTION=追加
udevadm_test: サブシステム=入力
udevadm_test: 実行: '/sbin/modprobe -b 入力:b0003v045Ep00DBe0111-e0,1,2,3,4,14,k71,72,73,74,75,77,79,7A,7B,7C,7D,7E ,7F,80,81,82,83,84,85,86,87,88,89,8A,8B,8C,8E,90,96,98,9B,9C,9E,9F,A1,A3,A4 ,A5,A6,A7,A8,A9,AB,AC,AD,AE,B0,B1,B2,B3,B4,B5,B6,B8,B9,BA,BB,BC,BD,BE,BF,C0 ,C1,C2,CE,CF,D0,D1,D2,D5,D9,DB,DF,E2,E7,E8,E9,EA,EB,F0,100,162,166,16A,16E,178,179,17A,17B,17C ,17D,17F,180,181,182,185,18C,18D,192,193,195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA,1AB,1AC,1AD,1AE,1B0,1B1,1B7,r6 ,a20,m4,lsfw'
udevadm_test: 実行: 'socket:@/org/freedesktop/hal/udev_event'
udevadm_test: 実行: '/usr/bin/numlockx on'

そして、これが「削除」テストです。

> udevadm テスト --action=削除 /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21

run_command: 呼び出し: テスト
udevadm_test: バージョン 147

[...]
parse_file: 「/etc/udev/rules.d/usb-keyboard.rules」をルール ファイルとして読み取ります
udev_rules_new: ルールは 180864 バイトのトークン (15072 * 12 バイト)、31614 バイトのバッファを使用します
udev_rules_new: 使用される一時インデックス 49760 バイト (2488 * 20 バイト)
udev_device_new_from_syspath: デバイス 0xd2fd80 には devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21' があります
udev_rules_apply_to_event: RUN 'socket:@/org/freedesktop/hal/udev_event' /lib/udev/rules.d/90-hal.rules:2
udev_device_new_from_syspath: デバイス 0xd2fff8 には devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1' があります
udev_device_new_from_syspath: デバイス 0xd30690 には devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2' があります
udev_rules_apply_to_event: RUN '/usr/bin/numlockx off' /etc/udev/rules.d/usb-keyboard.rules:10
udevadm_test: UDEV_LOG=6
udevadm_test: DEVPATH=/デバイス/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21
udevadm_test: 製品=3/45e/db/111
udevadm_test: NAME="Microsoft Natural® Ergonomic Keyboard 4000"
udevadm_test: PHYS="usb-0000:00:1a.0-2/input1"
udevadm_test: UNIQ=""
udevadm_test: EV==10001f
udevadm_test: KEY==837fff 2c3027 bf004444 0 0 1 10f84 8a27c007 ff7f7bfa d9415fff febeffdf ffefffff ffffffff fffffffe
udevadm_test: REL==40
udevadm_test: ABS==1 0
udevadm_test: MSC==10
udevadm_test: MODALIAS=入力:b0003v045Ep00DBe0111-e0,1,2,3,4,14,k71,72,73,74,75,77,79,7A,7B,7C,7D,7E,7F,80,81, 82,83,84,85,86,87,88,89,8A,8B,8C,8E,90,96,98,9B,9C,9E,9F,A1,A3,A4,A5,A6,A7, A8、A9、AB、AC、AD、AE、B0、B1、B2、B3、B4、B5、B6、B8、B9、BA、BB、BC、BD、BE、BF、C0、C1、C2、CE、 CF,D0,D1,D2,D5,D9,DB,DF,E2,E7,E8,E9,EA,EB,F0,100,162,166,16A,16E,178,179,17A,17B,17C,17D,17F,180,181,182,185, 18C,18D,192,193,195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA,1AB,1AC,1AD,1AE,1B0,1B1,1B7,r6,a20,m4,lsfw
udevadm_test: ACTION=削除
udevadm_test: サブシステム=入力
udevadm_test: 実行: 'socket:@/org/freedesktop/hal/udev_event'
udevadm_test: 実行: '/usr/bin/numlockx off'

問題は、キーボードを差し込んだり抜いたりしても、NumLock の状態が変わらないことです。udev サービスを再起動しようとしましたが、うまくいきませんでした。私の udev ルールは間違っていますか? 私はこれについて間違った方法で進んでいますか?

4

1 に答える 1

1
  1. 私はこれについてあまり詳しくありませんが、キーボードの状態は、udev よりも高いレベルにある X11 の「配管」によって管理されているので、そこで行っていることはすべて上書きされていると思います。の構成ファイルを掘り下げると、詳細がわかる場合があります/etc/X11

  2. これに対するより関連性の高い回答は、superuser.com (このページの一番下にあるリンク) で入手できます。ここであなたの質問を閉じるために投票することはしませんが、他の人は投票するかもしれません.

于 2010-01-12T06:27:13.553 に答える