この記事ではVcXsrvを利用しましたが、いろいろ試した結果、Linux GUIアプリをウィンドウで表示したい場合は、WSLgを使える環境(Windows11を含む)であればVcXsrvではなくWSLgを使うのがオススメです。
Linuxのデスクトップ環境を表示させたい場合はリモートデスクトップを使うのがオススメです。
前回はWindows Subsystem for LinuxのLinxuカーネルを更新する方法を紹介しました。
今回はWSL2上でGUIをを使ってみたいと思います。
同様のことをWSL1でインストールしたDebianでやった記事は下記になります。
WSL2でのGUIの実現方法
WSL2をインストールするとわかりますが、基本的にはCUI(コマンドラインの操作)を前提としています。
もちろんGUIでもLinuxのコマンドが使えれば、python等のインタープリタやgcc等のコンパイラを使った開発を行うことができます。
しかし、やはりGUIでの操作をしたいという場合もあると思います。
そのような場合、WSL2では3つの選択肢があります。
- X Window Systemを使う
WSL2をX Window Systemのクライアント、WSL2を動かしているWindowsをX Window Systemのサーバとして設定することで、WSL2のGUIをWindows上に表示する方法です。 - リモートデスクトップを使う
WSL2でリモートデスクトップサーバを動かし、Windowsのリモートデスクトップアプリで接続することで、WSL2のデスクトップをWindows上に表示するほほうです。 - WSLgを使う
MicrosoftによるWSLgのグラフィクス対応です。
おそらくこれが本命ですが、2022年2月時点ではまだプレビュー版というステータスになります。
Windows11では既にプレビュー版のWSLgが使えるようになっています。
今回は1のX Window Systemを使う方法を紹介します。
Windows用のXサーバ
Windows用のXサーバとしてはAstec-Xという商用ソフトが定番といえば定番です。
しかし、価格は78,000円となかなか個人で手が出せる物ではありません。
Xmingはフリーといえばフリーなのですが、フリーになっている(Public Domain)のは2007年の物です。一応動作はするようですが、さすがに10年前となると不安になります。
10ポンド以上の寄付をすると最新版のXmingを入手することができます。
このような状況で注目されているのがVcXsrvです。
こちらは非常に活発に開発されているようです。
私がダウンロードしたときには「vcxsrv-64.1.20.14.0.installer.exe」でした。
インストールはこのダウンロードしたファイルを実行してNextを選んでおけばOKです。
VcXsrvは表示の仕方としていくつかのモードを持っています。ここでは代表的な2パターン(ここでは「マルチウィンドウ表示」と「デスクトップ表示」とします)を紹介します。
マルチウィンドウ表示での利用
WSL2の各アプリをWidnows上でも一つのウィンドウで表示する方式です。
WSL2のアプリとWindowsのアプリを混在して表示させたいときに便利ですが、WSL2のアプリを起動させるときにはWSL2のシェルでコマンドを入力する必要があります。
基本的にWSL2をコマンドラインで利用して、ときどきGUIアプリを使うという方におすすめの方法です。
VcXsrvの設定
まずVcXsrvの設定を行います。
マルチウィンドウ表示を行うためには、XLaunchを起動して表示された設定画面で「Multiple windows」を選択します。
次の画面では「Start no client」を選んだ状態で「次へ」を選択します。
次の画面では「Disable access control」のチェックを追加した後、「次へ」を選択します。
最後の画面では「Save configuration」を選択して、現在の設定を「multi-windows.xlaunch」として保存したあと「完了」を選択します。
これでvcxsrvが起動しますが、初回はファイアウォールに関する警告が表示されます。
この画面では「プライベートネットワーク」と「パブリックネットワーク」の両方をチェックして、「アクセスを許可する」を選択してください。
パブリックネットワークでの通信を許可するのはちょっと気持ち悪いですが、これをチェックしないとうまくWSL2と通信できません。
他の方法をいろいろ調べたのですが、ここでパブリックネットワークでの通信を許可するのが最も簡単でした。
起動に成功するとタスクトレイに次のようなアイコンが表示されます。
WSL2側の設定
次はWSL側の設定をしていきます。
まずは画面をX ServerとしてのWindowsに表示するための設定を行います。
$ export DISPLAY=$(grep nameserver /etc/resolv.conf | awk '{print $2}'):0
ちょっと呪文みたいになってしまいましたが、/etc/resolv.confにWindows側のIPアドレスが書かれているので、これを取得しています。
WSL2の設定を変更して/etc/resolv.confを自動生成させないようにしている方は、ipconfig.exeの実行結果を利用する方が良いかもしれません。
$ export DISPLAY=$(ipconfig.exe | grep WSL -A 5 | grep IPv4 | awk -e '{print $14}' | sed 's/\r//g'):0
私の環境ではDISPLAY変数は次のように設定されました。
$ echo $DISPLAY 172.19.176.1:0
づいてテスト用にGUIアプリをインストールします。
$ sudo apt-get install x11-apps
インストールに成功したらxeyesというアプリを起動してみます。
$ xeyes &
これでWindowsの画面に目玉が出ればまずは成功です。
画面に目玉が見当たらない場合は、タスクバーにないかどうか確認してください。
次にもう少し実用的なアプリケーションとしてターミナルソフトlxterminalを導入してみましょう。
$ sudo apt-get install lxterminal
これで次のようなコマンドを実行するとWindows側でターミナル画面が立ち上がります。
$ lxterminal &
ただ、フォントがイマイチかと思います。
フォントを改善するにはWindowsのフォントをWSL2から参照できるようにします。
$ sudo ln -s /mnt/c/Windows/Fonts/ /usr/share/fonts/windows $ sudo fc-cache -fv
この処理をしたあとにもう一度をlxterminaiを立ち上げてみましょう。
lxterminalのメニューで「編集」→「設定」と選ぶとスタイルタブで選ぶフォントでWindowsのフォントが選択できるようになります。
フォントとしてMiguフォントを選択してみました。
多少見やすくなったでしょうか。
もちろんlxterminalだけでなくemacs等のアプリケーションもGUIで動作させることができます。
動作に問題がなければ下記のコマンドを実行して、次回からもGUIが使えるようにしておきましょう。
$ echo "export DISPLAY=$(grep nameserver /etc/resolv.conf | awk '{print $2}'):0" >> ~/.bashrc
日常での利用
度設定が終われば、下記の手順でWSLのGUIアプリを実行することができます。
- WindowsでVcXsrv(セーブした「multi-windows.xlaunch」を起動する
- WSLを起動する
- WSLでGUIアプリを起動する
ちょっと手順が面倒ですが、1については「multi-windows.xlaunch」をWindowsのスタートアップに登録すれば自動化できます。
Windowsアイコンを右クリックして「ファイル名を指定して実行」を選んだら「shell:startup」を入力します。
これでスタートアップ用のフォルダが表示されるので、そこに保存しておいた「multi-windows.xlaunch」をコピーしておきましょう。
デスクトップ表示での利用
WSL2のデスクトップ画面をWidnows上に大きなウィンドウで表示する方式です。起動するアプリはウィンドウ内のデスクトップ画面で選択します。
Windowsの子画面としてWSL2を使う感じになります。Windowsでリモートデスクトップを利用している方はそれを想像すれば良いかもしれません。
普段LinuxでGUIを使っている方はこちらの方が使いやすいと思います。
WSL2の設定
この方法では先にWSL2(Ubuntu)の設定をしておきます。
やることはデスクトップ環境をインストールすることと、リモートでのGUIログインを受け付けるディスプレイマネージャを設定することです。
次のコマンドでまとめて入れてしまいましょう。今回はデスクトップ環境に軽量といわれているLXDEをディスプレイマネージャにLightDMを利用します。
$ sudo apt-get update $ sudo apt-get install lxde lightdm
デスクトップ環境を入れるので大量のパッケージが導入されます。私の場合は707個のパッケージが追加され、約940MBのディスクが消費されると表示されました。
インストールの途中でいろいろ質問が出てくるかもしれません。基本的はデフォルトの設定で良いいのですが、注意するのはlightdmパッケージの設定です。
lightdmパッケージの設定ではデフォルトのディスプレイサーバを聞かれるので「lightdm」を選ぶようにしてください。
パッケージのインストるが終わったらダウンロードしたファイルを削除しておきます。
$ sudo apt-get clean
ここまでの作業が終わったらlightdmの設定を行います。
Ubuntuの場合は下記の内容のファイルを10-xdmcp.confとして/etc/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を起動しておきます。dbusをあらかじめ動かす必要があるのでdbus→lightdmと起動します。このとき、なぜかlightdmはバックグラウンドで動作してくれないので、lightdmの起動時には最後に「&」をつけてバックグラウンドで動作するように指定します。
$ sudo service dbus start $ sudo service lightdm start &
ここまできたらとりあえず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によるデスクトップが表示されると思います。
私の場合は「unity-greeter」というアプリが邪魔してうまくデスクトップ画面が表示されないことがありました。
そのような場合はunity-greeterをアンインストールして、代わりにlightdm-gtk-greeterをインストールすれば解消すると思います。
$ sudo apt-get remove unity-greeter $ sudo apt-get install lightdm-gtk-greeter
あとはLXDEのメニューなどでアプリを起動できます
デスクトップ表示での課題
WSL2のデスクトップが表示されるようになったらあとは、使用したいアプリを入れていくことになります。
私はそこまで試していませんが、WSL2に日本語入力ソフトを入れれば、日本語も入力できるようです。
しかしこの方法の最大の問題は「VcXsrvの設定でWSL2のIPアドレスを設定する必要がある」という点です。普通ならば問題ないのですが、WSL2は起動する毎にIPアドレスが変わってしまい、VcXsrvの設定を修正する必要が出てきます。
これはかなり面倒で実用性が下がる原因となります。
このIPアドレスが変わってしまう問題については、SSH接続の時は「localhost」を指定することで回避できました。
しかし、VcXsrvの設定でlocalhostを指定してもうまく接続できませんでした。
何か設定が不足しているのかもしれません。
また、Windowsのキーボード設定が勝手に英語に切り替わってしまうという現象も不便です。
自分の中ではWSL2はSSHで接続して使いつつ、必要があるときにだけVnXsrvでGUIを表示すれば良いかな、と考えています。
まとめ
今回はWindows Subsystem for Linux (WSL2)を使って導入したUbuntuでGUIを使えるようにしてみました。
WindowsにフリーのXサーバであるVcXsrvを導入することで、GUIアプリも簡単に使うことができます。GUIアプリが必要な方は試してみてください。
次回はリモートデスクトップを使ってLinuxのGUIアプリを使えるようにしてみたいと思います。
コメント