WSL2入門メモ

windows上で超軽量なLinuxが動くようになったみたいなのでその入門メモです。
wsl2を導入してUbutuとCentOS7やCentOS8(無料)を入れて起動したり、エクスポートしたり削除したりするとこまで。
wsl1からwsl2への移行の話はありません。環境はWindows 10 Homeです。

# WSL2 (Windows Subsystem for Linux 2)とは

[Linux 用 Windows サブシステムとは](https://docs.microsoft.com/ja-jp/windows/wsl/about)
要するに超軽量な仮想PCを利用してwindowsからLinuxが動かせるという感じみたいです。正直ハイパーバイザー(Hyper-v)とかはまだよく分からない...
ターミナルから数秒でLinuxが起動して使える、ターミナルを閉じてしばらくするとLinuxが自動で終了する、とコマンドプロンプト開いてコマンド打つくらいの気軽さでLinuxが使えるようになったみたいです、凄い！
dockerとかも動くみたいなので、windowsでの開発が捗りそう。

# WSL2導入

まずWindowsをアップデートします。WSL2を使うにはWindows May Update 2020 (2004ビルド19041)以上が必要。
(私が導入した時点ではまだWindows Updateに来てなかったので[Windows 10 のダウンロード](https://www.microsoft.com/ja-jp/software-download/windows10)からアップデートしました。)

[Windows 10 用 Windows Subsystem for Linux のインストール ガイド](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)に従ってWSL2をインストールしていきます。
PowerShellを管理者として実行し、以下を実行します。

```powershell
# "Linux 用 Windows サブシステム" オプション機能を有効にする
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
# "仮想マシン プラットフォーム" のオプション コンポーネントを有効にする
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```
ここで一旦PCを再起動して以下コマンドを実行します。ここからはPowerShellを管理者として実行する必要はありません。

```powershell
# WSL 2 を既定のバージョンとして設定する
wsl --set-default-version 2
```

私は上記導入で上手く行かず、途中で[WSL 2 Linux カーネルの更新](https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel)から最新の WSL2 Linux カーネル更新プログラム パッケージをダウンロードしてインストール後再起動して進めたらいけました。

# Ubuntuのインストール
「Windows Store」から「Ubuntu」を検索してインストールします。終わり！簡単！
以下コマンドでインストール済みのディストリビューションの一覧が表示できます。

```powershell
wsl -l -v # wsl --list --verbose
```

起動

```powershell
wsl -d Ubuntu # wsl --distribution Ubuntu
```

初回起動時はLinux用アカウントとパスワードの設定を求められるので設定します。

# 双方向のアクセス
### linux側からwindows上のファイルシステムにアクセスする方法

+ 最初から`/mnt`にマウントされています。Cドライブなら`/mnt/c`です。

### windows側からlinux上のファイルシステムにアクセスする方法

+ linux上で`explorer.exe .`とするとエクスプローラーが起動します。

+ linuxを起動しておき、ファイラから`\\wsl$` (`\\wsl$\Ubuntu`)を直接開いてもアクセスできます。

# CentOSのインストール (コマンドからインストール)

「Windows Store」から「CentOS」を検索すると有料のものが出てきますが、githubでもWSL2用CentOSが配布されていてそちらなら無料で入れれるみたいです。

[https://github.com/yuk7/CentWSL/releases](https://github.com/yuk7/CentWSL/releases)でCentOS7もCentOS8も配布されています。
今回はCentOS8を入れてみます。もちろん両方入れることも可能です。

`Assets`のところにzipファイルがあるのでダウンロードして解凍します。
中の`CentOS8.exe`を実行してもインストールできますが、コマンドからインポートすれば任意の登録名でインストールでき、保存先も好きに指定できるので、せっかくなのでコマンドからインポートしてみます。
コマンドからのインポートなら同一ディストリビューションを複数インストールすることも可能です。

`rootfs.tar.gz`が入ってますがインポートするには`tar.gz`形式から`tar`形式に変換しないと駄目？みたいです。
windowsで変換する方法を調べましたが、すぐにもうそんなことを調べる必要は無いことに気づきました！
さっき入れたUbuntu上から変換してみます。以下例では`E:\wls2\images\CentOS8`下に`rootfs.tar.gz`を解凍した場合です。

```powershell
wsl -d Ubuntu
cd /mnt/e/wsl2/images/CentOS8
gzip -d rootfs.tar.gz
```

予め保存先ディレクトリを作ってからインポートします。
以下の例では`E:\wsl2\test`ディレクトリを作りそこにインポートしています。

```powershell
# wsl --import <任意の登録名> "<保存先パス>" "<rootfs.tarのパス>" --version 2
wsl --import test-centos8 "E:\wsl2\test" "E:\wsl2\images\CentOS8\rootfs.tar" --version 2
```
これでインストール完了です。`E:\wsl2\test`内に`ext4.vhdx`ファイルが生成されています。

# インストールしたLinuxの削除・エクスポート等

[Windows Subsystem for Linux のコマンド リファレンス](https://docs.microsoft.com/ja-jp/windows/wsl/reference)

エクスポートは以下コマンドでできます。インポートの方法は上のCentOSのインストールのところに記載してます。

```powershell
wsl --export <登録名> <保存先パス/ファイル名.tar>
```

削除は以下コマンドでできます。データ(`ext4.vhdx`)も削除されます。

```powershell
wsl --unregister <登録名>
```

# おまけ：Windows TerminalでWSL2をより便利に使う

いちいちPowerShellからコマンドでLinuxを起動するのも面倒なので「Windows Store」から「Windows Terminal」をインストールして設定していきます。
Windows Terminalを起動するとタブ横の「∨」をクリックするとインストール済みのディストリビューションの一覧が出てくるのでそこから開くだけでWSL2を起動できます。
また、Windows Terminal起動時にデフォルトでUbuntuを起動するようにしたり、起動時のディレクトリを設定することも可能です。
設定方法は「∨」→「設定」から`setting.json`を開きます。

```json:setting.json
{
  "$schema": "https://aka.ms/terminal-profiles-schema",

  "defaultProfile": "{********-****-****-****-************}",
~

  "profiles": {
    "defaults": {
      // Put settings here that you want to apply to all profiles.
    },
    "list": [
~
      {
        "guid": "{********-****-****-****-************}",
        "hidden": false,
        "name": "Ubuntu",
        "source": "Windows.Terminal.Wsl",
        "startingDirectory": "//wsl$/Ubuntu/usr/local"
      },
~
    ]
  },
~
}
```
+ `"profiles"`の`"list"`からデフォルトにしたいディストリビューションを探し、その`"guid"`の値を`"defaultProfile"`に設定するとWindows Terminal起動時のデフォルトに設定できます。
+ `"profiles"`の`"list"`からデフォルトにしたいディストリビューションを探し、`"startingDirectory"`を上の様に追記すれば起動時の開始ディレクトリを設定できます。

# docker

次はdockerを入れてみてる予定。
普通にlinuxに直接dockerを入れれば良い様な気がするけど、「Docker Desktop WSL 2」というのもあるみたいでその辺りも調べたい。