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とかX11とか呼ばれたりする)、Unix系OSで利用されているクライアントサーバ型のウィンドウシステムのことです。
ディスプレイへの入出力(Xサーバ)と、ソフトウェアの実行(Xクライアント)を分離し、サーバクライアント間でXプロトコルと呼ばれる独自通信規格でデータのやり取りを行います。
WSL上のアプリケーションからWindows上でGUIを描画するときは、XサーバをWindows上にインストールし、WSLをXクライアントとして扱うことになります。
この記事では、WindowsにインストールするXサーバとして有名なVcXsrvを利用します。
WSL上でGUIプログラムを実行する手順
それでは手順を説明します。
まず、Windows10にXserverをインストールします。
ダウンロードはこちら からです。インストールは特に難しいことがないので、素直に指示に従って進めてください。
Windowsボタンを押して”xlaunch”と検索して、XLaunchアプリを起動しましょう。
起動した後は、下記の表を参考に設定値を書き換えてください。
- Multiple windowsにチェック
- Display number: 0(-1でもよい)
- Start no clientにチェック
- ClipboardとNative openglにチェック
- Additional parameters for VcXsrvに「-ac」を追加
Extra settingsの画面での”-ac”オプションはアクセス制限を無効化するオプションです。
アクセス制限を無効化することでWSLからWindows10のXサーバにアクセスすることが可能になります。
他のオプションを確認したい場合はこちらで確認できます。。
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サーバをつなげることができるという訳です。
いつかこの辺りを記事にしたいと思います。
[…] 自分はVcXsrvを利用しているので、Windows側でVcXsrvを起動してWSL2上でpip listを実行してみます。(こちらでWSL2でVcXsrvと連携する方法についてめとめています) […]
[…] VcXsrv セットアップ手順 […]