Windows Subsystem for Linux 2 (WSL2)でGUIプログラムを実行する

Windows Subsystem for Linux 2 (WSL2)でGUIプログラムを実行する

WSL2のUbuntu 20.04でGUIを描画する設定についてメモしておきます。

WSL2でGUIアプリを開発したいときってありますよね。結論としては、Windows側にXserverのインストールが必要になります

今回想定する環境は、Windows10 + WSL2 (Ubuntu 20.04)です!

描画方法の概要(WSLとWindowsの関係)

多くのLinuxではX Window Systemを利用してGUIを実現しているので、WSL上でもこれを利用します。

X Window Systemとは

X Window Systemとは(XとかX11とか呼ばれたりする)、Unix系OSで利用されているクライアントサーバ型のウィンドウシステムのことです。

ディスプレイへの入出力(Xサーバ)と、ソフトウェアの実行(Xクライアント)を分離し、サーバクライアント間でXプロトコルと呼ばれる独自通信規格でデータのやり取りを行います。

WSL上のアプリケーションからWindows上でGUIを描画するときは、XサーバをWindows上にインストールし、WSLをXクライアントとして扱うことになります。

この記事では、WindowsにインストールするXサーバとして有名なVcXsrvを利用します。

WSL上でGUIプログラムを実行する手順

それでは手順を説明します。

Windows10にVcXsrvをインストール

まず、Windows10にXserverをインストールします。

ダウンロードはこちら からです。インストールは特に難しいことがないので、素直に指示に従って進めてください。

オプションをつけてVcXsrvを起動

Windowsボタンを押して”xlaunch”と検索して、XLaunchアプリを起動しましょう。

起動した後は、下記の表を参考に設定値を書き換えてください。

Select display settings
  • Multiple windowsにチェック
  • Display number: 0(-1でもよい)
Select how to start clients
  • Start no clientにチェック
Extra settings
  • ClipboardとNative openglにチェック
  • Additional parameters for VcXsrvに「-ac」を追加

Extra settingsの画面での”-ac”オプションはアクセス制限を無効化するオプションです。

アクセス制限を無効化することでWSLからWindows10のXサーバにアクセスすることが可能になります。

他のオプションを確認したい場合はこちらで確認できます。。

WSL(Ubuntu)にDISPLAY環境変数を設定

Xクライアント(Ubuntu)がXサーバ(Windows10)の場所を知るために、Ubuntu側で環境変数を設定します。

.bashrcや.zshenvに下記を追加してファイルを読み込んでください。

export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk ‘{print $2}’):0

上記のコマンドでDISPLAY環境変数にx.x.x.x:0が定義されます。

x.x.x.xは、UbuntuのIPアドレスです。WSL2では起動のたびにIPアドレスが変更されるので、上記の設定を追加することでIPアドレスの変更に動的に対応しています。

x.x.x.x:0の”:0″は、VcXsrvの起動時に設定したDisplay numberです。適宜環境に合わせて修正してください。

プログラムの実行

あとはWSL2上のubuntuからプログラムを普通に実行するだけです。

試しにxeyesを実行してみましょう。下記を実行して、ウィンドウが表示されればOKです。

$ sudo apt install x11-apps
$ xeyes

トラブルシューティング

xeyesが起動できない:Error: Can’t open display: :0.0

xeyesコマンドで下記のエラーを取得した場合、Windows Deffenderのファイアウォールの設定が原因名可能性があります

$ xeyes
Error: Can't open display: <ip address>:0.0

この現象はWSLのgithubのissueで議論されています。

Issueを要約すると、WSLからローカルのVcXsrvに接続するときは、パブリックネットワークに対するファイアウォールを許可しなければならないということです。

上記のissueに解決策が数個提案されていますが、一番簡単なのはVcXsrvに対してパブリックネットワークのアクセスを許可してしまうことです。セキュリティ的にはよろしくないですが、とりあえず急ぎで使いたい場合はそれでよいと思います。

ファイアウォールの設定については別の記事にまとめてようと思います。

追記(2021/01/29):pipコマンドが遅くなる場合

上記のDISPLAY変数を設定するとpipコマンドが遅くなる現象が発生する可能性があります。

解決する方法について記事を書いたので、もし同じ現象になった場合は下記を参考にしてください。

まとめ

Windows10のWSL2のUbuntuで、GUIを利用するプログラムの実行方法についてまとめました。

XserverのソフトであるVcXservをインストールして、Ubuntu側に環境変数を設定するだけです。

WSLはどんどん便利になっている気がしますね。

ちなみに、XクライアントとXサーバの通信はXプロトコルと呼ばれる独自の通信規約が利用されており、XクライアントとXサーバは同じコンピュータでも動作するし、別々のコンピュータでも動作します。

つまり、ネットワーク越しにXクライアントとXサーバをつなげることができるという訳です。

いつかこの辺りを記事にしたいと思います。

2 COMMENTS

現在コメントは受け付けておりません。