ラップトップでUbuntu9.10(Karmic Koala)を実行していますが、USBキーボードが接続されているか(numlockがオン)、接続されていないか(numlockがオフ)に応じてNumLockを自動的に切り替えたいと考えています。
これを実現するために、私は最初に「numlockx」パッケージをインストールしました。 numlockx on
およびnumlockx off
は正常に機能します。
デバイスシステムに接続するには、udevを使用すると思いました。 "udevルールの記述" を読みましたが、udevルールを機能させるのに問題があります。
まず、dmesg
出力の例を次に示します。
[20906.985102] usb 3-2:uhci_hcdとアドレス6を使用する新しい低速USBデバイス [20907.166403] usb 3-2:1つの選択肢から選択された構成#1 [20907.192904 ]入力:MicrosoftNatural®ErgonomicKeyboard4000 as /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.0/input/input20 [20907.193100] Microsoft 0003 :045E:00DB.000B:input、hidraw1:USB HIDv1.11キーボード[MicrosoftNatural®ErgonomicKeyboard4000] on usb-0000:00:1a.0-2/input0 [20907.217810]入力:Microsoft Natural®ErgonomicKeyboard4000as/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21 [20907.217979] Microsoft 0003:045E:00DB .000C:input、hidraw2:USB HIDv1.11デバイス[MicrosoftNatural®ErgonomicKeyboard4000] on usb-0000:00:1a.0-2/input1
udevadm info
を使用してデバイス情報を収集しました。
> udevadm info -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" SUBSYSTEM == "input" DRIVER == "" ATTR {phys} == "usb-0000:00:1a.0-2/input1" ATTR {uniq} == "" ATTR {modalias} == "input: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" SUBSYSTEMS == "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" 親デバイスを確認中usb3/3-2 ': KERNELS == "3-2" SUBSYSTEMS == "usb" DRIVERS == "usb" ATTRS {configuration } == "" 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 {speed} == "1.5" ATTRS {busnum } == "3" ATTRS {devnum} == "6" ATTRS {version} == "2.00" ATTRS {maxchild} == "0" ATTRS {quirks} == "0x0" ATTRS {authorized} == "1" ATTRS {manufacturer} == "Microsoft" 親デバイスを見る '/devices/pci0000:00/0000:00:1a.0 /usb3': KERNELS == "usb3" SUBSYSTEMS == "usb" DRIVERS == "usb" ATTRS {configuration} == "" 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 {speed} == "12" ATTRS {busnum} == "3" ATTRS {devnum} == "1" ATTRS {version} == "1.10" ATTRS {maxchild} == "2" ATTRS {quirks} == " 0x0 " ATTRS {authorized} ==" 1 " ATTRS {manufacturer} ==" Linux 2.6.31-16-generic uhci_hcd " ATTRS {product} ==" UHCIホストコントローラー " ATTRS {serial} ==" 0000:00:1a.0 " ATTRS {authorized_default} ==" 1 " 親デバイス '/devices/pci0000:00/0000:00:1a.0': KERNELS == "0000:00:1a.0" SUBSYSTEMS == "pci" DRIVERS == "uhci_hcd" ATTRS {vendor} == "0x8086" ATTRS {device} == "0x2937" ATTRS {subsystem_vendor} == "0x1558" ATTRS {subsystem_device} == "0x0860" ATTRS {class} == "0x0c0300" ATTRS {irq} == "16" ATTRS {local_cpus } == "ff" ATTRS {local_cpulist} == "0-7" ATTRS {modalias} == "pci:v00008086d00002937sv00001558 sd00000860bc0Csc03i00 " ATTRS {broken_parity_status} ==" 0 " ATTRS {msi_bus} ==" " 親デバイスを見る '/ devices/pci0000:00 ': KERNELS == "pci0000:00" SUBSYSTEMS == "" DRIVERS == ""
そこで、/etc/udev/rules.d/usb-keyboard.rules
というファイルを作成しました。
#キーボードが接続されているときにNumLockをオンにします。 ACTION == "add"、ATTRS {manufacturer} == "Microsoft"、SUBSYSTEM == "input"、RUN + = "/ usr/bin/numlockx on " #キーボードが接続されていないときにNumLockをオフにします。 ACTION ==" remove "、ATTRS {manufacturer} ==" Microsoft "、SUBSYSTEM ==" input "、RUN + ="/usr/bin/numlockx off "
udevadm test
を使用して、ルールが正しいことを確認しました。
> udevadm test --action = add /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21 run_command:呼び出し:test 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:0 0: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 =/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21 udevadm_test :PRODUCT = 3/45e/db/111 udevadm_test:NAME = "MicrosoftNatural®ErgonomicKeyboard4000" 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 febeffff_ eff 。] udevadm_test:REL == 40 udevadm_test:ABS == 1 0 udevadm_test:MSC == 10 udevadm_test:MODALIAS = input: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、16 2,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 = add udevadm_test:SUBSYSTEM = input udevadm_test:run: '/ sbin/modprobe -b input: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:run:' socket:@/org/freedesktop/hal/udev_event ' udevadm_test:run:'/usr/bin/numlockx on '
そして、これが「削除」テストです。
> udevadm test --action = remove /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21 run_command:呼び出し:test 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-k eyboard.rules:10 udevadm_test:UDEV_LOG = 6 udevadm_test:DEVPATH =/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1 /input/input21 udevadm_test:PRODUCT = 3/45e/db/111 udevadm_test:NAME = "MicrosoftNatural®ErgonomicKeyboard4000" 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 [.__入力: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,1A 5,1A6,1A7,1A8,1A9,1AA、1AB、1AC、1AD、1AE、1B0,1B1,1B7、r6、a20、m4、lsfw udevadm_test:ACTION = remove udevadm_test: SUBSYSTEM = input udevadm_test:run: 'socket:@/org/freedesktop/hal/udev_event' udevadm_test:run: '/ usr/bin/numlockx off'
問題は、キーボードが接続または接続解除されても、NumLockのステータスが変更されないことです。 udevサービスを再起動しようとしましたが、うまくいきませんでした。私のudevルールは間違っていますか?私はこれについて間違った方法で行っていますか?
問題は、おそらく(名前が示すように)いくつかのX環境でnumlockxをテストしたことです。 Xクライアント(FirefoxやGEditなどのXサーバーに接続するGUIプログラム)は、接続するサーバーを認識している必要があり、また、何らかの認証を渡す必要があります。ルートユーザーまたはプレーンユーザーに関係なく、プレーンコンソールからログインして、GUIアプリケーションを起動してみてください。わからないため、DISPLAY関連のエラーが表示されます。
これを修正するには、環境変数DISPLAYを設定する必要があります。 Xサーバーが1つしかない場合、ほとんどの場合、アドレスは0です。
プレーンコンソールでこれを試してください:numlockx on
と入力すると、「ディスプレイを開くときにエラーが発生しました!」と表示されます。 DISPLAY=:0 numlockx on
と入力すると、機能します(少なくとも私にとっては機能しました)。
したがって、この環境変数をudevで設定するか、sh -c 'DISPLAY=:0 numlockx <state>'
を起動することができます。
これらの2つのコマンドは、udevの問題を多くデバッグするために使用できます。
udevd --debug-trace --verbose
strace -p pid_of_udevd -f -e trace=open,exec
Argsはバージョンが異なると変更される可能性があることに注意してください...
まったくの偶然かもしれませんが、udevルールは、番号で始まる名前を付けたときに機能し始めました。 80-usb-keyboard.rules
。