3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(Solaris)構築したSunRayサーバで変換,無変換キーなど一部のキーが効かない

Solaris10でSunRayサーバを一から構築したのですが、キオスクモードでWindowsターミナルサーバへ接続しているユーザーから、"無変換","変換"キーが効かないとの問い合わせがありました。 さらに、"カタカナひらがな"キーが変換キーを押下した時と同じ挙動になっているようです。

ベンダーが構築したSunRayサーバーはそんなこと無いので、違いを調査してみました。

まず、X Windows上で問題となっているキーを使ってみましたが、正常なサーバ、異常なサーバとも動きに差異はありませんでした。

Unixにはキーコード(keycode)とそれに対応する論理的な識別子(keysym)を設定できるところがあります。
以下コマンドで、両者の設定を比較してみました。

# xmodmap -pke

差分は以下の行だけでした。

・正常なサーバ
keycode 113 = Alt_R Alt_R

・問題発生のサーバ
keycode 113 = Alt_R Mode_switch

右Altキーだけの違いだけで、これが原因という感じでなさそうでした。

次に、"無変換","変換"キーを押下した時に、どんなkeycodeとkeysymが流れているのかを確認することにしました。xevを使うと、キー押下情報やマウス移動情報を取得できます。

X Window のコンソールでで以下のコマンドを実行します。

 /usr/openwin/demo/xev

小さなウィンドウが立ち上がるので、そのウィンドウをアクティブにし、キーを押下します。

正常なサーバーでは以下のとおりでした。

無変換キー  : keycode 146 , keysym 0xff62 Execute
変換キー    : keycode 145 , keysym 0xff21, Kanji
カタカナキー: keycode 143 , keysym 0xff7e Mode_switch

しかし、問題が発生しているサーバでは以下の結果となりました。

無変換キー  : keycode 139 , keysym 0xff62 Execute
変換キー    : keycode 138 , keysym 0xff21 Kanji
カタカナキー: keycode 129 , keysym 0xff2d Kana_Lock

システムが捉えているkeycodeが異なります。

ということは、キーボードの物理設定あたりか?と思い、キーテーブルを見てみました。 差異があったので、以下のように変更してみました。

cd /usr/openwin/share/etc/keytables
cp keytable.map keytable.map_bk20150406

vi keytable.map 

#
# Type 6 Keyboards (USB Keyboards)
#
6       0       US6.kt
  ↓
#
# Type 6 Keyboards (USB Keyboards)
#
6       0       Japan7.kt

で保存

cp xkbtable.map xkbtable.map_bk20150406
vi xkbtable.map

#
# Type 6 USB Keyboards
#
6       *       sun/all(US6_usb)                type6_usb       us

  ↓

#
# Type 6 USB Keyboards
#
6       *       sun/all(Japan7_usb)             type7_usb       jp

で保存

これで再ログインしてみましたが、変化なしです。

ググっているとDocumentation Home > Solaris 10 ご使用にあたって > 付録 C 日本語環境に関する情報というページを見つけました。

どうやらバグのようです。
パッチが必要なようで、ダウンロード使用としましたが、Oralceとのサポート契約がきれており、ダウンロード出来ませんでした。

なので、上記ページに書いている回避策を実行しました。

rootユーザでログインします。

cd /
vi .dtprofile

末尾に以下のように追加しました。

#
# Japanese 106 on Xorg
#
xmodmap -e "keycode 49 = Henkan_Mode"
xmodmap -e "keycode 129 = Kana_Lock"
xmodmap -e "keycode 138 = Kanji"
xmodmap -e "keycode 139 = Execute"
xmodmap -e "keycode 113 = Alt_R"
#
# Japanese 106 on Xsun
#
#xmodmap -e "keycode 60 = Henkan_Mode"
#xmodmap -e "keycode 143 = Mode_switch"
#xmodmap -e "keycode 145 = Kanji"
#xmodmap -e "keycode 146 = Execute"
#xmodmap -e "keycode 237 = Alt_R"
#xmodmap -e "remove Mod2 = Alt_R"
#xmodmap -e "add Mod2 = Mode_switch"

これでも現象改善されません。

途方に暮れていると、Using Sun Rays with non-standard keyboards (Think Thin)という記事を見つけました。 記事本文の内容は、上記で書いている keytable.map , xkbtable.map を変更する内容と同じです。 この記事のコメントに、以下の書き込みがありました。

going ahead in our kiosk problem we found that, after modifying the 2 files as you suggested, we need also to disable the XKB extension entering the following command: utxconfig -a -k off

どうやらキオスクモードでこのキーボード問題を解決するには、XKB拡張(X KeyBoard extension)を無効にする必要があるようです。
この設定をSunRayDTUに適用するには、コメントにあったように以下のコマンドを実行します。

# /opt/SUNWut/bin/utxconfig -a -k off
Xconfig record added/changed.

-aは全DTUに、-k off がXKB拡張無効を意味するようです。

この設定を適用してから後のセッションでWindowsConnectorを使ってターミナルサーバに説属すると 変換、無変換、カタカナひらがなキーが効くようになりました。 (ちなみに、keytable.map , xkbtable.mapへの変更や、/.dtprofileを直さなくても、XKB拡張を無効にするだけでうまくいきました)

参考:
uttsc WindowsConnectorの引数の説明。
4.1. Sun Ray Software コマンド
Sun Ray Server Software 4.1 リリースノート P9あたりに[キーボードの問題]として、utxconfig -k offの話が出ています。やはりバグ?
Lubuntuのキーボード配列設定:xmodmap あまり本題と関係無いですが、Linux環境におけるxmodmapやxkbの話。