ラップトップでUbuntu 9.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®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:input、hidraw1:USB HID v1.11 Keyboard [MicrosoftNatural®Ergonomic Keyboard 4000] on usb-0000:00:1a.0-2 / input0 [20907.217810]入力:MicrosoftNatural®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:input、hidraw2:USB HID v1.11 Device [MicrosoftNatural®Ergonomic Keyboard 4000] 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 == "入力" 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" 親デバイスを見る '/devices/pci0000:00/0000:00:1a.0/usb3/3-2': KERNELS == "3-2" SUBSYSTEMS == "usb" DRIVERS == "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 {speed} == "1.5" ATTRS {busnum} == "3" ATTRS {devnum} == "6" ATTRS {バージョン} == "2.00" ATTRS {maxchild} == "0" ATTRS {癖} == "0x0" ATTRS {authorized} == "1" ATTRS {メーカー} == "Microsoft" 親デバイス '/devices/pci0000:00/0000:00:1a.0/usb3'を確認します。 KERNELS == "usb3" SUBSYSTEMS == "usb" DRIVERS == "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 {speed} == "12" ATTRS {busnum} == "3" ATTRS {devnum} == "1" ATTRS {バージョン} == "1.10" ATTRS {maxchild} == "2" ATTRS {癖} == "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 {ベンダー} == "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" サブシステム== "" 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:呼び出し:テスト 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 = / 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®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 = 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: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:実行: 'socket:@ / org / freedesktop / hal / udev_event' udevadm_test:実行: '/ 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:呼び出し:テスト 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 = / 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®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 = 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:ACTION = remove udevadm_test:SUBSYSTEM = input udevadm_test:実行: 'socket:@ / org / freedesktop / hal / udev_event' udevadm_test:実行: '/ usr / bin / numlockx off'
問題は、キーボードが接続されている、または接続されていない場合、NumLockステータスが変化しないことです。運が悪いので、udevサービスを再起動してみました。私のudevルールは間違っていますか?私はこれを間違った方法で行っていますか?