WSL2のUbuntu 20.04でGUIを描画する設定についてメモしておきます。
WSL2でGUIアプリを開発したいときってありますよね。結論としては、Windows側にXserverのインストールが必要になります。

今回想定する環境は、Windows10 + WSL2 + Ubuntu 20.04です!
目次 非表示
描画方法の概要
多くのLinuxでは、X Window Systemを利用して画像を描画しています。
X Window Systemとは(XとかX11とか呼ばれたりする)、Unix系OSで利用されているクライアントサーバ型のウィンドウシステムのことです。
ディスプレイへの入出力(Xサーバ)と、ソフトウェアの実行(Xクライアント)を分離しています。
これを踏まえて、WSL上のアプリケーションからWindows上でGUIを描画するときは、下記の流れになります。
- XクライアントであるWSL2上のUbuntuから描画データをXサーバに送信
- Windows10上で動くXサーバであるVcXservがデータを受信して画像を描画
下記では、これらの具体的な設定方法を紹介します。
WSL上でGUIプログラムを実行する手順
手順は下記になります!
- VcXsrvのインストール
- オプションを付けてVcXsrvを起動
- UbuntuにDISPLAY環境変数を設定
- プログラムを実行
VcXsrvのインストール
まず、Windows10にXserverをインストールします。
ここでは有名なソフトウェアで情報も多いVcXsrvを利用します。
ダウンロードはこちら からです。インストールは特に難しいことがないので、素直に進めてください。
オプションを付けてVcXsrvを起動
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サーバにアクセスすることが可能になります。
他のオプションを確認したい場合はこちら。
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です。
※ 追記(2021/01/29):
上記のDISPLAY変数を設定するとpipコマンドが遅くなる現象が発生する可能性があります。解決する方法について記事を書いたので、もし同じ現象になった場合は下記を参考にしてください。

プログラムを実行
あとはWSL2上のubuntuからプログラムを普通に実行するだけです。
試しにxeyes
を実行してみましょう。下記を実行して、ウィンドウが表示されればOKです。
$ sudo apt install x11-apps
$ xeyes
xeyesが起動できないとき
xeyesコマンドで下記のエラーを取得した場合、おそらくWindows Deffenderのファイアウォールの設定が原因です。
$ xeyes
Error: Can't open display: <ip address>:0.0
この現象はWSLのgithubのissueで議論されています。要するに、WSLからローカルのVcXsrvに接続するときは、パブリックネットワークに対するファイアウォールを許可しなければならないという訳です。
上記のissueに解決策が数個提案されていますが、一番簡単なのはVcXsrvに対してパブリックネットワークのアクセスを許可してしまうことです。セキュリティ的にはよろしくないですが、とりあえず急ぎで使いたい場合はそれでよいと思います。
ファイアウォールの設定については別の記事にまとめてようと思います。
まとめ
Windows10のWSL2のUbuntuで、GUIを利用するプログラムの実行方法についてまとめました。
XserverのソフトであるVcXservをインストールして、Ubuntu側に環境変数を設定するだけです。
WSLはどんどん便利になっている気がしますね。
ちなみに、XクライアントとXサーバの通信はXプロトコルと呼ばれる独自の通信規約が利用されており、XクライアントとXサーバは同じコンピュータでも動作するし、別々のコンピュータでも動作します。
つまり、ネットワーク越しにXクライアントとXサーバをつなげることができるという訳です。
いつかこの辺りを記事にしたいと思います。
[…] 自分はVcXsrvを利用しているので、Windows側でVcXsrvを起動してWSL2上でpip listを実行してみます。(こちらでWSL2でVcXsrvと連携する方法についてめとめています) […]
[…] VcXsrv セットアップ手順 […]