jumble

アクセスカウンタ

zoom RSS Linux(Fedora 16)でキーボードから入力できない

<<   作成日時 : 2012/04/20 18:58   >>

ブログ気持玉 0 / トラックバック 1 / コメント 0

Linux(Fedora 16)でキーボードから入力できない


不正なEDIDが原因でfedora 16が起動しない件は、テキストログインにし、"nomodeset"を指定することで一応解決した。
前の記事参照。
がその後も、ログイン画面からキーボード入力ができない現象が頻繁に起きる。
当然不正なEDIDが原因だと思っていたので、それを無視するように努力した。
でもEDIDはモニタに関連するものであり、それがキーボードに影響を及ぼすというのは、最初から腑に落ちなかったのだが。
で、最初は"nomodeset"と同じ並びに"i8042.nopnp"や他の"i8042.no..."というのを試してみたが、結局変わらなかった。
ここここなど参照。
これらをカーネルパラメータという。
カーネルパラメータの詳細はこのページで確認できるが、肝心の"nomodeset"が見当たらないのは、いったいどういうことだ?
で、これを見ていろいろしたのだが、どうやってもだめだった。
特に、i8042.dumbkbdやi8042.reset、i8042.unlockなどは期待したのだが・・・。

途方に暮れたころ、/var/log/messagesを眺めるうち、キーボード入力ができる場合とできない場合のパターンの違いに気付いた。
まずは入力できないパターン。(パターン1とする)

・・・
[...] usb 3-1: new low speed USB device number 4 using uhci_hcd
・・・
[...] usb 3-1: New USB device found, idVendor=0e8f, idProduct=0020
[...] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[...] usb 3-1: Product: PS2toUSB Adapter
[...] usb 3-1: Manufacturer: GASIA
[...] input: GASIA PS2toUSB Adapter as /devices/pci0000:00/0000:00:1a.0/usb3/3-1/3-1:1.0/input/input2
[...] generic-usb 0003:0E8F:0020.0001: input,hidraw0: USB HID v1.10 Keyboard [GASIA PS2toUSB Adapter] on usb-0000:00:1a.0-1/input0
[...] input: GASIA PS2toUSB Adapter as /devices/pci0000:00/0000:00:1a.0/usb3/3-1/3-1:1.1/input/input3
[...] generic-usb 0003:0E8F:0020.0002: input,hidraw1: USB HID v1.10 Mouse [GASIA PS2toUSB Adapter] on usb-0000:00:1a.0-1/input1
[...] [drm] Initialized drm 1.1.0 20060810
・・・

次に入力できるパターン。(パターン2とする)

・・・
[...] usb 3-1: new low speed USB device number 4 using uhci_hcd
・・・
[...] usb 3-1: New USB device found, idVendor=0e8f, idProduct=0020
[...] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[...] usb 3-1: Product: PS2toUSB Adapter
[...] usb 3-1: Manufacturer: GASIA
[...] input: GASIA PS2toUSB Adapter as /devices/pci0000:00/0000:00:1a.0/usb3/3-1/3-1:1.0/input/input2
[...] generic-usb 0003:0E8F:0020.0001: input,hidraw0: USB HID v1.10 Keyboard [GASIA PS2toUSB Adapter] on usb-0000:00:1a.0-1/input0
[...] generic-usb: probe of 0003:0E8F:0020.0002 failed with error -71
・・・
[...] usb 3-1: USB disconnect, device number 2
・・・
[...] usb 3-1: new low speed USB device number 4 using uhci_hcd
[...] usb 3-1: New USB device found, idVendor=0e8f, idProduct=0020
[...] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[...] usb 3-1: Product: PS2toUSB Adapter
[...] usb 3-1: Manufacturer: GASIA
[...] input: GASIA PS2toUSB Adapter as /devices/pci0000:00/0000:00:1a.0/usb3/3-1/3-1:1.0/input/input4
[...] generic-usb 0003:0E8F:0020.0004: input,hidraw0: USB HID v1.10 Keyboard [GASIA PS2toUSB Adapter] on usb-0000:00:1a.0-1/input0
[...] input: GASIA PS2toUSB Adapter as /devices/pci0000:00/0000:00:1a.0/usb3/3-1/3-1:1.1/input/input5
[...] generic-usb 0003:0E8F:0020.0005: input,hidraw2: USB HID v1.10 Mouse [GASIA PS2toUSB Adapter] on usb-0000:00:1a.0-1/input1
・・・

(パターン1でも入力できる場合があることは後に気付いたが、パターン2では必ず入力できる。)
うーむ。
これをみると、不正なEDIDはこの現象とは関係なさそうだ。
確かにEDIDがキーボードに影響を与えるはずはないよな。
この現象が起きるマシンは、マウスは純正USB接続だが、キーボードはPS/2接続。
だがマシンにPS/2インターフェースはないので、PS/2・USBアダプタを経由してつないでいる。
ちなみにこのアダプタは、GASAというメーカー製だと思う。
このアダプタは1つのUSBコネクタからPS/2のキーボードとマウスの2又に分かれている。
そこにキーボードのみ接続し、マウス側は何も接続してないという状態だ(マウスはUSBで直に接続しているので)。
パターン2は、その未接続のマウス用ドライバがエラーを検知し、それが原因でUSB自体が一旦切断されている。
その後、改めてUSBが再認識されているようだ。
そのように動作した場合は、必ず正常に入力できる。
逆にパターン1のように、エラーが起きなかった場合は、入力できなくなることがある。
「エラーが起きた方が正常に動作する」という法則があるとは、なかなか思えないものだ。
原因はこのアダプタにありそうな気がした。
試しにキーボードが入力できない状態で、USBを一旦引っこ抜き、また接続すると入力できるようになった。
この操作を行うと、必ず入力できるようになる。
この時のログがこれ。

・・・
[...] usb 3-1: USB disconnect, device number 2
[...] usb 3-1: new low-speed USB device number 4 using uhci_hcd
[...] usb 3-1: New USB device found, idVendor=0e8f, idProduct=0020
[...] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[...] usb 3-1: Product: PS2toUSB Adapter
[...] usb 3-1: Manufacturer: GASIA
[...] input: GASIA PS2toUSB Adapter as /devices/pci0000:00/0000:00:1a.0/usb3/3-1/3-1:1.0/input/input5
[...] generic-usb 0003:0E8F:0020.0004: input,hidraw0: USB HID v1.10 Keyboard [GASIA PS2toUSB Adapter] on usb-0000:00:1a.0-1/input0
[...] input: GASIA PS2toUSB Adapter as /devices/pci0000:00/0000:00:1a.0/usb3/3-1/3-1:1.1/input/input6
[...] generic-usb 0003:0E8F:0020.0005: input,hidraw1: USB HID v1.10 Mouse [GASIA PS2toUSB Adapter] on usb-0000:00:1a.0-1/input1
localhost mtp-probe: checking bus 3, device 4: "/sys/devices/pci0000:00/0000:00:1a.0/usb3/3-1"
localhost mtp-probe: bus: 3, device: 4 was not an MTP device
・・・

最初、この未接続のマウス側のドライバが悪さしているのだと思った。
つながってないので、それは本来不要なはずだ。
よって、そのドライバをOSの起動時に止めればいいのではないかと。
この、特定のドライバを止める方法というのも調べるのにずいぶん苦労した。
ハードウェアの制御も結構頻繁に方法が変わるみたいで、今はsysfsという方法が使われているらしい。
ドライバを止めたり、再度割り当てたりする方法は、このページこのページを参照。
最初のページはUSBドライバを止める方法、次はキーボードなど入力装置そのもののドライバを止める方法だと思う。

起動時に実行したいので、rc.localを使うことにした。
ちなみにFedora 16では、rc.localはデフォルトでは動かないので、次の処理が必要らしい。
このページ参照。

# systemctl start rc-local.service

その上で、rc.localを/etc/rc.dディレクトリに置く。
最初に試したrc.localは次のような内容。

#! /bin/bash
(echo -n '3-1:1.1' > /sys/bus/usb/drivers/usb/3-1/3-1:1.1/driver/unbind) >> /var/log/messages

ちなみに、最初の"#! /bin/basho"(シェバング:shebang)がないと動作しないようだ。
以前からそうだったっけ?
でやってみたのだが・・・。
ドライバを止めるという目的自身は達成できているようだ。
それは"lsusb -t"コマンドで確認できる(どうも結果が不正確なときもあるのだが)。
が、入力できない現象は相変わらず発生する。
だめか。
上記のコマンドで無効にしているのは、あくまで未接続のマウスに対応する"USBの"ドライバだ。
では、マウス自身のドライバを無効にしたらどうだろう?
ということで、次に試したrc.localがこれ。

#! /bin/bash
(echo -n $(cd /sys/bus/usb/devices/3-1\:1.1; ls -d 0003*) > /sys/bus/hid/drivers/generic-usb/unbind) >> /var/log/messages

なぜこんなに長いのかというと、USBのドライバと違って名前がくるくる変わるからだ。
例えば、ドライバ名が"0003:0E8F:0020.0002"なら次のようなことをしているのと同じ。

#! /bin/bash
(echo -n '0003:0E8F:0020.0002' > /sys/bus/hid/drivers/generic-usb/unbind) >> /var/log/messages

これもドライバを止めるという目的自身は達成できている。
"ls /dev/input/by-path"で確認できる。
でもキーボードから入力できない問題は解決しない。
その確認が1回で済む訳ではなく、何回か起動して現象が発生するかどうかを試す必要があるので、非常に面倒だ。
何となく、再起動した場合よりも電源を入れ直した場合の方が、発生する確率が高い気がする。
では、未接続のマウスだけでなく、その根元のUSB自身のドライバを割り当て直したらどうだろう?

#! /bin/bash
(echo -n '3-1' > /sys/bus/usb/drivers/usb/unbind) >> /var/log/messages
sleep 1
(echo -n '3-1' > /sys/bus/usb/drivers/usb/bind) >> /var/log/messages

これもログで確認する限り、ドライバの再割り当てはうまくいくのだが、解決には至らない。
未接続マウスのドライバを止めた後、キーボードのドライバを再度割り当てたり、いろいろやってみた。
でもどうやってもダメ。
一番確実そうなのが、USBを物理的に引っこ抜いて再度接続したのと同じことを、ソフトウェア的に行うことだろう。
上記のドライバを止めるという方法だと、物理的に引っこ抜いたのと同じには恐らくなっていない。
ログに"USB disconnect"が出てこないからだ。
それに相当することは次のように実現できる(このページこのページ参照)。

# echo -n 1 > /sys/bus/usb/devices/3-1/remove

こうすると、ログに"USB disconnect"が出てくる。
このとき、/sys/bus/usb/devicesから"3-1"というディレクトリ自身が削除される。
で、再度物理的に接続するのと同じことをしたいのだが、それがどうしてもできなかった。
調べた結果、いくつかできそうなものがあるのだが、実際は期待通りに動いてくれない。
以下その例。
まずはこのページなどをみて、次を試してみた。

# udevadm trigger --verbose --action=add --subsystem-match=usb

ちなみにudevadmのマニュアルはここ
次はこのページなどを見て、これ。

# echo -n 1 > /sys/devices/pci0000\:00/0000\:00\:1a.0/rescan

ちなみにsysfsのマニュアルの一部がこれ
だが、いずれもダメだった。
物理的に再接続すると、/sys/bus/usb/devicesの下に新しく3-1ディレクトリができる。
それと同じことがどうしてもできない。
特に上の"rescan"なんかは、マニュアルを読む限りではかなり期待できそうなのだが。

まあ、諦めるしかないと思っていた矢先。
ふと、キーボードから入力できない状態で、キーボードのみをアダプタから引っこ抜いてみた。
アダプタ自体はUSBで接続したまま、PS/2の接続部を引っこ抜いたのである。
このときに気付いたのだが、入力できないとき、キーボードはNumLockがかかっている。
もちろんNumLock解除キーを押しても何の反応もない。
だが、引っこ抜いた瞬間にNumLockがはずれ、キーボードは復活し、入力できるようになった。
このとき、ログには何も出力されない。
ということは、Linux的には何も変化がないということだ。
うーむ。
どうやら、コンピュータ側ではなくて、キーボード側で何かが起こっているらしい。
あるいはアダプタか?
で、悪あがきでまた調査。
"GASIA"というアダプタの具体的な機器名で検索してみた。
現象としては、このサイトでやりとりされている内容とほぼ同じっぽい。
でも、解決に至ってなさそうだなあ。
残念。
こんなページも見つけた。
ふむ、カーネルパラメータに"acpi=off"を追加と。
なるほど、パソコンの終了時に自動的に電源が落ちなくなった。
なつかしい。初期のLinuxを思い出した。
でも、肝心のキーボードの件は解決しない。
で元に戻してと。
次はこんなページだ。
ん?USBレガシー機能?
何じゃそりゃ。
なるほど、そういうことか。
でも、そのDELLのマシンのBIOSにはそんな機能は見当たらない。
ただ、BIOSのメニューを眺めているうち、キーボードのNumLockのOn/Offという項目をみつけた。
それが"On"になっていたので"Off"にしてみた。
上記の通り、何となく気になっていただけなのだが。
そうすると、なんとこの問題は解決した。
少なくとも、何回か電源入れ直したり、再起動したりしたが今のところ発生していない。
うーん。
何だったんだろう。
結局根本的な原因はよく分からない。
恐らく、LinuxからGASAのアダプタ経由で送られてくる何らかの信号によって、キーボードがおかしくなる場合があるのだろう。
それがNumLockと関係があるのかどうかは分からないが。
少なくともWindowsでは起こらないので、Linuxとの相性ということになるのだろう。
まあ、結果的に解決したので良しとしよう。
別にBIOSでNumLockをOffにしても、それが使えなくなる訳じゃない。
起動後には普通に使えるのだ。
ただ、起動している最中にNumLockが一切かからない、というだけだと思う。
だから問題ないと思う。
いやー時間食ったな。
かなり特殊な状況での現象だろうから、この情報が役に立つ人はほとんどいないだろうけど。
でもまあ、最近のハードウェア制御で使われるディレクトリの大まかな構造を知ることができたので、その点ではよかった。
とりあえず、この件はこのくらいにしておこう。

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(1件)

タイトル (本文) ブログ名/日時
エアマックス 2013
Linux(Fedora 16)でキーボードから入力できない jumble/ウェブリブログ ...続きを見る
エアマックス 2013
2013/07/09 13:00

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
Linux(Fedora 16)でキーボードから入力できない jumble/BIGLOBEウェブリブログ
文字サイズ:       閉じる