VMWareでのFreeBSD 9.3のX Window環境セットアップ

6月くらいに、JIRAをFreeBSDで動かしてみようと思って、以前と同じ要領で、当時、バージョン番号の末尾が0のものを除いた最新のFreeBSD 9.2をVMWare 5.5にインストールしたが、rxvtで日本語が表示されなくて、苦労することがあった。
結局、それは解決したのだが、その頃にはFreeBSD 9.3が出ており、折角なのでそれをセットアップしようと思い、sysinstallコマンドからPackagesをインストールしようとすると、"Unable to get packages/INDEX file from selected media."というエラーになり、右往左往してしまった。FreeBSD 9.3/10.0からpackagesの管理システムが"pkgng"に変わったことに関係しているらしい。
筆者は近年、FreeBSDの新たなバージョンをインストールする度に、必ず何かにつまずいている。最近の動向にキャッチアップする努力をせずに過去の環境に固執しているのが原因であり、色々情報を漁ればもっと便利な環境が手に入るとは思うのだが、今回も、とりあえず必要だった最低限の情報をまとめる。

●VMWareにてFreeBSD 9.3のX Window立ち上げまでにやったこと

  1. FreeBSD 9.3をインストール後、コマンドラインからパッケージをインストール
    pkg install open-vm-tools xf86-video-vmware xf86-input-vmmouse xorg-minimal
  2. /etc/rc.confに以下を追加して再起動
    hald_enable="YES"
    dbus_enable="YES"
    vmware_guest_vmblock_enable="YES"
    vmware_guest_vmhgfs_enable="YES"
    vmware_guest_vmmemctl_enable="YES"
    vmware_guest_vmxnet_enable="YES"
    vmware_guestd_enable="YES"
    ※再起動しなくても
    foreach s (hald dbus vmware-kmod vmware-guestd)
    service $s start
    end
    とすれば良いのだが、起動時にそれらが自動的に起動されることを確認するために再起動した。
  3. /usr/local/etc/hal/fdi/policy/x11-input.fdi を以下の内容で作成し、service hald restart
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <deviceinfo version="0.2">
     <device>
      <match key="info.capabilities" contains="input.keyboard">
       <merge key="input.x11_options.XkbRules" type="string">xorg</merge>
       <merge key="input.x11_options.XkbModel" type="string">jp106</merge>
       <merge key="input.x11_options.XkbLayout" type="string">jp</merge>
       <merge key="input.x11_options.XkbOptions" type="strlist">terminate:ctrl_alt_bksp</merge>
       <append key="input.x11_options.XkbOptions" type="strlist">ctrl:nocaps</append>
      </match>
     </device>
    </deviceinfo>
    
    参考:/usr/local/share/hal/fdi/policy/10osvendor/10-x11-input.fdi
    反映を確認するには、lshalを実行する
  4. /etc/X11/xorg.confの作成
    Xorg -configure
    /root/xorg.conf.newを開き、Depth 24の所に
    Modes "1024x768"
    を追加してデフォルトの解像度を変更し、
    mv /root/xorg.conf.new /etc/X11/xorg.conf
  5. /etc/hostsにhostnameを127.0.0.1として追加
    (無いと、xauthがbad display name "...:1"というエラーになる)
  6. テスト実行
    上の組み合わせではxtermやtwmがインストールされないので、いずれ必要になりそうな、代わりのものをインストールする
    pkg install rxvt-unicode
    pkg install open-motif # mwmを含む
    ~/.xinitrcを次の内容で作成し、startx
    nohup vmware-user-suid-wrapper 2>&1 > /dev/null &
    mwm &
    exec urxvt
  • 日本語キーボード対応になってること
  • マウスカーソルがシームレスに動くこと
  • Windowsとクリップボードを共有できること
  • Ctrl+Alt+Backspaceが効くこと
  • Caps Lockは効かないこと
を確認

なお、FreeBSD 9.2のPackagesでopen-vm-toolsをインストールするとvmware-toolboxコマンドがインストールされたのだが、9.3でpkgngでインストールすると、vmware-toolboxコマンドが見当たらない。
しかし、仮想ディスクのshrinkくらいにしか使ってないし、それも

vmware-toolbox-cmd disk shrink /
とすればできるので、それほど困らない。

なお、open-vm-toolsのファイル共有機能は、kernel panicになることが知られているが、筆者の環境でも確かにkernel panicになったので、諦めてSambaをインストールした。

【12/30追記】
この記事を書いた当時は、このようにfdiファイルを用意すれば日本語キーボード(jp106)の設定になっていたのだが、今日、pkg upgradeすると、これでは日本語キーボードにならなくなった。
原因はよくわからないが、とりあえず

setxkbmap -layout jp -model jp106
とすると日本語キーボードになるようなので、これを~/.xinitrcに書けば良さそうである。

●Xorgの日本語環境のセットアップ

まず、日本語フォントであるが、

pkg install ja-font-std
とすると、大体足りる。しかし、筆者はxlsfontsとやってcourierとかlucidaとかtimesとかが出て来ないと不安だったり、rk24の大ファンだったりするので、
pkg install xorg-fonts
ともする。

urxvt(rxvt-unicode)で日本語を表示するには、

setenv LANG ja_JP.UTF-8
又は、bashの場合や.xinitrcに書く場合は
export LANG=ja_JP.UTF-8
とした後に、urxvtを起動すれば良い。urxvt起動後に行うのは無効である。

urxvtのフォントを変更するには、引数-fnで指定するか、Xリソースにて指定する。
例えば、このようにする。

urxvt -fn rk24 &
XFTのフォント名も使用可能である。XFTのフォント名一覧はfc-listコマンドで取得できる。
urxvt -fn 'xft:terminal, xft:M+2VM+IPAG' &
urxvt -fn 'xft:IPAGothic:size=12' &
良いのが決まったら、Xリソースに登録する為、~/.Xdefaultsか、xrdbを使っている場合は~/.Xresourcesに書いておく。
urxvt.font: xft:IPAGothic:size=12
なお、こういう書式とか(並べされたフォントが順に検索される)、
urxvt.font: xft:terminal, xft:IPAGothic:size=14
こういう書式もある。
urxvt*font:\
  [codeset=ISO8859]x:-*-*-*,\
  [codeset=JISX0201]x:-*-*-*,\
  [codeset=JISX0208]x:-*-*-*
この辺りの書式は、man urxvt に書かれている。

本記事の冒頭で、rxvtで日本語表示ができないと悩んだのは、以前のFreeBSDにはja-rxvtというpackageがあり、それをインストールするとrxvtで日本語が表示できていたのだが、9.xではja-rxvtが無くなっており、それに気付かずに普通のrxvtを入れていた(元々rxvtは日本語表示ができない)のが原因だった。

なお、ktermは、-kmオプションやXリソースのkanjiModeでeucやsjisやutf-8を指定しないと、ロケールに関係なく、JISコードの日本語テキストしか表示されない。これまであまり意識してなかったのだが、今回はこれを忘れて、ど壷にはまってしまった。
rxvtでもktermでも日本語が表示されないので、フォントかロケールに問題があるのだと思い、あらぬ方向に莫大な時間を使い、無駄にしてしまった。
rxvt/urxvtで日本語が表示されて以来、ktermは必要なくなったが、nkfとかが無くてもShift-JISのテキストファイルが表示されたりするので、使い道はあるのかも知れない。

筆者は過去のある時点からkinput2の設定がうまくできなくなり、それ以降、over-the-topな日本語入力FEPを使わず、X Windowでの漢字変換は全てEmacs+anthy.elで行っていたのだが、今回、ibus-anthyというのを使ってみた。

pkg install ibus-anthy
Xを起動し、ibus-setupすると、次の環境変数を$HOME/.bashrcへ追記しろと出てくるが、bashは使ってないので、.xinitrcに追記する。
export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODULE=xim
ついでに、次の、ibus-daemonを起動するコマンド等も追記しておく。
export XIM=ibus
export XIM_PROGRAM="ibus-daemon"
export XIM_ARGS="-r --daemonize --xim"
${XIM_PROGRAM} ${XIM_ARGS}
Xを再起動し、再度ibus-setupを起動し、
  • キーボードショートカットにShift+spaceを追加
    (kinput2時代からの定番キーだから。デフォルトの<Super>spaceとはWindowsキー+spaceのことらしい)
  • 「インプットメソッド」として「日本語 - Anthy」と「英語 - English(international AltGr dead keys)」を追加
とすると、Shift+spaceで日本語入力モードと英語入力モードが切り替わるようになる。

さて、FreeBSD 9.2でインストールするとibus-1.4.1だったのだが、9.3ではibus-1.5.5になった。このibus-1.5というのが、すこぶる評判が悪いのだが、筆者も、非常に使いづらいと思った。
まず、上記の、日本語モードと英語モードが切り替え可能な状態にするのに、かなり手間取った。ibus-1.4だと「インプットメソッド」に「日本語 - Anthy」を足すだけで良かったのに、ibus-1.5だと、それだとショートカットキーを押しても英語入力モードに戻らなくなった。
さらに、日本語入力モードにした時に現れる入力バーがバグっている。ibus-1.4だと

こんな感じのバーだが、ibus-1.5だと

こうなる。しかも勝手に消えるので、今が日本語入力モードなのかどうかがわからなくなる。
設定方法を調べようという意欲が削がれるのに十分な悪印象である。
FreeBSD 9.2で使い始めて間もないが、もうibusを触るのが嫌になった。

本格的なデスクトップ環境が必要になるまでは、Emacs+anthy.elで頑張ることにする。

参考リンク 404 Blog Not Found:備忘録 - FreeBSD 10 あれこれ


●VMWareでX Window表示中にCtrl+Alt+Shift+F1が効かなくなった

筆者はrootでの作業はコンソール画面で行う方が落ち着くので、X Window表示中によくCtrl+Alt+F1〜F6でコンソール画面に切り替える癖がある。Xがクラッシュしても作業が中断されないのは安心であるし、sysinstallのようなカラフルなコンソールアプリはコンソール画面の方が見やすい。
VMWareでX Windowを実行している場合、以前はFreeBSDでもLinuxでも、XFree86でもXorgでも、Ctrl+Alt+F1は効かなくてもCtrl+Alt+Shift+F1は効いていた(FreeBSD 7.3/8.3で確認)のだが、FreeBSD 9.2/9.3ではいずれも効かなかった。

Ctrl+Alt+Shift+F1が効いているFreeBSD 8.3とxorg.confの設定を同じにしても、解決しなかった。(Section "ServerFlags"にてOption "DontVTSwitch" "on"としているとコンソールへの切り替えが無効になる)
xevで見る限り、Ctrl+Alt+Shift+F1が順番に押されるまでのキーイベント発生の様子は、8.3と9.3とで全く同じだった。Ctrl+Alt+F1と押した時に、F1のKeyPress eventが発生しないのも同じだった。
open-vm-toolsが悪さをするという情報もあったが、/etc/rc.confでそれらをoffにして再起動しても変わらなかった。

そもそも、VMWareでCtrl+Alt+F1が効かないのは、Ctrl+Altが、入力デバイスをホストマシンに切り替えるキーとしてVMWareに処理されるからである。このCtrl+Altは別の組み合わせに変更することができるようで、例えば、ホストマシンの%USERPROFILE%\Application Data\VMware\preferences.ini に

pref.hotkey.shift = "true"
pref.hotkey.control = "true"
pref.hotkey.alt = "true"
を足すと、Ctrl+Alt+Shiftでホストマシンに戻るようになり、8.3でも9.3でも、X WindowでCtrl+Alt+F1を押すとコンソール画面が切り替わるようになった。
これは1つの解であるが、筆者はVMWareを複数のマシンで複数の用途に使用しているので、あまりVMWareの設定を変えることはしたくない。

Webの情報を探していると、別の解として、「Ctrl+Altを押したまま、Spaceを押して離し、F1を押す」という方法があることがわかり、これだと8.3でも9.3でもコンソール画面に切り替わった。VMWareを使う上では、ゲストマシンへのCtrl+Alt+??の与え方は、このようにCtrl+Alt+(SPC,??)と操作するのが正しいようだ。Ctrl+Alt+Shift+??で代用できたのが、たまたまだったのである。

しかし、xmodmap -pkeの出力が8.3と9.3で異なるのが気になっていたので、もう少し調べてみた。
F1キーについて、8.3では、
keycode 67 = F1 XF86Switch_VT_1 F1 XF86Switch_VT_1 F1 XF86Switch_VT_1
なのに対し、9.3では
keycode 67 = F1 F1 F1 F1 F1 F1 XF86Switch_VT_1
であり、keysymの数からして異なる(後者は7つある)。8.3と似た設定になるように、9.3で
xmodmap -e "keycode 67 = F1 XF86Switch_VT_1 F1 XF86Switch_VT_1 F1 XF86Switch_VT_1"
とすると、Shift+F1でコンソールに切り替わるようにはなったが、依然としてCtrl+Alt+Shift+F1は効かなかった。
8.3では、
xmodmap -e "keycode 67 = F1 XF86Switch_VT_1"
とするとCtrl+Alt+F1(VMWareではCtrl+Alt+Shift+F1)が効くようになり、
xmodmap -e "keycode 67 = F1 F1"
とすると効かなくなったので、Ctrl+Alt+F1(VMWareではCtrl+Alt+Shift+F1)でkeycode 67に割り当てられた2つ目のkeysymが発生するようであったが、9.3ではCtrl+Alt+F1で7つ目のkeysymが発生するようだった。

このkeysymの並びは、man xmodmapによると、最大8つで、先頭から修飾キーなしの場合、Shiftキーの場合、Mode_switchの場合、Mode_switch+Shiftの場合、以降はX serverの実装依存で通常は使われないとあるが、8.3のF1キーに関しては、この説明の通りのShift+F1でなく、Ctrl+Alt+F1等で2つ目のkeysymが発行されていることになる。
色々勉強すると、このkeysymの並びの意味は、XKBの設定によって変わるらしいことがわかった。実際、8.3と9.3の/usr/local/share/X11/xkb/以下の内容が異なっており、このディレクトリの中身を8.3のものにすると、VMWareでCtrl+Alt+Shift+F1が効くようになった。
さらに調べると、特に/usr/local/share/X11/xkb/types/pcとxkb/symbols/srvr_ctrlが関係していることがわかった。
•8.3の/usr/local/share/X11/xkb/types/pcの一部

	    type "CTRL+ALT" {
		modifiers = Control+Alt;
		map[Control+Alt] = Level2;
		level_name[Level1] = "Base";
		level_name[Level2] = "Ctrl+Alt";
	    };
•9.3の/usr/local/share/X11/xkb/types/pcの一部
    type "CTRL+ALT" {
        modifiers = Control+Alt+Shift+LevelThree;
        map[None] = Level1;
        map[Shift] = Level2;
        map[LevelThree] = Level3;
        map[Shift+LevelThree] = Level4;
        map[Control+Alt] = Level5;
        preserve[Shift] = Shift;
        preserve[Shift+LevelThree] = Shift;
        level_name[Level1] = "Base";
        level_name[Level2] = "Shift";
        level_name[Level3] = "Alt Base";
        level_name[Level4] = "Shift Alt";
        level_name[Level5] = "Ctrl+Alt";
    };
•8.3のxkb/symbols/srvr_ctrlの一部
partial function_keys 
xkb_symbols "fkey2vt" {

    key  {
	type="CTRL+ALT",
	symbols[Group1]= [ F1,	XF86_Switch_VT_1 ]
    };
•9.3のxkb/symbols/srvr_ctrlの一部
partial function_keys 
xkb_symbols "fkey2vt" {

    key  {
	type="CTRL+ALT",
	symbols[Group1]= [ F1, F1, F1, F1, XF86_Switch_VT_1 ]
    };
そこで、9.3のそれぞれのファイルを次のように書き換えてみた所、Ctrl+Alt+F1とCtrl+Alt+Shift+F1の両方が効くようになった。
•9.3の/usr/local/share/X11/xkb/types/pcの一部
    type "CTRL+ALT" {
        modifiers = Control+Alt+Shift+LevelThree;
        map[None] = Level1;
        map[Shift] = Level2;
        map[LevelThree] = Level3;
        map[Shift+LevelThree] = Level4;
        map[Control+Alt] = Level5;
        map[Control+Alt+Shift] = Level6;
        preserve[Shift] = Shift;
        preserve[Shift+LevelThree] = Shift;
        level_name[Level1] = "Base";
        level_name[Level2] = "Shift";
        level_name[Level3] = "Alt Base";
        level_name[Level4] = "Shift Alt";
        level_name[Level5] = "Ctrl+Alt";
        level_name[Level6] = "Ctrl+Alt+Shift";
    };
•9.3のxkb/symbols/srvr_ctrlの一部
partial function_keys 
xkb_symbols "fkey2vt" {

    key  {
	type="CTRL+ALT",
	symbols[Group1]= [ F1, F1, F1, F1, XF86_Switch_VT_1, XF86_Switch_VT_1 ]
    };