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です!

描画方法の概要

多くのLinuxでは、X Window Systemを利用して画像を描画しています。

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

ディスプレイへの入出力(Xサーバ)と、ソフトウェアの実行(Xクライアント)を分離しています。

これを踏まえて、WSL上のアプリケーションからWindows上でGUIを描画するときは、下記の流れになります。

  1. XクライアントであるWSL2上のUbuntuから描画データをXサーバに送信
  2. Windows10上で動くXサーバであるVcXservがデータを受信して画像を描画

下記では、これらの具体的な設定方法を紹介します。

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

手順は下記になります!

  1. VcXsrvのインストール
  2. オプションを付けてVcXsrvを起動
  3. UbuntuにDISPLAY環境変数を設定
  4. プログラムを実行

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のpipが遅い!解決策と原因WSL2の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サーバをつなげることができるという訳です。

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

2 COMMENTS

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