WSL2でDockerが動いてGUIも使える環境を作る(その3)

# はじめに

WSL2にUbuntuを導入して、Dockerやsystemd、Xserverが動く環境を作ります。3部構成でやります。
背景や環境などについては、[その1(WSL2にUbuntu-20.04をインストールする)](https://qiita.com/fjij/items/12889aaa26e03e0288e1)、[その2(GenieやDockerを導入する)](https://qiita.com/fjij/items/95e283ed2bff47a1a27c)、も参照ください。

## ゴール
- WSL2にUbuntu-20.04をインストールする。
- systemdが動くようにする(Genieの導入)。
- Dockerを使えるようにする。
- リモートデスクトップで接続できるようにする(xrdpの導入)。<-**本章はココ** 

上から順にやっていくと何となくWSLが使えるようになることを目指していますが、うまくいかない環境がある点についてもご了承ください。

## 前置き
systemdが使えるようになったら、意味など関係なくGUIを有効にしてみたくなるのが人情というものです。お仕事環境でも使えるようにVNCのインストール不可という縛りも付けたいので、xrdpも導入してWindowsのリモートデスクトップ接続で利用できるようにします。

# 導入
## xrdpをインストール
リモートデスクトップ接続で利用するためには、xrdpをインストールしてRDPを有効にする必要があります。デフォルトの接続ポートは3389ですが、ホストマシンのWindowsのリモートデスクトップと競合してしまうので、3390に変更します。また、色深さ設定をクライアント依存に変更します。

```terminal
fjij@STELLA:~$ sudo apt -y install xrdp
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています

- 省略 -

libc-bin (2.31-0ubuntu9.7) のトリガを処理しています ...
dbus (1.12.16-2ubuntu2.1) のトリガを処理しています ...
systemd (245.4-4ubuntu3.15) のトリガを処理しています ...
sgml-base (1.29.1) のトリガを処理しています ...
fjij@STELLA:~$ sudo cp /etc/xrdp/xrdp.ini /etc/xrdp/xrdp.ini.bak
fjij@STELLA:~$ sudo sed -i 's/3389/3390/g' /etc/xrdp/xrdp.ini
fjij@STELLA:~$ sudo sed -i 's/max_bpp=32/#max_bpp=32/g' /etc/xrdp/xrdp.ini # color depthを制限なしに設定
fjij@STELLA:~$ sudo sed -i 's/^xserverbpp=24/#xserverbpp=24/g' /etc/xrdp/xrdp.ini # Xserverのcolor depthをクライアントに合わせる
fjij@STELLA:~$ sudo systemctl start xrdp
fjij@STELLA:~$ sudo systemctl enable xrdp
Synchronizing state of xrdp.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable xrdp
fjij@STELLA:~$
```
## desktopのインストール
desktop周りをインストールします。今回はxfce4なので、xubuntu-desktopです。
```terminal
fjij@STELLA:~$ sudo apt -y install xubuntu-desktop
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了

- 省略 -

```
途中で、lightdmの設定を行います。```gdm3```を選択してください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606374/a2e3ff46-7e91-5d38-0c9c-2eff617def97.png" width="75%">
また、途中で ***Initializing mlocate database; this may take some time...*** のメッセージを表示したままフリーズしたと勘違いするくらい止まることがありますが、お湯を沸かしてコーヒーを飲むくらい、じっくりと待ってください。
```terminal
- 省略 -

fonts-knda (2:1.2) を設定しています ...
fonts-tlwg-loma (1:0.7.1-3) を設定しています ...
mlocate (0.26-3ubuntu3) を設定しています ...
update-alternatives: /usr/bin/locate (locate) を提供するために自動モードで /usr/bin/mlocate を使います
グループ `mlocate' (GID 134) を追加しています...
完了。
Initializing mlocate database; this may take some time...

- 省略 -

engrampa (1.24.0-2) を設定しています ...
fontconfig (2.13.1-2ubuntu3) のトリガを処理しています ...
unity-gtk3-module:amd64 (0.0.0+18.04.20171202-0ubuntu2) を設定しています ...
desktop-file-utils (0.24-1ubuntu3) のトリガを処理しています ...
unity-greeter (18.04.0+20.04.20200312-0ubuntu2) を設定しています ...
initramfs-tools (0.136ubuntu6.7) のトリガを処理しています ...
fjij@STELLA:~$
```
心配な場合は、別のターミナルを開いて ```top```コマンドを打つと ```updatedb.mlocat```プロセスが頑張っているのがわかります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606374/8ed27ec1-abb9-508c-dd64-0b6bae70e84c.png" width="75%">

## xsessionまわりの設定
xfce4のセッションが起動するように設定を行います。
```terminal
fjij@STELLA:~$ echo xfce4-session > ~/.xsession
fjij@STELLA:~$ tee ~/.xsessionrc << _EOF_ > /dev/null
> echo export XDG_SESSION_DESKTOP=xubuntu
> export XDG_DATA_DIRS=/usr/share/xfce4:/usr/share/xubuntu:/usr/local/share:/usr/share:/var/lib/snapd/desktop:/usr/share
> export XDG_CONFIG_DIRS=/etc/xdg/xdg-xubuntu:/etc/xdg:/etc/xdg
> _EOF_
fjij@STELLA:~$
```

## カラーマネジメントの設定

リモートデスクトップで接続すると、認証を求めるダイアログが表示されてしまいます。固定の設定を追加すと回避することができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606374/be78ac90-4dfb-8963-27e9-ad4da1d47fd7.png" style="max-width:75%;">

```terminal
fjij@STELLA:~$ sudo tee /etc/polkit-1/localauthority/50-local.d/45-allow-colord.pkla << _EOF_ > /dev/null
> [Allow Colord all Users]
> Identity=unix-user:*
> Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile
ltAny=> ResultAny=no
> ResultInactive=no
ResultA> ResultActive=yes
> _EOF_
fjij@STELLA:~$
```

## genieの設定追加
GUIを使うことが決まったので、いらない警告メッセージを無効化します。genie起動時の ***genie: WARNING: systemd default target is default.target;～***というメッセージが表示されなくなります。

```terminal
fjij@STELLA:~$ sudo sed -i 's/target-warning=true/target-warning=false/g' /etc/genie.ini
fjij@STELLA:~$
```

## WSLの設定変更

現在はデフォルトでWSLgがインストールされています。これはWSLのウインドウアプリケーションを、リモートデスクトップの仕組みを使って、Windowsのウインドウアプリケーションのように表示する機能ですが、当然のごとくxrdpと競合するため無効化が必要です。
また、WSLにlocalhostでアクセスできるようにもしておきます。

```%USERPROFILE%\.wslconfig``` ファイルに設定を追加します。

```ini
[wsl2]
localhostForwarding=True
guiApplications=False
```
設定が終わったら、Powershellを開いて```wsl --shutdown```コマンドを実行して、一度WSLを再起動します。

# GUIにログイン

リモートデスクトップ接続を開き、```localhost:3390``` に接続します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606374/6e22a029-eccd-1c87-7088-6ba2982edfa5.png" style="max-width:75%;">

セッションへのログイン画面が表示されるので、WSLの初期設定で設定したユーザー名とパスワードを入力します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606374/acad770a-7472-1f4d-8aa2-9e5d6b5ba2f3.png" style="max-width:75%;">

Desktopが表示されれば成功です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606374/96a1e366-2240-3652-0d9f-c7910de90334.png" width="75%">

正直なところ、GUIが使えるようにする嬉しさは自己満足でしかありません。
実際にシェルスクリプトを書く際は、VSCodeにRemote WSL拡張機能を入れて使っていますし、Postman使うより、curl + jqを使ってRESTAPIを叩きます。
でも、やっぱり使えるようにしておきたいのです。今後は、そんな夢と現実みたいなところも書いていけたら良いなと思います。

# Tips
## ubuntu-desktopを使う場合

今回はxfce4をデスクトップに選びましたが、通常のubuntu-desktopを使用することもできます。
実は、インストール自体はxfe4を使うよりも簡単です。

desktop周りをインストールで、```ubuntu-desktop``` を指定します。
lightdm設定も、xsessionまわりの設定も要らないのでスキップしてください。
```terminal
fjij@STELLA:~$ sudo apt -y install ubuntu-desktop
```

ただ、私の環境では図のように、画面の乱れが発生します。また、ソフトウエアアップデートなどの認証を必要とする画面を表示しようとすると ***Oh no! Something has gone wrong.*** で落ちてしまう現象が発生してしまったので、今回はxfce4を利用することにしました。
他のマシンでは同じ手順でも発生しないので、環境依存なんでしょうか・・・。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606374/9781d324-a595-f926-b372-a8da96e851de.png" width="75%">

## Ubuntuを初期状態に戻したいとき
いろいろWSL環境で試行錯誤していると、初期状態に戻したくなることがあります。アプリケーションの設定などから設定することもできますが、もっと簡単にPowershellでアンインストールできます。
```powershell
PS C:\Users\fjij> wsl --unregister Ubuntu-20.04
```
再度、Ubuntuのインストールから実施してください。