Windows 11のWSL2（Ubuntu 22.04）：systemd + docker環境構築 

# 1. はじめに

## 1.1. 動機

- 新しくPC（windows 11）を導入しました。
- これまでデュアルブートでWindowsとLinux(Ubuntu)を切り替えて使っていた運用していましたが、古いPCをLinux専用機にして、新しいPCはWindows主体でWSL2でLinuxで遊ぶ感じで使用しようと思います。
- 本記事ですが、多くの記事を引用します（各種知見を適用、組み合わせております）。参考資料著者の皆様、誠にありがとうございます。

## 1.2. 開発環境

- OS: Windows 11 Pro 21H2
- CPU: Core(TM) i7-12700
- RAM: 32GB
- 利用ツール
  - PowerShell 5.1.22000.653
  - windows termilal 1.13.11432.0

## 1.3. 参考資料

| No. | URL | 説明 |
| :-- | :-- | :-- |
| [1] | [WSL2の Ubuntu 20.04 を 22.04 へアップグレードしてみた](https://qiita.com/j-baba/items/c2e6426c9b32685ec082) | 2.2. Ubuntuを22.04にアップグレード　で参照 |
| [2] | [【WSL2】Ubuntu22.04にアップグレードしたあとにやったこと](https://zenn.dev/holliy/scraps/48fd5bcdc0bade) | 2.3. Ubuntu 22.04にアップグレードした後の設定　で参照 |
| [3] | [WSL2 (Ubuntu 20.04 LTS) と Docker をセットアップしたときにやったこと](https://blog.tsukumijima.net/article/ubuntu-wsl2-docker-setup/) | 2.3. Ubuntu 22.04にアップグレードした後の設定　で参照 |
| [4] | [Install Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/) | 2.4. Dockerインストール　で参照 |

# 2. 構築

## 2.1. WSL2でUbuntu 20.04をインストール

- Powershell を管理者モードで開きます。
- wslコマンドを使ってインストールします。
    - ```wsl --list --online```にて、インストール可能なディストリビューション一覧が表示される。ここでは、Ubuntuを選択する。（2022年7月時点では、Ubuntu 20.04がインストールされます。）
    - MS StoreにもUbuntuアプリがあるが、そちらはpathの自動変換がないようなので使用しません。
- インストール中に、ユーザ名とパスワードの入力があるので、適当に済ませます。

```bash
PS > 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

PS > wsl --install -d Ubuntu
(インストールが始まる)
```

## 2.2. Ubuntuを22.04にアップグレード

- インストールは参考資料[1]の通りです。
- Ubuntu 22.04にアップデートする理由は、22.04から組み込まれるwsl-systemd（後述）を利用したいためです。
    - WSL2では、公式ではsystemdを使用できません。サービス起動にはserviceコマンドを利用しています。
    - でも、やはり馴染みのあるsystemdが使えると便利です。

## 2.3. Ubuntu 22.04にアップグレードした後の設定

- iptables-legacyの設定は参考資料[2]の通りです。
- wsl-systemdの設定は参考資料[2]の通りです。/etc/wsl.confの設定まで実施します。
- systemdの自動起動サービスについては、参考資料[3]をもとに、以下のサービスを停止します。

```bash
$ sudo systemctl disable multipathd
$ sudo systemctl disable sshd
$ sudo systemctl disable systemd-remount-fs.service
$ sudo systemctl disable getty@tty1
$ sudo systemctl mask systemd-remount-fs.service
$ sudo systemctl mask systemd-udevd.service
$ sudo systemctl mask snapd.service
$ sudo systemctl disable snap.lxd.activate.service
```

- windows termilalには、コマンドラインを```C:\windows\system32\wsl.exe ~ -d Ubuntu /usr/libexec/nslogin /bin/bash```に変更します。

![windows-terminal-setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624259/3d0e8043-37b4-055f-a9bc-276a797cc9bb.png)

## 2.4. Dockerインストール

- 参考資料[4]の通りにインストールします。
- dockerコマンドを通常ユーザで実行できるよう、```sudo gpasswd $USER docker```でdockerグループを追加します。

# 3. 起動確認

- 起動したときのプロセス稼働状態は以下の通りとなります。
    - このとき、必ず```journalctl -xe```でジャーナルファイルを確認しましょう。予期せぬコアダンプをしている場合があります。
    - windows terminalのコマンドラインを変更しているので、terminalにログインするとsystemdがPID=1で起動したように見えます。
- sudo systemctl status サービスを実行すると、systemdでサービスをコントロールできます。ここでの例では、docker.serviceの状態を確認しました。 

```bash
$ ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  1 00:05 ?        00:00:00 /lib/systemd/systemd --unit=multi-user.target
root          42       1  0 00:05 ?        00:00:00 /lib/systemd/systemd-journald
root          82       1  0 00:05 ?        00:00:00 snapfuse /var/lib/snapd/snaps/core18_1705.snap /snap/core18/1705 -o
root          83       1  0 00:05 ?        00:00:00 snapfuse /var/lib/snapd/snaps/lxd_14804.snap /snap/lxd/14804 -o ro,n
root          84       1  0 00:05 ?        00:00:00 snapfuse /var/lib/snapd/snaps/snapd_7264.snap /snap/snapd/7264 -o ro
systemd+      92       1  0 00:05 ?        00:00:00 /lib/systemd/systemd-networkd
message+      95       1  0 00:05 ?        00:00:00 @dbus-daemon --system --address=systemd: --nofork --nopidfile --syst
root          97       1  0 00:05 ?        00:00:00 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
root          98       1  0 00:05 ?        00:00:00 /usr/libexec/polkitd --no-debug
syslog        99       1  0 00:05 ?        00:00:00 /usr/sbin/rsyslogd -n -iNONE
root         100       1  0 00:05 ?        00:00:00 /lib/systemd/systemd-logind
systemd+     109       1  0 00:05 ?        00:00:00 /lib/systemd/systemd-resolved
root         110       1  0 00:05 ?        00:00:00 /usr/sbin/ModemManager
root         119       1  0 00:05 ?        00:00:00 /usr/sbin/cron -f -P
root         122       1  0 00:05 ?        00:00:00 /usr/bin/containerd
root         124       1  0 00:05 ?        00:00:00 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-s
root         128       1  0 00:05 tty1     00:00:00 /sbin/agetty -o -p -- \u --noclear --keep-baud console 115200,38400,
root         149       1  1 00:05 ?        00:00:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.so
tomoten      306       0  0 00:05 pts/0    00:00:00 /bin/bash
tomoten      312     306  0 00:05 pts/0    00:00:00 ps -ef

$ sudo systemctl status docker.service
[sudo] password for tomoten:
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2022-07-14 00:05:33 JST; 5min ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 149 (dockerd)
      Tasks: 15
     Memory: 114.5M
     CGroup: /system.slice/docker.service
             └─149 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
(以下略)
```

# 4. おわりに

- windows terminalからUbuntuを起動すると、体感2秒でUbuntuが使用できるようになるので、ちょっとした検証をしたいときに便利であるとわかりました。
    - systemdの多くの自動起動プロセスをdisableにしているのも効果的なようです。
- Ubuntuが起動した状態でsystemdが使用可能な状態のため、仮想マシンに近い使用感で扱えるのが良いです。