WSL2,WSLgを使ったWindows上の開発環境構築2022版

2022-12-27 現在では、Microsoft Storeからダウンロード・インストールするWSLが何も考えずにWSL2、WSLgがインストールされます。以下の記事は古すぎるため実施すべきではないです。

(あちこちから情報を持ってきたので、不足と重複があるかもしれないので、徐々にブラッシュアップします。）

### Windows上でサーバーサイド開発の環境を整える手法

まずサーバーサイド開発環境とはLinuxサーバでの動作と同じものを作るというのが大前提。さらにシェアの多さで言えばUbuntuかCentOS（うちではデスクトップアプリをサーバーサイドで動かすことも多いのでUbuntuを標準にしてる）

WindowsマシンでUbuntuを使うには以下の複数の選択肢がある

- Windowsをぶっこ抜いてUbuntuをクリーンインストール
    - 実はこれでも十分。一番シンプル。MS-Officeが使えない、ゲームができないという以外に不便はない。
- WindowsとデュアルブートでUbuntuを入れる
    - 買ったばかりのPCでキーボードが反応しないとかの初期不良を追求するにはプリインストールのOSは残しておいた方がいい。起動しなおせばWindowsだって使える。
- Windows上にWSL1
    - 2020年では一番初心者向き
    - ただちょっと特殊なLinuxなので、Dockerが使えないなどの「今どきの開発環境にしては不便」な点が残る
    - MicrosoftがWSL2を激推ししているのでWSL1へのサポート情報がどんどん減ってる
- Winodws11上にWSL2
    - 2022年ではおそらくこれがデファクト
    - 仮想マシン上でのLinuxなのでほぼ完全なLinux
    - ただしWSL1でできた「Windowsとのシームレスな連携」は逆になくなる
    - Windowsとのシームレスな連携がないならもうデュアルブートでいいじゃないって発想に戻る

ここではWindows11上にWSL2を入れるという前提でセットアップ方法を示す。
WSL1とWSL2の使い分けに関しては、別記事で解説する。

### 以下セットアップ手順

#### 準備するもの

- Windows11(Windows10の例がどんどん減ってるからやめたほうがいい）
- WindowsTerminal（WSL1,WSL2,PoserShellにまたがってアクセスするにはこの一択）

ここで指すGUI込のUbuntuの再現はWSLではWSLgと呼ばれており、WSLgの前提がWindows11なのでそれを指す。
https://github.com/microsoft/wslg#pre-requisites
ここの記事ではGPUドライバを最新化するように指定されいたが、私の環境ではIntelGPUドライバは最新版であったので特に何もしていない。

#### 以下手順

Windows-Terminalを管理者権限で起動する。

```lang:powershell
# WSLの機能をONにする
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
# OSの仮想マシンの機能をONにする
Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
```
さらにWSL2向けのカーネル更新パッケージをインストールする

https://docs.microsoft.com/ja-jp/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package

さらに、WSLを最新版にupdateする

```
wsl --update
```

おさらいすると以下の4点をやってる。一気にできればいいんだけど、それぞれ目的が違うので受け入れる。

- WSLの機能をONにする（これはWSL1のときも必要だった）
- Windows側の仮想マシンの機能をONにする（これはWSL1のときには必要なかった）
- Linuxカーネルを最新化する
- WSLを最新化する

Linuxカーネルの最新化とWSLの最新化でおそらくWSL2がWSLgというやつになってるんだと思う。

次にWSL上にUbuntuを入れる。入れれるディストリビューションの一覧はこのように参照できる。

```
 wsl --list --online
インストールできる有効なディストリビューションの一覧を次に示します。
'wsl --install -d <Distro>' を使用してインストールします。

NAME            FRIENDLY NAME
Ubuntu          Ubuntu
Debian          Debian GNU/Linux
kali-linux      Kali Linux Rolling
openSUSE-42     openSUSE Leap 42
SLES-12         SUSE Linux Enterprise Server v12
Ubuntu-16.04    Ubuntu 16.04 LTS
Ubuntu-18.04    Ubuntu 18.04 LTS
Ubuntu-20.04    Ubuntu 20.04 LTS
```

ちゃんとバージョン指定してインストールする。

```
 wsl --install -d Ubuntu-20.04
```

そして、ここで私は既にWSL1上にUbuntu18を入れているのが特殊環境。ディストリビューションごとにWSL1かWSL2かは選べる。複数のディストリビューションを入れることでWSL1とWSL2を共存させることができる。ただし2022年以降の人が無理にWSL1を入れる必要はない（事例もどんどん減っていくはず）

インストールしているWSLをみるとこんな感じ

```
PS C:\Users\yugoy> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-18.04    Running         1
  Ubuntu-20.04    Running         2
```

とりあえず以前入ってるWSL1をデフォルトにしている。
（しばらくは機能比較のために両方を使う予定）

WSL2にインストールができると、WindowsTerminalからも接続先の選択肢加わってる（これがWindowsTerminalの超便利機能）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53489/b0ce7578-5af1-2cf8-6b5f-4594ae60d4f9.png)

Ubuntu20.04を選択してタブを開く。

GUIつきアプリが起動するかどうかをテストするには、昔ながらの方法でxeyesを使う。（これ30年以上変わらない)

まずはxeyesが含まれるパッケージをインストール

```
sudo apt install x11-apps
```

xeyesを起動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53489/2743dc03-11fa-4b86-97f3-63cce534e9f7.png)

成功。<del>そして面白いのはどこにもX-Serverが起動してないというところ。X-ServerでGUIを受けるのではなく、RPD(リモートデスクトップ）でWindowsからLinuxを覗きにいってるというのが特徴。仮想化＋RDPという超昔ながらの技術ではあるものの、LinuxカーネルをいじったりGPUドライバをいじることで「仮想マシンで起動してる別OSを部分的に覗きに行く」ことに成功している。</del>
2022-05-26 修正
`wsl --sytem` でログインすると westonがプロセスとして存在しました。westonのバックエンドにrdbを結びつけてるみたいです。

```
# pgrep -fa  wayland
664 /usr/bin/weston --backend=rdp-backend.so --xwayland --shell=rdprail-shell.so --logger-scopes=log,rdp-backend,rdprail-shell --log=/mnt/wslg/weston.log
```

WSL2はネットワーク通信が遅いと言われていたので、スピードテストをしてみる。

CLIで動くスピードテストをインストール

```
wget -O speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py
chmod +x speedtest-cli
```

起動するとPythonが入ってないとのこと

```
sudo apt install python
$ E: Package 'python' has no installation candidate
```


pythonがないのはパッケージマネージャーが古いから

```
sudo apt update
```

再度チャレンジ

```
sudo apt install python
```
これでPythonが入った。Ubuntu20でもPythonコマンドで入るのは2.7


あらためてスピードテスト

```
$ ./speedtest-cli
Retrieving speedtest.net configuration...
Testing from DTI (153.232.40.31)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by Kobayashi Family Net (Tokyo) [0.89 km]: 9.184 ms
Testing download speed................................................................................
Download: 172.91 Mbit/s
Testing upload speed................................................................................................
Upload: 111.50 Mbit/s
```

十分なスピード。

あとはどうせ自分しか使わないので、デフォルトのログインユーザをrootにしちゃう。
https://devlights.hatenablog.com/entry/2021/05/29/070000#etcwslconf-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%9C%E3%82%8B

を参考に/etc/wsl.confを設定。

サーバーを再起動。ディストリビューション単位で再起動するには、PowerShellで以下のコマンドを実行。

```
wsl -t Ubuntu-20.04
```

### ここからGUIアプリのインストール

GUIアプリといっても欲しいのはChrome。手元のUbuntuでChromeが動けばクラウドサーバーのUbuntuでGUIつきChromeの開発環境になりうる。

Google Chromeのインストール
https://postgresweb.com/install-google-chrome-ubuntu-20-04
を参考にインストール
フォントが化けてる状態 → でもこれで動くっちゃぁ動く

https://qiita.com/SoraKumo/items/f83548efde26788a1fc7
を参考に
vi /etc/fonts/local.conf
でフォントを設定しWSL2を再起動すれば日本語もレンダリングされる。

Ubuntu上でIMを入れる方法もあるようだけど、2022-01-06 時点のWSLgでは、Windows上でコピーした日本語をUbuntu上のアプリにペーストすることもできたので一旦は不要。

フォントはガビガビしているが、Ubuntu上のChromeで動画も見れるし音声もステレオでしっかり再生される。テスト環境としては100点。ただし普段使いのChromeややディタまでWSLg上のアプリで使えるかというとそこまでのUIにはなってないしやる必要がない。

とりあえず、GUIつきのChromeが入ったことで、Seleniumで起動されるChromeやChromeDriverがUbuntuで完結するようになった。普段使いのChromeのバージョンアップなどに影響されないので便利とも言えるし、普段使いのChromeが自動化できないという点はWSL1からのマイナスとも言える。