WSL2 でいい感じのデスクトップ環境を作りたい

[WSL Advent Calendar](https://qiita.com/advent-calendar/2020/wsl) に書こうと思ってたけど色々悩んでたら枠埋まってしまった

## はじめに

3年半前，↓のような記事を書きました (個人ブログ)

[Bash on Ubuntu on Windows でデスクトップ環境(Xfce)を動かしてみた](http://wgg.hatenablog.jp/entry/20170602/1496383937)

時代も変わって WSL2 が登場したり，色々あったので，今の環境で改めてWSLでデスクトップ環境を作る方法を模索してみました

## 最終目的

この記事では， **Windows デスクトップの代わりに，WSLのデスクトップ環境を使う** ことを目的にしています

なので別にイケてる開発環境を作りたいとかだけでなく，その他一般的なPCで行う行為をできるようにしてみたいという動機で作っています

いろんな方が書かれたやり方を試してみたのですが，やり方によって結構パフォーマンスに差が出そうで，快適に扱える環境を作ることに苦労していました

自分の中で現状いい感じだと思ったやり方についてまとめたいと思います

~~「デュアルブートでよくね」「VMでよくね」は禁句~~

## 前提

### PC環境
- OS: Windows 10 Pro
- バージョン 2004
- OSビルド: 19041.630
- CPU: i7-9700K
- RAM: 32GB

---

### WSL 環境
- WSLのバージョン: WSL2
- ディストリビューション: Ubuntu 18.04 (20でも Wlinux でもあまり変わらなさそう)


## 大雑把な手順
- WSL でディスプレイマネージャ (今回は lightdm) を起動し， VcXsrv を用いて XDMCP 接続する
- デスクトップ環境を起動する
- その他音声周りの設定

# やったこと

## インストール
- WSL2 の有効化と，インストールは省略します
- 今回は， Ubuntu 18.04 を入れました

## とりあえず GUI 開けるようにしてみる
- ここは最終目的に対して予備知識なのでなくても問題ないです
- WSL環境から，GUIを開く方法の再確認

---

- GUI が必要なアプリを入れてみます (`xeyes`)

```.sh
$ sudo apt install x11-apps
```

- 起動してみる

```
$ xeyes
Error: Can't open display:
```

- 何も準備していないと，↑のように怒られて起動できないはずです

## X Server を用意する
- Windows 側に， X Server のクライアントソフトを入れます
- 今回は [VcXsrv](https://sourceforge.net/projects/vcxsrv/) を使用しました
    - 他にも XMing とか， (WLinux 側が推奨している) X410 とかありますが，自分で試した限り VcXsrv が一番良さそうでした (他のだとかなり動作が重い事があった...? :thinking: )    
- VcXsrv をWindowsにインストールしたら，とりあえず XLaunch から起動してみます
- 設定は，基本的にデフォルトのままで大丈夫ですが， 3ページ目の `Extra settings` で， `Disable access control` にチェックを付けます
    - (WSL1 ではこの設定は不要だった気がしますが， WSL2 ではネットワークの仕組みが変わって不要になった？)
    - [参考](https://github.com/microsoft/WSL/issues/4106)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170422/0be0a19f-d940-9eaf-f5fc-0eaa5db8678e.png)

- VcXsrv を起動したら，WSL側で `$DISPLAY` 環境変数を設定します
- Windowsで `ipconfig` コマンドを実行して， `vEthernet (WSL)` と書かれた部分の IP アドレスを入力します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170422/79a0391c-4861-5181-52ad-f7ef3023a0b6.png)


```
$ export DISPLAY=XXX.XXX.XXX.XXX:0
```

- とはいえ毎回調べるの大変なので，上述の参考リンクに， WSL 側からこの IP アドレスを取得する方法が書かれていました

```
$ export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0
```

このコマンドで，`$DISPLAY` 変数が設定できるはずです
便利なので `.profile` とかに書いておくのも良いかも

- 設定できたら，GUIアプリを起動してみます

```
$ xeyes
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170422/b4a2dcf3-3481-8f31-fde2-5e64b2ea3b19.png)

こんな感じに， WSL から GUI を開くことができました

## デスクトップ環境を入れて起動してみる
- さて，主題の方に移ります
- デスクトップ環境を実際にいれてみます
- とりあえずシンプルで使いやすそうな `xfce` を

```
$ sudo apt install xfce4
```

(400Mb ぐらいでした)

xfce を起動する場合， VcXsrv の1つ目の設定は， `Multiple windows` 以外にしたほうが良いです

一旦 VcXsrv を `One large window` で起動し直して， `$ xfce4-session` を実行してみました

こんな感じにデスクトップ環境を起動することができました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170422/c1d22f71-1cb8-5009-d2f9-cdde22461652.png)



# 日本語入力
コーディングで英語しか打たないなら不要ですが，今回は一般的な作業，ブラウジングとかこの Qiita の記事を書く用途とかも視野に入れてるので，日本語入力は必須です

色々日本語入力を実現する方法を試したのですが， `fcitx` + `fcitx-mozc` の組み合わせが最も扱いやすそうに感じました

[WSL2にFcitx＋Mozcを入れて日本語入力する](https://astherier.com/blog/2020/08/install-fcitx-mozc-on-wsl2-ubuntu2004/)

## fcitx-mozc の導入

```.sh
$ sudo apt install fcitx fcitx-mozc
```

(170Mb ぐらいでした)

以下の環境変数設定とコマンドで fcitx を起動できます

これもデスクトップ環境だけを使う想定なら， `.profile` とかに書いても良いかも

```
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export DefaultIMModule=fcitx
fcitx-autostart
```

`$ fcitx-configtool` で設定画面を開き， `Input Method` から `Mozc` を追加します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170422/cc80164a-8186-1440-5b34-94b7564843b9.png)

その他の設定はいい感じに (自分は普段Windowsでも `Ctrl+Space` でIME切り替えしてるので大体デフォルトの設定で

## 日本語文字化け

日本語入力はできたのですが，文字化けしてしまいました (事前に Ubuntu 20.04 で試したときは起きなかったのに何か手順違ったかな :thinking: )

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170422/1034569f-5499-2245-1da4-001a43643957.png)

確か日本語対応のフォントをWSL環境に追加すればできたはずです

こちらの記事を参考に，(ちょっと強引なやり方ですが) Windows に入ってるフォントを WSL 環境にインストールしたら解決できました

(多分本来は使うべき日本語フォントを個別にインストールするほうが良いと思います)

[WSL上のXサーバで、Windows 10にインストールされているフォントを利用する](https://www.atmarkit.co.jp/ait/articles/1812/27/news033.html)

```/etc/fonts/local.conf
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
    <dir>/mnt/c/Windows/Fonts</dir>
</fontconfig>
```

(ついでにWSL環境の言語設定も日本語に変えています)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170422/e168b39d-6b1b-4655-e377-f672f38ad850.png)

# ブラウザ入れてみる
割と使うであろうブラウザは入れておきます

`chromium-browser` なり `firefox` なり好きなのを入れればいいと思いますが， WSLのディストロが `Ubuntu-20.04` とか使っていると `chromium-browser` は snap 経由で入るようになったらしく，そのままでは動かせないかもです

[第596回　snapパッケージ版Chromiumを使用する](https://gihyo.jp/admin/serial/01/ubuntu-recipe/0596)

一応 WSL2 で snap 動かすようにすることは可能らしいですが，以前試したら別の部分で意図してない問題が起きたので今回は行っていません..

とりあえず chromium-browser 動きました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170422/6f962dc4-b0b1-8aa5-4799-1b031dce85e3.png)

# 音が聞こえない

WSLで作ったデスクトップ環境から Youtube とか見てたら，音声が再生されないことに気づきました

当たり前といえば当たり前なのですが，X Window System では音は関与していないので，Windows側に音声情報を渡す方法を別途用意する必要があります

この件に対して，こちらの記事がとても参考になりました

[WSL2+Ubuntu 20.04環境から音声を出力する](https://astherier.com/blog/2020/08/wsl2-ubuntu-sound-setting/)

ちょっと長いので詳細は割愛します

途中 Windows側の pulseaudio を起動する部分がありますが， WSL2 なら exe ファイルの実行もできるので， `/mnt/c/...` のように Windows 側の pulseaudio の実行パスを直接入力して起動処理を `.profile` に書いておいても良いかもです
( `WLinux` だと ホームディレクトリに `winhome` がデフォルトで用意されているので，そこから繋ぐのも良さそう)

というわけで，これで音声も再生できるようになりました

# 一通りできた
ここまでで，割といい感じにできるようになったと思ってるのですが，最近このような記事を見て， XDMCP でWSLに接続するのを追加で試してみました
( WSL で使うのなら，↑でやっていた `xfce4-session` を叩いて実行するやり方とどちらが良いんだろう... :thinking: )

[Using XDMCP with Windows 10’s Windows Subsystem for Linux (WSL)](https://blog.netsarang.com/1990/using-xdmcp-with-windows-10s-windows-subsystem-for-linux-wsl/)

# XDMCP接続を試してみる



## ディスプレイマネージャのインストール

↑の記事に沿って `lightdm` を入れてみます

`$ sudo apt install lightdm`

設定

```/etc/lightdm/lightdm.conf
[LightDM]
start-default-seat=false

[XDMCPServer]
enabled=true
port=177
```

起動

```
$ sudo service dbus start 
$ sudo /etc/init.d/lightdm start&
```

## VcxSrvで接続

XLaunch から， `Open session via XDMCP` で起動します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170422/969ba261-aeb5-0179-7546-29d5cae4249b.png)

`Connect to host` の部分に， WSL 側の ip アドレスを入力します
(おそらく `hostname -I` で出てきた値を入力すれば大丈夫なはず？)

うまく行っていればこのようにログイン画面が表示されると思います

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170422/1e584d98-e735-1d28-e847-625a6864b1fe.png)

ユーザ名とパスワードを入力したら，無事ログインできて XFce セッションが起動しました
(上の方で入れた `sudo apt install xfce4` だけだと，ログイン時にエラーが起きたので， `sudo apt install xubuntu-desktop` で改めてデスクトップ環境を入れています)

画面解像度を大きくした場合，マルチディスプレイで使う場合とかに，体感パフォーマンスが良くなっている気がするけど，定量的に測れていないので違いがよくわからず...

## 起動を自動化してみる

- この辺の起動処理を毎回やるのも面倒なので，一発で起動できるようなスクリプトをちょっと書いてみました

```.sh
#!/bin/sh
ip=`hostname -I`
vcxsrv.exe -ac -nodecoration -keyhook -multimonitors -query $ip &
sudo service dbus start
sudo service lightdm start
```

多分IPアドレス毎回入力するの面倒だと思うので，WSL 側から VcXsrv を起動して，起動オプションにIPアドレスを渡す形で実現しています

あとは必要に応じてこれを叩く bat などを書いてあげれば，Windows側から一発でWSLのGUI環境を起動できます

# 終わりに
以前WSL環境で遊んでたときと比べて，色々できること増えてて凄いなーというお気持ちでした (前試したときは日本語入力するだけですごい苦労していた記憶がある)

あとこれだけ設定したものの，実際この環境を常用するかと言われると... :thinking: 

まあそこは作ったデスクトップ環境のカスタマイズによるかもしれません

自分は `i3` 入れて Windows ではできなさそうな操作性にしてみたりして遊んでいました

まだ試していないですが，Windowsの上で動いているというWSLの利点を持ち出すなら， Wine とかがスムーズに使えると便利そう