PC

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

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

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

手順は下記です。

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

※ 追記(2021/01/29):下記のDISPLAY変数を設定するとpipコマンドが遅くなる現象が発生する可能性があります。解決する方法について記事を書いたので、もし同じ現象になった場合は下記を参考にしてください。

WSL2のpipが遅い!解決策と原因

Windows Subsystem for Linux(WSL2)のUbuntu 20.04でpipコマンドの動作が非常に遅かったので、原因を調べてみました。普通のpipの速度に直せたので、修正方法と ...

続きを見る

VcXsrvのインストール

まず、Windows10にXserverをインストールします。ここではVcXsrvを利用します。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環境変数を設定

WSLのUbuntu側に、Xserverの接続先としてWindwos10のVcXsrvを指定します。

.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が起動できないとき

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 Window Systemについて

X Window SystemとはUnix系OSで利用されているウィンドウシステムのことです(XとかX11とか呼ばれたりする)。

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

上記のWSLでの処理を例にすると、下記の流れになります。

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

Ubuntu側でDISPLAY環境変数を設定したのは、Xクライアントが送信先(Xサーバ)を知る必要があったからです。

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

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

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

  • この記事を書いた人

たかけの夫。IT系コンサルティング会社に勤務し、主にクラウドや機械学習に関するコンサルティング業務を行う三十路男。IT技術・投資に興味を持ち、家族と楽に人生を楽しみたい人。

-PC
-, , , ,