VNC経由でKVMのkeymapがおかしなことになる件

Windows等のVNCクライアントから、ホストOSのvncserverにつないで、そこからさらにvncviewerでゲストOSのVNCサーバ(libvirtが動かしてると思われるgtk-vncなるもの?)に接続したときに、":(colon)"が"*(asterisk)"になったり、とにかくキーマップが壊れる現象が毎回起こっていた。
http://www.greedy.jp/blog/nowhereman/200911/09/111248
http://www.nucl.phys.titech.ac.jp/~kenichi/xkeymap.html
以上の2箇所を見ながらうんうんうなること数日、やっと解決を見た。

# setxkbmap -print
XKB extension not present on :2.0

XKBが何かわからないが、どうもX.orgを立ち上げるときに読み込まれる、キーボードの扱いを標準化したような機能らしく、
これがVNCの起動時に有効になってないことが原因で、
手動でvncserverと打とうが、serviceとして起動させようが関係なくおかしくなっていたようだ。

回避方法は以下の通り。

  • vncserverの立ち上げ時(X.orgの設定が読まれるタイミング?)にXKBが有効化されるよう指定する
/etc/sysconfig/vncserversの、起動オプションを指定する箇所に
  +kb
と付け足してやる。
例) VNCSERVERARGS[2]="-geometry 1024x768 -nohttpd +kb"

まずこれでvncserverがXKBの機能を使うようになる。
すでにサービスとして動かしている場合は、

# service vncserver restart

等が必要になるだろう。
サービスとして動いてない場合はどうなるかよくわからないけど、何とかしてvncserverのバイナリに"+kb"の引数を渡してやるのだろう。

  • setxkbmapコマンドでXKB自体の設定を日本語キーボード向けに変える

うちのサーバの場合、英語っぽい設定になっていたようなので、

# setxkbmap -rules xorg -model jp106 -layout jp

を実行してやった。

# setxkbmap -print
xkb_keymap {
        xkb_keycodes  { include "xfree86(jp106)+aliases(qwerty)"        };
        xkb_types     { include "complete"      };
        xkb_compat    { include "complete"      };
        xkb_symbols   { include "pc(pc102)+jp(latin)+jp:2"      };
        xkb_geometry  { include "pc(jp106)"     };
};

以上の2つの設定で、上述の症状は改善された。
ポイントは、VNC接続でホストOSのデスクトップを表示させて、さらにそこからVNCクライアントを立ち上げたときにキーボード設定がうまく渡されて無かったということ。

/usr/share/X11/xkb