WSLでwindows上にLinuxのGUI環境を作る[メモ]

# 0. 前提
- 64-bit Windows 10で、OSビルドが14393より後ろであること(詳しくは参考のURL)

# 1. GUI環境を起動できるようにする手順
## Windows Subsystem for Linuxを入れる
#### Windows Power shell に以下を入力する。自動的に再起動が始まる。

``` bash
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
```

#### 再起動後Ubuntu をmicrosoft.comからインストールする。

https://www.microsoft.com/ja-jp/p/ubuntu/9nblggh4msv6?rtc=1

## VcXsrvを入れる
#### VcXsrvをsourceforgeから入手しインストールする。

https://sourceforge.net/projects/vcxsrv/

## xfceをUbuntuに入れる
#### ubuntuを起動してアカウントを作る。
#### xfceをインストールする

``` bash
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install xfce4-terminal
sudo apt-get install xfce4
```

もしapt-get install xfce4がうまく行かなければ`sudo apt-get install xfce4 --fix-missing`をする。
`sudo apt-get clean` をしてやり直すと直るかも？ 0.5GB程度、< １時間くらいかかった。
ちゃんと入っていれば、`sudo apt-get install xfce4`を行うと更新の必要がないよと言ってくれる。

#### ubuntuの環境変数の設定をする

必要ならエディタを導入する。たとえば`sudo apt install emacs`など。nanoやvimも入っている。

``` bash:.bashrc
export DISPLAY=:0.0
export LIBGL_ALWAYS_INDIRECT=1
```

を.bashrcに書き込み、ubuntuを立ち上げなおすか`source .bashrc`をする。
もしcygwinなどで0.0を使っている場合かちあってしまうので、適当に1.0や2.0などにする。

#### Xlaunchを起動する

VcXsrvをインストールできていればwindowsキーを押してxlaunchと打てば起動できる。 
cygwinなどを入れていると違うxlaunchが起動するかもしれないが、そっちでも問題はなさげ。

'One Window'を選択し、Display numberは0とする。もし`DISPLAY=:1.0`にしている場合は1にする。

後は「次へ」を押していき、~~最後の「完了」の所でsave configurationをしておく。~~
黒い画面がでればOK

#### xfceを起動する

Ubuntuに戻り、`startxfce4`をするとさっきの黒い画面にGUI環境が現れる。

# 2. ubuntu起動時に設定したXを行う方法

~/.bashrcに、すでに起動しているかどうかを判定して、**何らかの方法**でXを起動し、`startxfce4`をすればよい。


## <font color="LightCoral">~~Xlaunchを使う方法~~</font>
### <font color="LightCoral">~~windowsのシステム環境変数の変更~~</font>
<font color="LightCoral">
windowsのユーザー名が２バイト文字の人は、保存したconfig.xlaunchをダブルクリックで開こうとすると"fatal error cannot open a log file"などというエラーがでてxlaunchを起動できないことがある。</font>

<font color="LightCoral">
システム環境変数のTMPとTEMPに入っているusernameを処理できないのが問題のようである。"環境変数を編集"から、TMPとTEMPの変数値を２バイト文字の入っていないディレクトリに設定する(TEMPだけでよい？)。良い方法が分からないので自己責任になるが、ディレクトリを作ったうえでC:\TEMPORAL\TMPと設定した。</font>

<font color="LightCoral">
うまくできていればダブルクリックで開くことが出来る。なお"cannot establish listening socket"のエラーは既にそのソケット使って開いているから開けませんよというエラーなので問題はない。</font>

### <font color="LightCoral">~~ubuntuからwindowsのアプリケーションを開く方法~~</font>
<font color="LightCoral">
`cmd.exe /C start <filename>`
で開くことが出来る。このとき¥マークはエスケープ文字\になるので\<filename\>の記述は適宜修正する必要がある。
例えば`C:\foo\bar\config.xlaunch`を開きたいときは次のようになる。

```
NG cmd.exe /C start  C:\foo\bar\config.xlaunch
OK cmd.exe /C start 'C:\foo\bar\config.xlaunch'
OK cmd.exe /C start  C:\\foo\\bar\\config.xlaunch
```
</font>

<dl>
<font color="DarkRed">
<strong>
<h4>
これを.bashrcに書いて自動化すれば表題は達成するが、XLaunchを使わない方法をとることにする。
</h4>
</strong>
</font>
</dl>

## XLaunchを使わないで自動化する方法

上の方法ではubuntu側から起動しているかどうかの判定がしづらい。
それにubuntuから`cmd.exe /C start`ってなんかいけてない感ある。
そこでコンフィグファイルは使わず、
インストールしたVcXsrvディレクトリ内にあるvcxsrv.exeをオプション付きで起動することにした。

### vcxsrv.exeをubuntuから実行する。
インストールしたVcXsrvはデフォルトだと`/mnt/c/Program\ Files/Vcxsrv/`に入っている(パスは環境によるかも)。
`/mnt/c/Program\ Files/Vcxsrv/vcxsrv.exe -help`でオプションの一覧が現れるのを確認したら、.bashrc`の最後に次を追加する。

``` bash:.bashrc
if [[ $(ps -e| grep xfce4 | grep -v grep |wc -l) -eq 0 ]] ;then
    /mnt/c/Program\ Files/VcXsrv/vcxsrv.exe \
	:1 -screen 0 1024x768 \
	-xkblayout jp \
	-xkbmodel jp106 \
	-silent-dup-error &
    startxfce4  &
fi
```

これでとりあえず表題は達成するはず。

# 3. いくつかの問題

## startxfce4 の大量のwarning
次のupgradeをすると多少減る。

```
sudo apt-get upgrade gtk2-engines-pixbuf
```

また、root権限でXを起動してしまうと設定ファイル等がroot userで作られてしまって
通常のユーザーで起動するときに様々な問題が起きる。
`find ~/ -user root`をしてrootのxfce関連ファイルを見つけ、適宜削除すると解決する。

## vcxsrvを起動するとキーボードが勝手に変わる

今のところ簡単には解決できないっぽい。Windowsキー＋Spaceでいちいち変えている。
無料版Xmingユーザーは、バイナリをいじることで解決しているらしい。

## .bashrcをミスってubuntuが起動しなくなった時

うっかり.bashrcにexitをいれてしまったりすると
ubuntuが起動直後に終了してしまい困ったことになる。
.bashrcを編集したい。

https://askubuntu.com/questions/816732/how-to-change-default-user-in-wsl-ubuntu-bash-on-windows-10

を見るとcmd.exe経由でうまいことやる方法がありそう。
例えばrootで入っていじるとか。

ちなみに.bashrcはwindowsにおけるユーザー名を\<USER\>、WSLにおけるユーザー名を\<user\>とすると下記の場所にある。

```
C:\Users\<USER>.000\AppData\Local\Packages
\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\home\<user>\.bashrc
```

でもこういう形でのファイルの触り方は予定されていないはずなので極力避けたい。

## xfceのGUI環境下でダブルクリックしてファイルを開けない

ファイルを開こうとすると
Could not launch application failed to execute child process "xterm"(no such file or directory)
となってしまって開けない。
これはgnome-terminalを入れると直る。

```
sudo apt-get install gnome-terminal
```

xfceいれたのにgnomeもいれるの・・・という気持ちになるが
参考[2]によるとgnome-terminal.wrapperが必要らしい

## google-chrome, chromium-browserが起動しない
一度起動するが、その後どうやっても起動しない。
参考[3]を見つけたのでtherealkenec氏のコメントを元に次を試した。

```
sudo apt install ubuntu-desktop mesa-utils gdebi
sudo apt purge pulseaudio libpulse0 && sudo apt autoremove
sudo apt-get install xfce4
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
gdebi google-chrome-stable_current_amd64.deb
export NO_AT_BRIDGE=1
exec dbus-run-session -- bash
sudo service dbus start
google-chrome
```

安定して立ち上がるようになった。しかしgmailを開くとバグる。
依存関係があるといわれる下をインストールしてgoogle-chromeを入れなおしたが直らない。

```
sudo apt-get install libappindicator1
sudo apt-get install libgconf2-4 libnss3 libxss1
```

basic html形式で開くとgmailは問題なく使える。
https://mail.google.com/mail/u/0/h/1pq68r75kzvdr/?v%3Dlui
google calendarも問題ない。

## GUI環境で日本語が文字化けする

本記事にいただいたコメントによると、日本語フォントをインストールすることで解決するそうです。

```
sudo apt install fonts-takao
```

# 4. 参考
[1]WSLとxfceの導入の参考
https://github.com/QMonkey/wsl-tutorial
[2]xfceのGUI環境下でダブルクリック
https://askubuntu.com/questions/419641/panel-apps-try-to-launch-in-xterm-even-though-it-isnt-installed
[3]google chrome
https://github.com/Microsoft/WSL/issues/648#issuecomment-324562271