はじめに
英語キーボード(USキーボード)が接続されたPC上のWindowsの「リモートデスクトップ接続」(mstsc.exe)からxrdpが動作するLinux環境へRDP接続する際、なぜか日本語キーボードとして誤って認識されることがあります。(Windows以外のMacやLinuxからRDP接続する場合は問題なく端末のキーボードと同じキーマップで認識される)
原因
RDP接続する際に、日本語キーボードのキーマップを参照していることが原因となります。Windowsからxrdpのログレベルをinfoにすることで、原因を確認することができます。
以下のログを見てみると、 km-e0010411.ini
あるは km-00000411.ini
がキーマップファイルとして参照されています。
[20240505-14:38:50] [INFO ] xrdp_load_keyboard_layout: model [] variant [] layout [us] options []
[20240505-14:38:50] [INFO ] Non-TLS connection established from ::ffff:192.168.1.46 port 52798: with security level : high
[20240505-14:38:50] [INFO ] xrdp_caps_process_pointer: client supports new(color) cursor
[20240505-14:38:50] [INFO ] xrdp_process_offscreen_bmpcache: support level 1 cache size 7864320 MB cache entries 100
[20240505-14:38:50] [INFO ] xrdp_caps_process_codecs: nscodec, codec id 1, properties len 3
[20240505-14:38:50] [WARN ] xrdp_caps_process_codecs: unknown codec id 5
[20240505-14:38:50] [WARN ] Cannot find keymap file /etc/xrdp/km-e0010411.ini
[20240505-14:38:50] [INFO ] Loading keymap file /etc/xrdp/km-00000411.ini
/etc/xrdp/xrdp_keyboard.ini
を参照すると、当該キーマップファイルは日本語キーボードに対応するものであることがわかります。
; A list of supported RDP keyboard layouts
rdp_layouts=default_rdp_layouts
; The map from RDP keyboard layout to X11 keyboard layout
layouts_map=default_layouts_map
[default_rdp_layouts]
rdp_layout_us=0x00000409
rdp_layout_us_dvorak=0x00010409
rdp_layout_us_dvp=0x19360409
rdp_layout_dk=0x00000406
rdp_layout_de=0x00000407
rdp_layout_es=0x0000040A
rdp_layout_fi=0x0000040B
rdp_layout_fr=0x0000040C
rdp_layout_it=0x00000410
rdp_layout_jp=0x00000411
rdp_layout_jp=0xe0010411
rdp_layout_jp=0xe0200411
rdp_layout_jp=0xe0210411
rdp_layout_kr=0x00000412
rdp_layout_no=0x00000414
rdp_layout_pl=0x00000415
rdp_layout_br=0x00000416
rdp_layout_ru=0x00000419
rdp_layout_se=0x0000041D
rdp_layout_ch=0x00000807
rdp_layout_ch_fr=0x0000100C
rdp_layout_gb=0x00000809
rdp_layout_latam=0x0000080A
rdp_layout_be=0x00000813
rdp_layout_pt=0x00000816
; <rdp layout name> = <X11 keyboard layout value>
[default_layouts_map]
rdp_layout_us=us
rdp_layout_us_dvorak=dvorak
rdp_layout_us_dvp=us(dvp)
rdp_layout_dk=dk
rdp_layout_de=de
rdp_layout_es=es
rdp_layout_fi=fi
rdp_layout_fr=fr
rdp_layout_it=it
rdp_layout_jp=jp
rdp_layout_kr=kr
rdp_layout_no=no
rdp_layout_pl=pl
rdp_layout_br=br(abnt2)
rdp_layout_ru=ru
rdp_layout_se=se
rdp_layout_ch=ch
rdp_layout_ch_fr=ch(fr)
rdp_layout_gb=gb
rdp_layout_latam=latam
rdp_layout_be=be
rdp_layout_pt=pt
手順
あまり適切な手順ではありませんが、とりあえず当該環境へ接続時にUSキーボードとして認識させたい(強制的にUSキーボードとして認識させたい)場合は、次の方法で対応が可能です。例えば、常にUSキーボードしか使わないといった場合は、この方法でも困ることはないでしょう。
なお、本設定を行うと、日本語キーボードが接続された端末の場合も、当該環境に対するRDP接続時のキーマップはUSキーボードになります。このため、日本語キーボードで当該環境へRDP接続する際は設定を元に戻す必要があります。
USキーボードとして強制的に認識させる
# cd /etc/xrdp
# mv km-00000411.ini km-00000411-org.ini
# ln -s km-00000409.ini km-00000411.ini
日本語キーボードを利用する(元に戻す)
# cd /etc/xrdp
# rm km-00000411.ini
# mv km-00000411-org.ini km-00000411.ini