i3(xkeysnail)でキー入力ができず辛かった話

Posted on

i3でログインしたときのみキー入力が出来なくなるという奇妙な現象に遭遇したメモです。

結論から言うとi3は全く悪くなく、i3 configで自動起動させていたxkeysnailがデバイスを掴んでいてうまく入力までいかなかったようでした。

デバッグ

前提として環境はこんな感じです。

$ neofetch
                   -`                    takashabe@mars
                  .o+`                   --------------
                 `ooo/                   OS: Arch Linux x86_64
                `+oooo:                  Kernel: 6.1.12-zen1-1-zen
               `+oooooo:                 Uptime: 2 hours, 26 mins
               -+oooooo+:                Packages: 1533 (pacman), 3 (flatpak)
             `/:-:++oooo+:               Shell: bash 5.1.16
            `/++++/+++++++:              Resolution: 3840x2160, 2160x3840
           `/++++++++++++++:             WM: i3
          `/+++ooooooooooooo/`           Theme: Adwaita [GTK2]
         ./ooosssso++osssssso+`          Icons: Adwaita [GTK2]
        .oossssso-````/ossssss+`         Terminal: tmux
       -osssssso.      :ssssssso.        CPU: AMD Ryzen 9 3900X (24) @ 3.800GHz
      :osssssss/        osssso+++.       GPU: AMD ATI Radeon RX 6650 XT
     /ossssssss/        +ssssooo/-       Memory: 6804MiB / 64224MiB
   `/ossssso+/:-        -:/+osssso+-
  `+sso+:-`                 `.-/+oso:
 `++:.                           `-/+/
 .`                                 `/

事象はi3でキー入力が出来ないというものですが、そもそもi3でキー入力が出来ないとターミナルすら開けないので、一旦GNOME側でi3 configを編集してターミナルだけ自動起動させるようにしてみました。

するとやはりターミナル上でもキー入力を受け付けないので、ここでi3のkeybindが原因ではないことが確定しました。

gdmやGNOME上では普通にキーボードが使えていたのでハードウェア側の問題でもなさそう、さらにGNOME on xorgでログインしたときも動いていたのでXのせいでもなさそうということで大分範囲が絞られてきました。

しかしいかんせんi3に入ったときはキー入力が出来ないので調査困難でしたが、何を思ったかたまたまキーボードのUSBケーブルを抜き差ししたときにキー入力が出来るようになったので希望が見えてきました。

あとはevtestを使ってデバッグしようと思ったところ非常にそれっぽいログが出ていたのを発見。

$ evtest
No device specified, trying to scan all of /dev/input/event*
Not running as root, no devices may be available.
Available devices:
<略>
/dev/input/event3:      Topre Corporation HHKB Professional
/dev/input/event4:      foostan Corne Keyboard (crkbd)
/dev/input/event5:      foostan Corne Keyboard (crkbd)
<略>

Select the device event number [0-24]: 3
<略>
Properties:
Testing ... (interrupt to exit)
***********************************************
  This device is grabbed by another process.
  No events are available to evtest while the
  other grab is active.
  In most cases, this is caused by an X driver,
  try VT-switching and re-run evtest again.
  Run the following command to see processes with
  an open fd on this device
 "fuser -v /dev/input/event3"
***********************************************

evtestの言うとおりfuserを叩いてみる。

$ fuser -v /dev/input/event3
                     USER        PID ACCESS COMMAND
/dev/input/event3:   takashabe   1692 F.... xkeysnail

上記はキーボードは2台つなげていてHHKBのほうがキー入力が出来ない状態でした。

crkbdを指定してevtestしてみてもデバイスが掴まれている様子はなくキーコードも取れていたのでとりあえずxkeysnailを停止したところ、HHKBでもキー入力が出来るようになりました。

おそらくシステムをアップデートして再起動したあとにxkeysnailが期待通りに動かなくなっていたようです。 xkeysnailはめちゃくちゃ便利でずっと使わせてもらっていましたが、原因を探るのも大変そうだし最近コミットも無いっぽいので、これを機にxkeyremapを検証してみようかなと思っています。

まとめ

i3でキー入力出来ないという致命的な事象に遭遇しましたが幸運にも他WMを入れていたのと複数キーボードをつないでいたので何とか原因特定することが出来ました。

原因だけ見るとありがちな感じですが問題切り分けが大変すぎたので良い経験になりました。