xrdp のキーボード設定を解読する


xrdp をサーバに導入して、Windows マシンから接続する環境を構築したところ、キーボードが正しく認識されないトラブルに遭遇した。そのため、xrdp のキーボード設定がどのような手順で行われているのかの解読を試みた。

色々なページで、xrdp を日本語キーボード配列に対応させるため、/etc/xrdp/km-0411.ini をインストールする方法が紹介されている。ただ、本来なら、この変更は PR #194 により xrdp 本体に反映済みのはずである。しかし実際には、Debian GNU/Linux の開発版から xrdp パッケージをビルド・インストールしたところ、当該ファイル群は存在しなかった。これらのファイルが存在しない場合には、やはり設定が必要と思われる。

Remote Desktop Protocol の公式な定義内容は、Microsoft 社によって提示されている。特に、Input Capability Set が重要で、RDP クライアントはキーボードについて、以下の3種類の情報を送出することになっている。

また、接続元の Windows マシンがどのようにキーボード配列を認識しているかは、以下のレジストリを確認すれば良い。

  • HKEY_CURRENT_USER
    • Keyboard Layout
      • Preload
      • 1 - 0x00000411
      • 2 - 0xe0010411
      • 3 - 0xe0200411

はずなのだが、HHK を接続している Windows10 マシンでも 0x00000411 となっており、どうしてそうなるのか?が良く分からない。

RDP クライアントによって送出されたキーボード種別コードが、xrdp サーバによってどのように解釈されるかという情報は、/etc/xrdp/xrdp_keyboard.ini に記述されている。

; How this file works:
;   1. load the file and scan each section to find matching "keyboard_type"
;      and "keyboard_subtype" based on the values received from the client.
;      If not found, then jump to default section.
;   2. in the selected section, look for "rdp_layouts" and "layouts_map".
;      Based on the "keylayout" value from the client, find the right x11
;      layout value.
;   3. model/variant are inferred based on the "keyboard_type" and
;      "keyboard_subtype", but they can be overridden.

[default_rdp_layouts]
rdp_layout_jp=0x00000411
rdp_layout_jp=0xe0010411
rdp_layout_jp=0xe0200411
rdp_layout_jp=0xe0210411

[default_layouts_map]
rdp_layout_jp=jp

(snip)

Xサーバが、自身のキーボードをどのように認識しているかは、setxkbmap コマンドで確認できる。例えば、Debian GNU/Linux で動作している Let's Note CF-SZ6 で確認してみると、以下のような結果が得られる。

$ setxkbmap -query
rules:      evdev
model:      pc105
layout:     jp
options:    ctrl:nocaps

xrdp 上で動作している端末では、以下のような結果が得られる。

$ setxkbmap -query
rules:      base
model:      pc104
layout:     jp,us
variant:    ,

以下のように正しくレイアウトを設定すると、少なくとも「全角/半角」キーが正しく認識される。

$ setxkbmap -layout jp

なお、正しく認識されているかどうかは、xev コマンドで確認できる。

ここまで確認すると、とりあえず X のレイヤーまでのキーボード配列は正しくなっているはずである。加えて、Fcitx などの GUI フレームワークレベルの入力メソッドの設定が正しいかを確認する必要がある。Fcitx の場合、以下のように正しいキーボードが最上位に設定されていなければならない。この設定が間違っていると、X のレイヤーでは正しくキーシンボルが送出されているにも関わらず、Fcitx によって違うシンボルに変換されて、異なる文字が入力される現象が起きる。

最後に、Fcitx の起動時に、以下のようなエラーが表示されることがある。

この場合も、Fcitx の起動が不完全で、正しくキーボードが読み取られないことがあるようだ。以下の2つのコマンドを実行して、再ログインすれば回避できる。

$ rm -f ~/.mozc/.server.lock
$ rm -f ~/.mozc/.session.ipc

将来的には、TLS接続の設定も必要。