技術

VMware上のFedora KDEでLang1/Lang2キーが効かない問題を解決した話

そろそろ VMware はやめたいのですが、細かい要件まで含めるとすべての条件を満たす代替手段をまだ見つけられていないためだらだらと使い続けているところです。(とはいえ当の VMware 自体もクリップボード共有まわりが壊れてきていて要件は満たさなくなってきているんですが)

VMware Workstation Pro 26H1(ホスト: Windows 11)のゲストとして動かしている Fedora KDE Plasma で、キーボードの Lang1/Lang2 キーがまったく反応しない問題に遭遇しました。同じホスト上の別ゲスト(Fedora Cinnamon)では普通に使えていたので、しばらく首をひねることに。備忘録として残しておきます。

症状

  • Wayland セッション上で wev を実行しても、Lang1/Lang2 を押したときのイベントが何も表示されない
  • IBus-Anthy の設定で Lang1/Lang2 が割り当てできない
  • 同じホストの別ゲスト(Cinnamon)では同じキーが動作する

切り分け

キーイベントが「カーネル → コンポジタ → アプリ」のどの層で消えているかを調べるため、まず sudo evtest を実行しました。

Event: time 1784344989.874245, type 4 (EV_MSC), code 4 (MSC_SCAN), value 72
Event: time 1784344989.874245, -------------- SYN_REPORT ------------
Event: time 1784344989.974395, type 4 (EV_MSC), code 4 (MSC_SCAN), value 72
Event: time 1784344989.974395, -------------- SYN_REPORT ------------
Event: time 1784344991.342446, type 4 (EV_MSC), code 4 (MSC_SCAN), value 71
Event: time 1784344991.342446, -------------- SYN_REPORT ------------
Event: time 1784344991.495302, type 4 (EV_MSC), code 4 (MSC_SCAN), value 71
Event: time 1784344991.495302, -------------- SYN_REPORT ------------

スキャンコード(0x72 / 0x71)は届いているのに、KEY_* のキーイベントが発生していません。sudo dmesg で確認すると答えがそのまま書いてありました。

[  987.156482] atkbd serio0: Unknown key pressed (translated set 2, code 0x72 on isa0060/serio0).
[  987.156488] atkbd serio0: Use 'setkeycodes 72 <keycode>' to make it known.
[  987.256630] atkbd serio0: Unknown key released (translated set 2, code 0x72 on isa0060/serio0).
[  987.256636] atkbd serio0: Use 'setkeycodes 72 <keycode>' to make it known.
[  988.624645] atkbd serio0: Unknown key pressed (translated set 2, code 0x71 on isa0060/serio0).
[  988.624651] atkbd serio0: Use 'setkeycodes 71 <keycode>' to make it known.
[  988.777495] atkbd serio0: Unknown key released (translated set 2, code 0x71 on isa0060/serio0).
[  988.777501] atkbd serio0: Use 'setkeycodes 71 <keycode>' to make it known.

つまり、VMware の仮想キーボードはスキャンコードをちゃんとゲストに送っているものの、Linux の atkbd ドライバのデフォルトマップに 0x72 / 0x71 が含まれておらず、キーコードへの変換で捨てられていたのでした。

解決方法

まず一時的に確認

sudo setkeycodes 72 122   # 0x72 → KEY_HANGEUL (Lang1)
sudo setkeycodes 71 123   # 0x71 → KEY_HANJA  (Lang2)

これで evtestKEY_HANGEUL / KEY_HANJA が出るようになり、wev にも Hangul / Hangul_Hanja のキーシムが届くようになりました。ただし setkeycodes だと再起動で消えます。

udev hwdb で恒久化

/etc/udev/hwdb.d/90-vmware-lang-keys.hwdb を作成します。

evdev:atkbd:dmi:bvn*:bvr*:bd*:svnVMware*:pn*:*
 KEYBOARD_KEY_72=hangeul
 KEYBOARD_KEY_71=hanja

2,3行目の先頭半角スペースは必須なので注意。

作成したら反映します。

sudo systemd-hwdb update
sudo udevadm trigger --sysname-match="event*"

これで再起動後も Lang1/Lang2 が Hangul / Hangul_Hanja として認識されるようになりました。あとは IBus-Anthy の設定で IME のオン/オフに割り当てれば完成です。

まとめ

  • キーが効かないときは evtestdmesg で「どの層で消えているか」を切り分ける
  • Unknown key pressed が出ていたら udev hwdb(KEYBOARD_KEY_<scancode>=<keycode名>)で解決できる
  • キーコード名は /usr/include/linux/input-event-codes.hKEY_* から KEY_ を除いた小文字。JIS Mac 風に「かな/英数」にしたければ katakanahiragana / muhenkan なども指定できる

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です



※画像をクリックして別の画像を表示

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください