Windows環境のWSL2とDockerのある開発環境構築メモ2022/04

自分用のWindowsでの開発環境構築メモ。
Windows 10 Home対応。

何かの言語用の構築をするわけではないが、WSL2とDockerを準備するので、LinuxとWindowsのいいとこどりで大抵の開発環境構築の土台としては困らない。

# 他のマシンで元々使用しているWSL環境があればエクスポートしておく

```powershell:PowerShellユーザーモード
wsl --export Ubuntu ./Ubuntu.tar
```

Ubuntuの部分はDistro名なので環境によって異なる。
Distro名はWSL環境の一覧で確認できる。

```powershell:PowerShellユーザーモード
wsl -l -v --all
```



# Windows 10 2004 May 2020 Update以上にあげる

2020年5月末にアップデートのきたWindows 10でWSL2が正式版になったのでそれ以上にアップデートする。
普通にWindows Updateを定期的にかけていれば問題ないはず。

~~基本Windowsアップデートをかければいいが、ローリングアップデートなので、まだ来ていなければ[こちら](https://www.microsoft.com/ja-jp/software-download/windows10)にアクセスしてアップデートツールを使う。~~

# WSL2 を有効にする

[Windows Subsystem for Linux のインストール ガイド](https://docs.microsoft.com/en-us/windows/wsl/install)を元にインストールを進める。

以下のコマンドでWindowsのシステム設定、Linux Kernel等を含めて一気にインストールできる。
上記のインストールガイドにも書かれている。

```powershell
wsl --install
```

~~wslのバージョンを上げる前にLinux kernelをインストールする必要があるので、
[こちら](https://docs.microsoft.com/en-us/windows/wsl/wsl2-kernel)の手順からダウンロードしてインストールしておく。~~

# Ubuntu をインストール

Microsoft Storeからインストール。Distroは特に何か要件がなければUbuntuを選択。
2020/06時点ではUbuntu20.04が入る。

引き継ぐ環境がある場合は、エクスポートしておいたtarファイルを `~/AppData/Local/Ubuntu` に展開してインポートする。

```powershell:PowerShellユーザーモード
mkdir ~/AppData/Local/Ubuntu
wsl --import Ubuntu ~/AppData/Local/Ubuntu ./Ubuntu.tar --version 2
```

`~`はそのままでは認識しないのでTABキーでフルパスに変換する。

# Windows Terminal をインストール

Microsoft Storeからインストール。

設定ファイルのJSONを開いて、`defaultProfile`をUbuntuのGUIDで書き換える。

```
"defaultProfile": "{<UbuntuのGUID>}"
```

# ssh agentのセットアップ

【2023/02/15追記】
より良いツール**wsl2-ssh-agent**が現れたので、そちらを使うのが良さそう。
https://zenn.dev/mametter/articles/49a2b505ec0275
Windows側にファイルを配置したり等の作業が不要になる。

Windows側のssh-agentは動作している必要があるため、WindowsのOpenSSH Client Serviceを起動。

```powershell:PowerShell管理者モード
Start-Service ssh-agent
Set-Service -StartupType Automatic ssh-agent
```

あとはWSL側でwsl2-ssh-agentを導入する。
https://github.com/mame/wsl2-ssh-agent#1-install-wsl2-ssh-agent の手順に従ってwsl側にバイナリを配置し、`~/.bashrc`などに以下を追記する。

```
eval $(/path/to/wsl2-ssh-agent)
```

WSL側でkeyfileを生成してssh-agentに追加しておく。

```bash:keyfileを生成して追加
ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/id_ed25519
chmod 400 ~/.ssh/id_ed25519
ssh-add ~/.ssh/id_ed25519
```

# Docker Desktop for Windowsのインストール

[https://www.docker.com/products/docker-desktop](https://www.docker.com/products/docker-desktop) からダウンロードしてインストール。

Stableチャンネルで問題ない。

# VSCodeのインストール

[https://code.visualstudio.com/](https://code.visualstudio.com/)からインストール。

WSL環境との連携のために [Remote - WSL](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl)を導入。
導入しておけば、WSL側から`code`コマンドで立ち上げたときに必要なものを自動でインストールしてくれる。

# メモリ枯渇問題への対処

2020/06時点では[WSLが確保したメモリが解放されずにWindows側のメモリが枯渇してしまう問題](https://qiita.com/yoichiwo7/items/e3e13b6fe2f32c4c6120)があるようなので、WSLでの利用メモリの上限を設定しておく。

対処方法も上記のリンクに記載があるので対処しておく。

# WSL側にWindows側からlocalhostでアクセス出来るようにする

`%USERPROFILE%\.wslconfig` の設定ファイルに次の1行を追記する。

```
localhostForwarding=True
```

# systemd を有効にする

Windows 11のWSL2でUbuntu 22.04 LTSまでアップデートすると、ようやくWSLユーザー待望のsystemdを起動することができる。

Windows 11 かつ WSL2の環境は既に整っている前提で始める。

## WSLのバックアップ(exportをしておく)

[exportコマンド](#他のマシンで元々使用しているwsl環境があればエクスポートしておく)でWSL全体をバックアップしておき、まずいことがあれば何時でも戻せるようにしておく。

## Ubuntu 22.04にアップグレードする

ここからは、20.04 LTSから 22.04 LTSにアップグレードする手順を記載しているが、[Microsoft StoreにはUbuntu 22.04 LTS が公開されている](https://www.microsoft.com/store/productId/9PN20MSR04DW)ので、基本的にはそちらを新規インストールするほうがおすすめ。

Ubuntu 22.04 にアップグレードする要件は、64-bit Ubuntu 20.04 LTS/Ubuntu 21.10 であることなので、そこまでアップグレードが完了しているか確認する。

```sh
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.4 LTS
Release:        20.04
Codename:       focal
```

packageがすべて最新になっていることも必要なので、アップデートしておく。

```sh
$ sudo apt update
$ sudo apt upgrade -y
$ sudo apt dist-upgrade -y
```

アップデートした場合はrebootが必要なので、Powershellから`wsl -t <Distro>` `wsl -d <Distro>` で再起動しておく。

```sh
$ sudo do-release-upgrade -c -d
Checking for a new Ubuntu release
New release '22.04' available.
Run 'do-release-upgrade' to upgrade to it.
```

`New release '22.04' available.` を確認して次を実行する。(正式リリース前にアップグレードする場合は `-d` オプションが必要)

```sh
$ sudo do-release-upgrade
```

すべてインストールが完了したら、再起動する。

## /etc/wsl.conf にsystemd起動コマンドを追記

`/etc/wsl.conf` はDistro毎の設定を記述するもので、初期では存在していないのでなければファイルを作成する。
ファイルの仕様は[こちら](https://docs.microsoft.com/en-us/windows/wsl/wsl-config#set-wsl-launch-settings)を参照。

```txt:/etc/wsl.conf
[boot]
command = /usr/libexec/wsl-systemd
```

設定を追記したら再起動する。

## 確認

serviceのstatusを確認してみて、cronなどがrunninngであれば成功。

```sh
systemctl list-units --type=service
```

## 謝辞

systemdが使える件についてはこちらのTweetで教えてもらいました。感謝🙌
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Windows11のWSL2だとUbuntu22.04で /etc/wsl.conf に<br>[boot]<br>command = /usr/libexec/wsl-systemd<br>と書くとsystemd使えるらしい。なおワイWindows11環境がないので確認できず。 <a href="https://twitter.com/hashtag/wsl2?src=hash&amp;ref_src=twsrc%5Etfw">#wsl2</a> <a href="https://twitter.com/hashtag/ubuntu?src=hash&amp;ref_src=twsrc%5Etfw">#ubuntu</a> <a href="https://twitter.com/hashtag/jammy?src=hash&amp;ref_src=twsrc%5Etfw">#jammy</a> <a href="https://twitter.com/hashtag/windows11?src=hash&amp;ref_src=twsrc%5Etfw">#windows11</a></p>&mdash; 情報弱者であると同時に、情感弱者 (@joukan_jakusha) <a href="https://twitter.com/joukan_jakusha/status/1517810473550237697?ref_src=twsrc%5Etfw">April 23, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>