UbuntuをWindows11上で動かす その8: GUIを使う(VcXsrv編)

UbuntuをWindows11上で動かす その8: GUIを使う(VcXsrv編)Ubuntu
スポンサーリンク

前回はWindows Subsystem for LinuxのLinxuカーネルを更新する方法を紹介しました。

今回はWSL2上でGUIをを使ってみたいと思います。

スポンサーリンク

WSL2でのGUIの実現方法

WSL2をインストールするとわかりますが、基本的にはCUI(コマンドラインの操作)を前提としています。

もちろんGUIでもLinuxのコマンドが使えれば、python等のインタープリタやgcc等のコンパイラを使った開発を行うことができます。

しかし、やはりGUIでの操作をしたいという場合もあると思います。

そのような場合、WSL2では3つの選択肢があります。

  1. X Window Systemを使う
    WSL2をX Window Systemのクライアント、WSL2を動かしているWindowsをX Window Systemのサーバとして設定することで、WSL2のGUIをWindows上に表示する方法です。
  2. リモートデスクトップを使う
    WSL2でリモートデスクトップサーバを動かし、Windowsのリモートデスクトップアプリで接続することで、WSL2のデスクトップをWindows上に表示するほほうです。
  3. WSLgを使う
    MicrosoftによるWSLgのグラフィクス対応です。
    おそらくこれが本命ですが、2022年2月時点ではまだプレビュー版というステータスになります。
    Windows11では既にプレビュー版のWSLgが使えるようになっています

今回は1のX Window Systemを使う方法を紹介します。

スポンサーリンク

Windows用のXサーバ

Windows用のXサーバとしてはAstec-Xという商用ソフトが定番といえば定番です。

ASTEC-X -- Windows 対応 PC X サーバー

しかし、価格は78,000円となかなか個人で手が出せる物ではありません。

Xming X Server for Windows - Official Website
Xming X Server for Windows

Xmingはフリーといえばフリーなのですが、フリーになっている(Public Domain)のは2007年の物です。一応動作はするようですが、さすがに10年前となると不安になります。

10ポンド以上の寄付をすると最新版のXmingを入手することができます。

このような状況で注目されているのがVcXsrvです。

VcXsrv Windows X Server
Download VcXsrv Windows X Server for free. Windows X-server based on the xorg git sources (like xming or cygwin's xwin), but compiled with Visual C++ 2012 Expr...

こちらは非常に活発に開発されているようです。

私がダウンロードしたときには「vcxsrv-64.1.20.14.0.installer.exe」でした。

VcXsrvのダウンロード

インストールはこのダウンロードしたファイルを実行してNextを選んでおけばOKです。

VcXsrvのアイコン

VcXsrvは表示の仕方としていくつかのモードを持っています。ここでは代表的な2パターン(ここでは「マルチウィンドウ表示」と「デスクトップ表示」とします)を紹介します。

マルチウィンドウ表示での利用

WSL2の各アプリをWidnows上でも一つのウィンドウで表示する方式です。

WSL2のアプリとWindowsのアプリを混在して表示させたいときに便利ですが、WSL2のアプリを起動させるときにはWSL2のシェルでコマンドを入力する必要があります。

基本的にWSL2をコマンドラインで利用して、ときどきGUIアプリを使うという方におすすめの方法です。

VcXsrvの設定

まずVcXsrvの設定を行います。

マルチウィンドウ表示を行うためには、XLaunchを起動して表示された設定画面で「Multiple windows」を選択します。

VcXsrvの設定 1

次の画面では「Start no client」を選んだ状態で「次へ」を選択します。

VcXsrvの設定 2

次の画面では「Disable access control」のチェックを追加した後、「次へ」を選択します。

VcXsrvの設定 3

最後の画面では「Save configuration」を選択して、現在の設定を「multi-windows.xlaunch」として保存したあと「完了」を選択します。

VcXsrvの設定 4

これでvcxsrvが起動しますが、初回はファイアウォールに関する警告が表示されます。

この画面では「プライベートネットワーク」と「パブリックネットワーク」の両方をチェックして、「アクセスを許可する」を選択してください。

Windowsのファイアウォールの設定

>

パブリックネットワークでの通信を許可するのはちょっと気持ち悪いですが、これをチェックしないとうまくWSL2と通信できません。

他の方法をいろいろ調べたのですが、ここでパブリックネットワークでの通信を許可するのが最も簡単でした。

起動に成功するとタスクトレイに次のようなアイコンが表示されます。

VnXsrvのアイコン (タスクトレイ)

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の画面に目玉が出ればまずは成功です。

Windowsに表示されたxeys

画面に目玉が見当たらない場合は、タスクバーにないかどうか確認してください。

次にもう少し実用的なアプリケーションとしてターミナルソフトlxterminalを導入してみましょう。

$ sudo apt-get install lxterminal

これで次のようなコマンドを実行するとWindows側でターミナル画面が立ち上がります。

$ lxterminal &

Windowsに表示されたターミナル画面

ただ、フォントがイマイチかと思います。

フォントを改善するにはWindowsのフォントをWSL2から参照できるようにします。

$ sudo ln -s /mnt/c/Windows/Fonts/ /usr/share/fonts/windows
$ sudo fc-cache -fv

この処理をしたあとにもう一度をlxterminaiを立ち上げてみましょう。

lxterminalのメニューで「編集」→「設定」と選ぶとスタイルタブで選ぶフォントでWindowsのフォントが選択できるようになります。

フォントの変更

フォントとしてMiguフォントを選択してみました。

Miguフォント : M+とIPAの合成フォント

多少見やすくなったでしょうか。

フォントを変更したターミナル画面

もちろんlxterminalだけでなくemacs等のアプリケーションもGUIで動作させることができます。

動作に問題がなければ下記のコマンドを実行して、次回からもGUIが使えるようにしておきましょう。

$ echo "export DISPLAY=$(grep nameserver /etc/resolv.conf | awk '{print $2}'):0" >> ~/.bashrc

日常での利用

度設定が終われば、下記の手順でWSLのGUIアプリを実行することができます。

  1. WindowsでVcXsrv(セーブした「multi-windows.xlaunch」を起動する
  2. WSLを起動する
  3. 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」を選択します。

VcXsrvの設定 1

次の選択肢では「Open session via XDMCP」を選択します。

VcXsrvの設定 2

次はXDMCPの設定画面になりますので「Connect to host」の欄にWSL2のIPアドレスを入力します。

VcXsrvの設定 3

WSL2のIPアドレスはWSL2のシェルで

hostname –I

で確認することができます。

次の画面では「Disable access control」をチェックした後、「次へ」を選択します。

VcXsrvの設定 4

最後の画面では「Save configuration」を選択して、現在の設定を「xdmcp.xlaunch」として保存したあと「完了」を選択します。

VcXsrvの設定 5

これでVcXsrvのウィンドウが開き次のような画面が表示されたらひとまず成功です。最初はWindowsの画面全体に表示されるので好きなサイズに調整しましょう。

Ubuntuのログイン画面

ただデフォルトだとUnityによるデスクトップを表示しようとします。今回はデスクトップ環境としてLXDEをインストールしたので、Ubuntuアイコンを選択してデスクトップ環境を「LXDE」に変更しておきます。

デスクトップ環境をLXDEに変更

これでログインすればLXDEによるデスクトップが表示されると思います。

私の場合は「unity-greeter」というアプリが邪魔してうまくデスクトップ画面が表示されないことがありました。

そのような場合はunity-greeterをアンインストールして、代わりにlightdm-gtk-greeterをインストールすれば解消すると思います。

$ sudo apt-get remove unity-greeter
$ sudo apt-get install lightdm-gtk-greeter

あとはLXDEのメニューなどでアプリを起動できます

Windowsに表示されたUbuntuのデスクトップ

デスクトップ表示での課題

WSL2のデスクトップが表示されるようになったらあとは、使用したいアプリを入れていくことになります。

私はそこまで試していませんが、WSL2に日本語入力ソフトを入れれば、日本語も入力できるようです。

しかしこの方法の最大の問題は「VcXsrvの設定でWSL2のIPアドレスを設定する必要がある」という点です。普通ならば問題ないのですが、WSL2は起動する毎にIPアドレスが変わってしまい、VcXsrvの設定を修正する必要が出てきます。

これはかなり面倒で実用性が下がる原因となります。

また、Windowsのキーボード設定が勝手に英語に切り替わってしまうという現象も不便です。

自分の中ではWSL2はSSHで接続して使いつつ、必要があるときにだけVnXsrvでGUIを表示すれば良いかな、と考えています。

まとめ

今回はWindows Subsystem for Linux (WSL2)を使って導入したUbuntuでGUIを使えるようにしてみました。

WindowsにフリーのXサーバであるVcXsrvを導入することで、GUIアプリも簡単に使うことができます。GUIアプリが必要な方は試してみてください。

次回はリモートデスクトップを使ってLinuxのGUIアプリを使えるようにしてみたいと思います。

コメント