VcXsrv(Xサーバー)をインストールしてWSLでGUIで使う

Windows11でWSL2をインストールした場合はマイクロソフトのこの記事に従って設定を行うとWSL2上でLinuxのGUIアプリが使えるようになります。

WSL で Linux GUI アプリを実行する
WSL で Linux GUI アプリの実行がどのようにサポートされるかについて説明します。

ここから下はWindows10で実験した情報です。WSLでGUIを使う方法はいくつかあるようなので一例として見てください。

 

この記事では Windows の Linux 環境(WSL)でグラフィック機能が使えるように設定します。少し高度な内容になるので必要になったときに設定すれば良いです。

Before

Windows WSL で次のプログラムを実行してみてください。グラフを表示する簡単な Python のプログラムです。

  • graph.py
matplotlib というライブラリが必要なのでインストールしてからプログラムを起動します。
おそらく何かエラーが表示されたか、あるいは何も起きない(グラフが表示されない)のではないかと思います。これは WSL がグラフィック機能を持っていないからです。この記事では WSL で GUI が使える環境を作ります。

Mac のターミナルでは上記のサンプルプログラムは正常に動いてグラフが表示されたはずです。Mac ではこの記事の設定は不要です。

VcXsrv のインストール

下記の URL にアクセスして VcXsrv Windows X Server をダウンロードしてください。
https://sourceforge.net/projects/vcxsrv/files/vcxsrv/

たくさんファイルがありますが緑色の [Download Latest Version] というボタンをクリックすればダウンロードされます。

ダウンロードしたらそのファイルを実行してインストールします。設定はすべてデフォルトで構いませんので [Next] > [Install] と進んでください。インストールが完了したらデスクトップにこのようなアイコンが2つ出来ているはずです。ひとつは VcXsrv を起動するためのショートカット、もうひとつは VcXsrv を指定した設定内容で起動するためのアイコンです。

WSL(Ubuntu)を起動して設定を続けます。次のコマンドを実行して Ubuntu 上で Xserver をインストールします。

ホームディレクトリに戻って .bash_profile というファイルがあるかどうか確認してください。隠しファイルなので ” ls -la” とオプションを指定しなければ表示されません。

.bash_profile が既にあれば次の1行を追加してください。ファイルが無ければ新しく作ってください。編集は vi エディタ等を使う必要があります。

  • .bash_profile
設定を反映させるために “source ~/.bash_profile” というコマンドを実行するか、または WSL をいったん終了して起動しなおしてください。Windows上で VcXsrv を実行した状態で、WSL で次のコマンドを実行し、目玉のアイコンが出れば成功です。
WSL1 の場合は目玉のアイコンが出ると思いますが WSL2 の場合はこのようなエラーが出るかもしれません。
エラーが出た場合はさらに設定が必要ですので次に進んでください。ただし、ここから先の手順については、WSL2 が頻繁に更新しているため情報が交錯しており、確実な手順がありません。説明通りに動かなければ自分で調査・試行錯誤が必要になります。また、「こうしたら動いた」という情報があればサイト管理者まで報告して頂けると大変助かります。

Windows のコントロールパネルを開いて [ネットワークとインターネット] > [ネットワークと共有センター] > [アダプターの設定の変更] に進みます。”vEthernet(WSL)” というネットワーク接続があります。

これは WSL2 が内部的に接続しているネットワークデバイスを Windows 側で認識しているものです。このアイコンをダブルクリックして、さらに [詳細(E)…] を見てください。

ここの “IPv4アドレス” という項目の値を確認して覚えておいてください。後で使います。

WSL に戻って必要なライブラリをインストールします。

先ほど編集した .bash_profile をもう一度編集して次のように変更してください。異なる情報があるので2通りの説を書いておきます。

  • WSL2用の .bash_profile(1)
  • WSL2用の .bash_profile(2)
“source ~/.bash_profile” というコマンドを実行するか、または WSL をいったん終了して起動しなおしてください。”echo $DISPLAY” というコマンドを実行し、その結果が “vEthernet(WSL)” の IPv4 アドレスを含む形(例えば、172.12.34.5:0)になっていれば問題ありません。ちなみに筆者の環境では(1)はうまく動作せず、(2)の設定を使っています。(2)の設定の中で route というコマンドを使っていますが、これはデフォルトではインストールされていません。少し前の説明の中の “$ sudo apt install net-tools” でインストールされています。

次にファイアウォールの設定を行います。WSL 側から “vEthernet(WSL)” へのアクセスを Windows 側のファイアウォールが遮断してしまうのを回避するためです。Windows のコントロールパネルから [システムとセキュリティ] > [Windows Defender ファイアウォール] > [Windows Defender ファイアウォールを介したアプリまたは機能を許可] に進みます。[設定の変更] というボタンを押すと変更できるようになりますので、リストの中から “VcXsrv windows xserver” を探して(2件あれば両方とも)プライベートとパブリックの両方にチェックを入れ、[OK] ボタンで確定します。これで VcXsrv と Windows の間で通信できるようになりました。

ウイルス対策ソフトをインストールしている場合は、そのソフトの使用法に従ってファイヤウォールを設定してください。工大の情報センターが提供している ESET Endpoint Security Advanced をインストールしている場合はこのようにします。

  • ESETの設定方法
    ESETの [設定] > [ネットワーク] > [ファイヤーウォール] > [設定] [基本] > [フィルタリングモード] を [対話モード] にする。
    xeyesを動かすと許可するかどうか判断を求められるので [ルールを作成し、永久に記憶] にチェックして [許可] を押す。

この操作の間に他のトラフィックについて警告が出た場合は [毎回確認] を選択して [許可] を押しておく。最後に、先ほど変更した [フィルタリングモード] をデフォルトの [ルール付き自動モード] に戻しておく。

Windows上でデスクトップの VcXsrv のアイコン(名前は “XLaunch”)をダブルクリックします。手順は次の通りです。

  1. “Multiple windows” を選択(デフォルトのまま)、[次へ(N)>]
  2. “Start no client” を選択(デフォルトのまま)、[次へ(N)>]
  3. “Disable access control” をチェック(全部のチェックボックスにチェックが入る)、[次へ(N)>]
  4. ここで [Save configuration] を押すと、以上の設定内容を保存できます。デスクトップにアイコンを置いておけば、次回以降同じ設定で起動できます。そして、[完了] を押す。

VcXsrv が起動するとタスクトレイに “X” のアイコンが表示されます。複数起動してしまった場合は、アイコンをダブルクリックして [Exit] ボタンですべて終了し、正しく起動しなおしてください。

失敗したコマンドをもう一度 WSL で実行してみましょう。

目玉のアイコンが出れば成功です。

After

VcXsrv を起動した状態で、冒頭にやったサンプルプログラム graph.py をもう一度やってみましょう。

今度はグラフが表示されたはずです。

 

コメント