この記事ではLinuxのGUIアプリを使用するためにあえてVcXsrvを使用しましたが、Linux GUIアプリをウィンドウで表示したい場合はWSLgを使うのがオススメです。

また、Linuxのデスクトップ環境全体を表示させたい場合はリモートデスクトップを使うと良いと思います。

前回はリモートデスクトップでWSL2に接続する方法を紹介しました。
今回は別の方法でWSL2上のGUIを使ってみたいと思います。
同様のことをWSL1でインストールしたDebianでやった記事は下記になります。

WSL2でのGUIの実現方法
これまで紹介した通り、WSL2はコマンドラインで操作するのが標準的です。コマンドラインでも、python等のインタープリターやgcc等のコンパイラを使った開発を行うことができます。
しかし、やはりGUIでの操作をしたいという場合もあると思います。
そのような場合、WSL2では3つの選択肢があります。
選択肢 | 詳細 |
---|---|
WSLgを使う | MicrosoftによるWSLgのグラフィクス対応です。Windows11であればデフォルトで有効になります。 |
リモートデスクトップを使う | WSL2でリモートデスクトップサーバを動かし、Windowsのリモートデスクトップアプリで接続することで、WSL2のデスクトップをWindows上に表示する方法です。 |
X Window Systemを使う | WSL2をX Window Systemのクライアント、WSL2を動かしているWindowsをX Window Systemのサーバとして設定することで、WSL2のGUIをWindows上に表示する方法です。 |
1番目のWSLgと2番目のリモートデスクトップでほとんどの要求は満たせると思いますが、今回はあえてX Window Systemを使う方法を紹介します。
Windows用のXサーバ
Windows用のXサーバとしてはASTEC-Xという商用ソフトが定番といえば定番です。
しかし、価格は78,000円となかなか個人で手が出せる物ではありません。
XmingというXサーバはフリーといえばフリーなのですが、フリーになっている(Public Domain)のは2007年の物です。
一応動作はするようですが、さすがに10年前となると不安になります。
10ポンド以上の寄付をすると最新版のXmingを入手できます。
このような状況で注目されているのがVcXsrvです。

こちらは非常に活発に開発されているようです。
私がダウンロードしたときには「vcxsrv-64.1.20.14.0.installer.exe」でした。
インストールはこのダウンロードしたファイルを実行してNextを選んでおけばOKです。インストールに成功するとデスクトップに次のアイコンができているはずです。
VcXsrvは表示の仕方としていくつかのモードを持っています。ここでは代表的な2パターン(ここでは「マルチウィンドウ表示」と「デスクトップ表示」とします)を紹介します。
マルチウィンドウ表示での利用
WSL2の各アプリをWindows上でも1つのウィンドウで表示する方式です。
WSL2のアプリとWindowsのアプリを混在して表示させたいときに便利ですが、WSL2のアプリを起動させるときにはWSL2のシェルでコマンドを入力する必要があります。
基本的にWSL2をコマンドラインで利用して、ときどきGUIアプリを使うという方にオススメの方法です。
VcXsrvの設定(マルチウィンドウ)
まずVcXsrvの設定を行います。
マルチウィンドウ表示を行うためには、XLaunchを起動して表示された設定画面で「Multiple windows」を選択します。
次の画面では「Start no client」を選んだ状態で「次へ」を選択します
次の画面では「Disable access control」にチェックを追加した後、「次へ」を選択します。
最後の画面では「Save configuration」を選択して、現在の設定を「multi-windows.xlaunch」として保存したあと「完了」を選択します。
これでvcxsrvが起動しますが、初回はファイアウォールに関する警告が表示されますので許可をしてください。
起動に成功するとタスクトレイに次のようなアイコンが表示されます。
WSL2側の設定
次はWSL側の設定をします。
まずは画面をX ServerとしてのWindowsに表示するための設定を行います。
export DISPLAY=$(ip route show | grep -i default | awk '{ print $3}'):0
ちょっと呪文みたいになってしまいましたが、カッコ内の処理ではWindows側のIPアドレスを取得しています。
この方法はMicrosoftのサイトにで紹介されているものです。

私の環境ではDISPLAY変数は次のように設定されました。
$ echo $DISPLAY
172.21.80.1:0
つづいてテスト用にGUIアプリをインストールします。
sudo apt-get install x11-apps
インストールに成功したらxeyesというアプリを起動してみます。
xeyes &
これでWindowsの画面に目玉が出ればまずは成功です。
画面に目玉が見当たらない場合は、タスクバーにないかどうか確認してください。
次にもう少し実用的なアプリケーションとして軽量な画像ビューワのMirageを導入してみましょう。
sudo apt-get install mirage
これで次のように実行するとWindows側にウィンドウが表示され、画像を確認できます。
mirage /usr/share/mirage/mirage_blank.png
WSL2をコマンドラインで使っているときに、画像を確認する際に便利かと思います。
日本語を表示するアプリではフォントがあまりきれいでない場合があります。
アプリでフォントの選択ができる場合は、WindowsのフォントをWSL2から参照できるようにすると改善する場合があります。
sudo ln -s /mnt/c/Windows/Fonts/ /usr/share/fonts/windows
sudo fc-cache -fv
あとはアプリでWindowsのフォントを選択すればOKです。
もちろんlxterminalだけでなくemacs等のアプリケーションもGUIで動作させることができます。
動作に問題がなければ下記のコマンドを実行して、次回からもGUIが使えるようにしておきましょう。
echo "export DISPLAY=$(ip route show | grep -i default | awk '{ print $3}'):0" >> ~/.bashrc
日常での利用
一度設定が終われば、下記の手順でWSLのGUIアプリを実行できます。
- WindowsでVcXsrvを起動する(セーブした「multi-windows.xlaunch」を起動する)
- WSL2を起動する
- WSL2でGUIアプリを起動する
ちょっと手順が面倒ですが、1については「multi-windows.xlaunch」をWindowsのスタートアップに登録すれば自動化できます。
Windowsアイコンを右クリックして「ファイル名を指定して実行」を選んだら「shell:startup」を入力します。
これでスタートアップ用のフォルダーが表示されるので、そこに保存しておいた「multi-windows.xlaunch」をコピーしておきましょう。
デスクトップ表示での利用
WSL2のデスクトップ画面をWindows上に大きなウィンドウで表示する方式です。起動するアプリはウィンドウ内のデスクトップ画面で選択します。
Windowsの子画面としてWSL2を使う感じになります。Windowsでリモートデスクトップを利用している方はそれを想像すれば良いかもしれません。
普段LinuxでGUIを使っている方はこちらの方が使いやすいと思います。
WSL2の設定
この方法では先にWSL2(Ubuntu)の設定をしておきます。
やることはデスクトップ環境をインストールすることと、リモートでのGUIログインを受け付けるディスプレイマネージャーを設定することです。
次のコマンドでまとめて入れてしまいましょう。今回はデスクトップ環境に軽量といわれているLXDEを、ディスプレイマネージャーにLightDMを利用します。
sudo apt-get update
sudo apt-get install lxde lightdm
デスクトップ環境を入れるので大量のパッケージが導入されます。私の場合は766個のパッケージが追加され、約1,220MBのディスクが消費されると表示されました。
私の場合はインストールを開始すると、何も聞かれることなくインストールが完了しました。
ただ次のようなメッセージが出て、「snapd」の再起動に数分時間がかかりました。
=> Installing the firefox snap
==> Checking connectivity with the snap store
==> Installing the firefox snap
2024-12-24T01:18:31+09:00 INFO Waiting for automatic snapd restart...
とりあえず待てばインストール処理が継続するので、そのまま待ちましょう。
パッケージのインストールが終わったらダウンロードしたファイルを削除しておきます。
sudo apt-get clean
ここまでの作業が終わったらlightdmの設定を行います。
Ubuntuの場合は下記の内容のファイルを10-xdmcp.confとして/etc/lightdm/lightdm.conf.d以下に作成します。
[LightDM]
start-default-seat=false
[XDMCPServer]
enabled=true
port=177
また、Windowsのフォントを使えるようにするために下記の設定を行います(まだ行っていない場合)。
sudo ln -s /mnt/c/Windows/Fonts/ /usr/share/fonts/windows
sudo fc-cache -fv
以上が完了したらlightdmを起動しておきます。
sudo systemctl start lightdm
ここまできたらとりあえずOKなのでVcXsrvの設定に移ります。
VcXsrvの設定(フルスクリーン)
次にVcXsrvの設定をします。
VcXsrvをインストールしてできた「XLaunch」を実行します。
表示形態は、WSL2のデスクトップ画面をWindows上の1ウィンドウとして扱いたい場合には「One large window」を選択します。一方、WSL2のデスクトップ画面でWindows画面を占有して良い場合は「Fullscreen」を選択します。
次の選択肢では「Open session via XDMCP」を選択します。
次はXDMCPの設定画面になりますので「Connect to host」の欄にWSL2のIPアドレスを入力します。
WSL2のIPアドレスはWSL2のシェルで
hostname -I
で確認できます。
次の画面では「Disable access control」をチェックした後、「次へ」を選択します。
最後の画面では「Save configuration」を選択して、現在の設定を「xdmcp.xlaunch」として保存したあと「完了」を選択します。
これでVcXsrvのウィンドウが開き次のような画面が表示されたらひとまず成功です。最初はWindowsの画面全体に表示されるので好きなサイズに調整しましょう。
ただデフォルトだとUnityによるデスクトップを表示しようとします。今回はデスクトップ環境としてLXDEをインストールしたので、Ubuntuアイコンを選択してデスクトップ環境を「LXDE」に変更しておきます。
これでログインすればLXDEによるデスクトップが表示されると思います。
あとはLXDEのメニューなどでアプリを起動できます。
デスクトップ表示での課題
WSL2のデスクトップが表示されるようになったらあとは、使用したいアプリを入れていくことになります。
私はそこまで試していませんが、WSL2に日本語入力ソフトを入れれば、日本語も入力できるようです。
ただ、VcXsrvをデスクトップ表示用に立ち上げたときになぜかWindowsのキーボード設定が勝手に英語に切り替わってしまうという現象があります。
手動で日本語に有力に切り替えれば問題ないのですが、地味に不便です。
この記事の検証をしていたところ、なぜかWSL2のUbuntuのIPアドレスが「Auto IP」になってしまうという現象に遭遇しました。
Ubuntuを入れ直せばIPアドレス(私の環境では172.21.92.66)が復活するのですが、何かの拍子でこのIPアドレスが取得できなくなるようです。
lxdeといっしょにインストールされるネットワーク関係の設定アプリが怪しいと思っているのですが、原因は今のところ不明です。
まとめ
今回はWindows側にXサーバを導入することで、Windows Subsystem for Linux (WSL2)のでGUIを使えるようにしてみました。
現時点でのWSL2にはWSLgという仕組みがありますが、WindowsにフリーのXサーバであるVcXsrvを導入することでGUIアプリを表示することもできます。いまとなっては使わない方法かもしれませんが一応紹介しておきます。
次回はwsl.confという設定ファイルを使ってWSL2の動作をカスタマイズしたいと思います。
コメント