Ubuntu 20.04 LTS on WSL2 環境構築メモ (2/4) - GUI 導入

更新 2022.10.09

導入保留としていた WSLg preview を Widows 11 が勝手にアップグレード導入し、VcXsrv と競合するようになってしまったため、泣く泣く VcXsrv を外すことにする。
具体的には XLaunch を起動しないようにし、~/.bash_profile の export DISPLAY 設定を外すだけ。
タスクトレイの XLaunch に頼らなくなったことと LinuxWindows 間でコピペができるようになったのは WSLg の長所だが、初回起動が遅い (2 回目以降は速い)、ウィンドウのデザインや操作感がちょっとダサい、PowerToys の FancyZone 対象外になってしまうのが短所。


前提

導入対象とするマシンは下記の通り。

  • Hardware : CPU = i10900, GPU = GeForce RTX 2080Ti, Mem = 32GB, SSD 1 TB + HDD 2TB
  • ベース OS : Windows 10 Pro バージョン 20H2 (ビルド 19042.685)
  • 仮想 OS : Ubuntu 20.04 LTS on WSL2
  • 環境構築メモ 1/4 を実施した状況

GUI 導入

Ubuntu 14.04 より apt-get, apt-chache ではなく apt コマンドの使用が推奨されているため、参考記事に旧コマンドが含まれている場合は注意。

X-Window Server (VcXsrv) のインストールと設定

VcXsrv インストール

VcXsrv のインストールは参考記事 初心者のためのWSL( 2 ) ~GUI設定,デスクトップ環境設定編~ のとおり。記事を参考にするのはインストール作業まで。VcXsrv 初期設定以降は参考にするだけで実行しない。

VcXsrv の初期設定と起動確認

XLaunch (VcXsrv のアイコン) をクリックし、初期設定と起動確認を行う。

既定のとおり。Multiple windows を選択 *1

既定のとおり。

Disable access control にチェックを入れる。

Save configuration を押し、config.xlaunchshell:startup へ保存する。その後、完了を押す。

タスクトレイに XLaunch のアイコンが表示されれば起動成功。都度、XLaunch 起動・初期設定をするのは面倒であるため、上記の最終ステップでスタートアップメニューに設定を保存している。

UbuntuGUI 設定
# パッケージのインストール
 sudo apt install x11-apps x11-utils x11-xserver-utils dbus-x11

# bash 起動時の設定とその反映
 echo 'export DISPLAY=xx.xx.xx.xx:0.0' >> ~/.bash_profile
 source ~/.bash_profile

上記 3 行目の設定値 xx.xx.xx.xx は X-Windows Server サービスが走っているホスト OS (Windows 10) 側の IP アドレス。その指定方法は2通りある。

X-Window Server 用の通信設定(動的版)

1つはホスト OS の物理イーサネットアダプタの IP アドレスを固定値指定する方法。もう1つは WSL 起動時に動的に決まるイーサネットアダプタ vEthernet (WSL) の IP アドレスを指定する方法。下記のように指定する。この方法は地のゲスト OS
からだけではなく、ゲスト OS 上の Docker コンテナからの接続でも有効であった。

 export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0.0
Windows Defender 受信規則設定

ただ、この方法を採るにはある事前準備が必要で、この点をきちんと解説しているサイトは非常に少ない。

WSL2 とホスト OS との通信はパブリック扱いとなるらしく、WSL2 ⇔ ホスト OS 間で行う通信が Windows Defender に塞がれないようセキュリティについて詳細設定する必要がある。既定設定だと Windows Defender に VcXsrv サービスのすべておよび WSL2 から イーサネットアダプタ vEthernet (WSL) への ping echo back が塞がれてしまうため、パブリックプロファイルで許可を与える。 その手順は以下の通り。

  1. ping echo back を許可するルールの作成方法
    1. "Windows Defender ファイアーウォール" を開く
    2. "詳細設定" を押す
    3. "受信の規則" を右クリックし、"新しい規則" を選択する
    4. "規則の種類" で "カスタム" を選択し、"次へ" を押す
    5. "すべてのプログラム" を選択し、"次へ" を押す
    6. プロトコルの種類で "ICMPv4" を選択し、"カスタマイズ" を押す
    7. "特定の種類の ICMP" を選択し、"エコー要求" をチェックして "OK" をクリックし、"次へ" を押す
    8. ローカル IP アドレス (ホスト OS イーサネットアダプタ vEthernet (WSL) 側) で "これらの IP アドレス" を選択し、"追加" を押し、"この IP アドレスまたはサブネット" で "172.0.0.0/8" と入力する *2
    9. リモート IP アドレス (ゲスト OS 側) で "これらの IP アドレス" を選択し、"追加" を押し、"この IP アドレスまたはサブネット" で "172.0.0.0/8" と入力し、"次へ" を押す
    10. "接続を許可する" を選択し、"次へ" を押す
    11. "プライベート" と "パブリック" を選択し、"次へ" を押す
    12. 受信規則の名前を付け、"完了" を押す
  2. VxXsrc プロファイルの作成方法
    1. "アプリに Windows Defender ファイアウォール経由の通信を許可する" を押す
    2. "VcXsrv windows xserver" を選択し、"プライベート" および "パブリック" をチェックする
    3. "VcXsrv windows xserver" を選択してチェック(有効化)し、"OK" を押す
    4. 上述の ping echo back の設定方法のとおり、"詳細設定" から XcXsrv サービスの "受信の規則" における "ローカル IP アドレス" と "リモート IP アドレス" を設定する *3*4
    5. "プロパティ" > "詳細設定" > "エッジトラバーサル" は "アプリケーションに従う" を選択しておく
GUI のテスト

次のコマンドを実行し、Windows デスクトップ上に目玉が描画されたら成功。

 xeyes &

デスクトップ環境 (xfce) インストール

Ubuntu デスクトップ環境のインストール手順は以下のとおり。GNOME のインストールをトライしてみたが、参考記事と同様にうまくいかなかったため、軽量の xfce にしてみる。

なお Ubuntu デスクトップ環境はインストールしなくてもよい。VcXsrv が個別アプリごとに Windows 10 デスクトップ上に窓を描画してくれるため、すべての作業を Ubuntu 内で完結させる必要はない。Windows 10 に PowerToys 導入済みの場合は窓の配置を細かく指定できるため、Ubuntu デスクトップ環境に頼らない方がむしろ便利かもしれない。

インストール

次のコマンドを実行する。

 sudo apt install xfce4-terminal
 sudo apt install xfce4-session
 sudo apt install xfce4
 export LIBGL_ALWAYS_INDIRECT=1
起動確認

次のコマンドを実行し、Ubuntu デスクトップ環境が起動するか確認する。なお、Ubuntu デスクトップ環境を使用するときは VcXsrv の起動オプションを "Multiple windows" ではなく "One large window" に設定しておく方が取り回ししやすい。

 startxfce4

*1:Ubuntu デスクトップ環境を利用する場合は Multiple windows ではなく One large window 推奨。

*2:動的に決まるためサブネット指定する。172.17.xx.xx だったり 172.30.xx.xx だったりするため、上位1オクテットのみの指定。

*3:簡易設定のみだと、任意のリモートアクセスが可能になってしまうため、ネットワークのスコープを限定する。

*4:UDP しか使わないのだが、TCP も自動的に作成されて今うため、こちらも同様にスコープを限定しておく。