WSL+Xming環境整備

WSLとXmingを組み合わせていい感じに環境整備できてきたので記録をとる。

WSLとXmingについて

  • WSLはWindows上でLinuxのプロセスを実行する機能である。互換性は完全ではないが、多くのソフトウェアが動くようになっている。ただし、そのままではGUIは動かない。
  • XmingWindows上で動作するXサーバーのうちの一つ (Cygwin/Xの派生) である。XはLinuxで使えるGUIの仕組みで、画面側がXサーバー、アプリ側がXクライアントとなってTCP経由で接続できるという特徴がある。ここではWSL側をクライアントにしてXmingに繋ぐことで、GUIを使えるようにする。

Xming最新版の取得

Xmingの最新版のビルドを入手するには£10.00程度の寄付が必要である。多くの人は2007年(!!!)のバージョンを使っている。そういうわけなので巷の評判は気にせず最新版を入手するといいと思う。 (たとえば、勝手に英語キーボード設定になる問題には今のところ遭遇していない)

同ページの寄付に関するセクションに詳しい説明がある。以下は勝手に翻訳したもの

寄付をすると、ドナーパスワードがメールで送られます。それを使うことで、XmingのWebリリース版と開発スナップショット版を個人利用のために取得することができます。パスワードは、PayPalの支払い履歴に記載されているメールアドレスに対して送られます。そのため、支払いメールアドレスが有効なメールアドレスであることと、私のISPのメールサーバー ([WWW]zen.co.uk 、例えば smarthost01.mail.zen.net.uk) をブロックしていないことを確認しておいてください。寄付以外の方法(コードやパッチなど)で貢献をした場合や、パスワードが送られてこない場合は、私に連絡をしてください。また、PayPalを使えず、代替手段が必要な場合も、私にメール (訳注: ここにメールアドレスが書いてあります) で連絡をしてください。寄付金額として10ポンドを提案していますが、これより低い金額だと手数料の割合が高くなってしまうからです。注意: 上のボタンを経由してPayPalで支払いをする場合、PayPalのアカウントは必要ありませんが、クッキーを有効にする必要があります。

寄付はPayPal経由と書いてあるが、PayPalは日本からの寄付を許可していない(おそらく法的な理由)。その場合は上にあるように作者にメールをするとよい。以下は筆者の送ったメールの例

Subject: Want to donate from Japan

Text:

I want to donate to Xming from Japan, from which I can’t donate money via PayPal due to legal reasons. Could you offer alternatives if any?

Masaki Hara

すると代替手段を教えてもらえる。筆者は、作者からPayPalの支払いリンクを送ってもらう方法(日本から寄付はできないが、支払いはできる)を選んだ。

Subject: Re: Re: Want to donate from Japan

Text:

Thank you! Can I receive a payment link then?

しばらくするとPayPalの支払いリンクを送ってもらえるので、それに対して£10.00支払うと、パスワードが送られてくる。

Xmingのインストール

今回はWSLから呼び出す形での利用のみを想定しているのでPuTTY連携は考えない。そのため以下の2つをインストールする。

Xming-fontsはXming-x64のあとにインストールする。逆順にすると C:\Program Files (x86)\Xming にインストールしようとしてしまう。

ちなみにこのXming-fontsだが、ほぼEmacs用である。GTKやQtなどで作られているGUIアプリはクライアント側(Linux側)のフォントを参照するからである。

Xmingの起動

はじめはXming Launchなどを使って起動してみるとよいが、オプションがわかってしまったあとはショートカットを作るほうが楽だ。

"C:\Program Files\Xming\Xming.exe" :0 -clipboard -multiwindow -xkbmodel jp106 -xkblayout jp -dpi auto -wgl へのショートカットを作成した。

  • :0 は画面の番号で、これに6000を足したTCPポートで通信が行われる。
  • -clipboard によりWindows側のクリップボードと共有する。
  • -multiwindowXmingのモードの一つで、Linux側のウインドウ1個がWindows側のウインドウ1個に対応する。
  • -xkbmodel jp106 -xkblayout jp は日本語キーボード配列を指定している。
  • -dpi autoWindows側のDPIを継承する。筆者のコンピューターはNew Surface Proで、高DPI環境だが、この設定だけでかなりうまく設定される。
  • -wglOpenGLアクセラレーションを有効化する。

WSLの設定 (Ubuntuのインストール)

Bash on Ubuntu on Windowsをインストールしてみよう! - Qiita」に従ってWSLを設定した。WSLの上では他のディストリビューションも動かせるが、ここではUbuntuを仮定する。

Xfce4のインストール

bash.exeを起動して xfce4-sesson, xfce4-goodies, gnome-keyring, fonts-vlgothic, fcitx-skk をインストールした。 (ここで日本語フォントを入れておかないと、Xming-fontの有無に関係なく日本語が化けて困ることになる)

起動スクリプトの作成

以下のような内容のスクリプトを /home/qnighy/Xming.sh に置いた。

#!/bin/bash

# ホームから開始したいので
cd
# パーミッション777のファイルが量産されると困るので
umask 0022
# localhost:0.0の略で、これでXmingに繋がることになる
export DISPLAY=:0.0
# 必ずXming経由でOpenGLを使う
export LIBGL_ALWAYS_INDIRECT=1

# gnome-keyringをスタート (SSH鍵を覚えさせたいので)
eval $(gnome-keyring-daemon --start --components=pkcs11,secrets,ssh)
export GNOME_KEYRING_CONTROL SSH_AUTH_SOCK

# インプットメソッドの設定 (fcitxの場合)
IM=fcitx
export XMODIFIERS="@im=$IM"
export GTK_IM_MODULE=$IM
export QT_IM_MODULE=$IM
export NO_AT_BRIDGE=1
# 全角/半角キーが連打される例のやつを防ぐ
xset -r 49
# fcitxを起動
fcitx

# SHLVLを0に下げてからターミナルを起動
SHLVL=0 xfce4-terminal

bash.exe -l /home/qnighy/xming.sh のように実行するとターミナルが出てくる。やっほい

ショートカットの作成

bash.exeを黙らせたいので、無言で実行するためのユーティリティーを導入する。

The Run utilityからrun-x64.zipをダウンロードして、中にあるrun.exeC:\Windows\System32\にコピーする。 (Xmingの作者が作っている模様)

その後、 C:\Windows\System32\run.exe C:\Windows\System32\bash.exe -l /home/qnighy/xming.sh に対してショートカットを作成する。

アイコンをいい感じにする

Xmingの作るウインドウは、極力Linux側のアイコンを反映するが、上手くいかないことがある。特にxfce4-terminalは上手くいかなかったので、手動で設定する。

まず imagemagick を入れて、以下のようにしてicoファイルを作成する。

convert /usr/share/icons/elementary-xfce/apps/*/xfce-terminal.png xfce-terminal.ico

同じ方法で色々なアイコンをicoに変換できる。

作ったicoWindows側に置く。まずショートカットが不恰好なのでショートカットのアイコンに設定する。

続いてXmingrcをいじる。Xmingrcのデフォルト設定は C:\Program Files\Xming\Xmingrc にあるので、これを C:\Users\qnighy\Xmingrc にコピーする。

# Xming Server Default Resource File
# follow.exe and xhost.bat are in "Tools and clients"
Menu apps {
    "&View the log" viewlog
    "&Tail the log" execd follow
    "&Reload Xmingrc" reload
    &Usage execd "Xming :999 -help"
    "Access Control &Status" execd "xhost.bat"
    "&Command Prompt" execd cmd
    "Host &Finder" finder
    separator
}
RootMenu apps
SilentExit
Debug "Using the default Xmingrc configuration file."

これを弄って以下のようにした。

# Xming Server Default Resource File
# follow.exe and xhost.bat are in "Tools and clients"
Menu apps {
    "&View the log" viewlog
    "&Tail the log" execd follow
    "&Reload Xmingrc" reload
    "&Usage" execd "Xming :999 -help"
    "Access Control &Status" execd "xhost.bat"
    "&Command Prompt" execd cmd
    separator
}
RootMenu apps
SilentExit
Icons {
    # アイコンを上書き
    xfce4-terminal C:\Users\qnighy\xfce-terminal.ico
}

こうするとウインドウクラスかウインドウ名がxfce4-terminalであるようなウインドウには、指定したアイコンを使うようになる (Xmingrcの説明も参照)

ところで、ウインドウクラスを調べるには xprop コマンドを使う。 xprop を実行したあと、調べたいウインドウをクリックすると、以下のように色々な属性が表示される。

$ xprop
_NET_WM_STATE(ATOM) = 
_NET_WM_USER_TIME(CARDINAL) = 3901640
_WINDOWSWM_NATIVE_HWND(INTEGER) = 328280, 0
WM_STATE(WM_STATE):
        window state: Normal
        icon window: 0x0
WM_HINTS(WM_HINTS):
        Client accepts input or input focus: True
        Initial state is Normal State.
        window id # of group leader: 0xe00001
XdndAware(ATOM) = BITMAP
_MOTIF_DRAG_RECEIVER_INFO(_MOTIF_DRAG_RECEIVER_INFO) = 0x6c, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0
WM_WINDOW_ROLE(STRING) = "xfce4-terminal-1506224785--565597661"
_NET_WM_SYNC_REQUEST_COUNTER(CARDINAL) = 14680070
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_NORMAL
_NET_WM_USER_TIME_WINDOW(WINDOW): window id # 0xe00005
WM_CLIENT_LEADER(WINDOW): window id # 0xe00001
_NET_WM_PID(CARDINAL) = 20
WM_LOCALE_NAME(STRING) = "ja_JP.UTF-8"
WM_CLIENT_MACHINE(STRING) = "qnighy-chris"
WM_NORMAL_HINTS(WM_SIZE_HINTS):
        user specified size: 362 by 0
        program specified minimum size: 93 by 116
        program specified resize increment: 19 by 38
        program specified base size: 17 by 40
        window gravity: NorthWest
WM_PROTOCOLS(ATOM): protocols  WM_DELETE_WINDOW, WM_TAKE_FOCUS, _NET_WM_PING, _NET_WM_SYNC_REQUEST
WM_CLASS(STRING) = "xfce4-terminal", "Xfce4-terminal"
WM_ICON_NAME(STRING) = "Terminal - xprop"
_NET_WM_ICON_NAME(UTF8_STRING) = "Terminal - xprop"
WM_NAME(STRING) = "Terminal - xprop"
_NET_WM_NAME(UTF8_STRING) = "Terminal - xprop"

このうち WM_CLASS と書かれているものがウインドウクラスにあたる。はじめから xprop | grep WM_CLASS とやると楽かもしれない。

困っていること

  • dbusがうまく動かない。redditとかに色々書いてあるけど手元ではまだ動いていない。
  • OpenGLで複雑なことをしようとすると厳しい。なぜかGLSLのコンパイルが通らない。
  • 他にも変なシステムコールは通らないので、そういうことをやるときは仮想マシンを立ち上げる。