WSL2(Windows Subsystem for Linux2)の概要と導入

# はじめに
[WSL(Windows Subsystem for Linux)の概要と導入](https://qiita.com/na-777/items/615d98f30eef53d1ce67)にて、WindowsでUbuntuのコマンドラインを利用できる様になりましたが、完全なLinuxの互換性はありませんでした。そこで、システムコールの完全な互換性をサポートした、WSL2を利用してみます。
# 環境
- OS: Windows10 Pro 64bit
    - Version: 1909
    - OS build: 18363.1256

## WSL2の要件
- x64 システム
    - Version: 1903 以降
    - OS build: 18362 以上
- ARM64 システム
    - Version: 2004 以降
    - OS build: 19041  以上

# WSL1からの変更点
WSL1からWSL2にバージョンアップしましたが、大きな変更点は

- ファイル システム パフォーマンスの向上
- システム コールの完全な互換性のサポート

この2点です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149438/3379b4d1-9ce5-d4b2-302a-5ef71acb97f3.png)
参照：[WSL 2 と WSL 1 の比較 | Microsoft Docs](https://docs.microsoft.com/ja-jp/windows/wsl/compare-versions)

ただし、WindowsファイルシステムとWSL2ファイルシステム間でのファイル共有速度は遅いようです。
# WSL2の構成
アーキテクチャ自体も大きく変わっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149438/e9368ddf-3527-1ed1-2d84-dad4cf764cdc.png)
参照：[完全なLinuxがWindows 10上で稼働する？　「WSL 2」とは：Windows 10 The Latest - ＠IT](https://www.atmarkit.co.jp/ait/articles/1906/14/news019.html)
WLS1では、Linuxカーネルは存在せずエミュレートしていましたが、WSL2では「軽量LinuxユーティリティVM」という仮想マシン上で動作します。仮想マシン上で動作するものの、

- 使い勝手はWSL1と同等
- WSL1よりも少ないメモリ使用量
- WSL1より高速なファイルIO

Microsoftによってチューニング、ビルドされたLinuxカーネルで、通常の仮想マシンに比べて高速に動作します。

# インストール手順
参照：[Windows Subsystem for Linux (WSL) を Windows 10 にインストールする | Microsoft Docs](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)

## WSLの機能を有効化
PowerShellを管理者権限で開き、WSLの機能を有効化します。

```powershell:powershell
> dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

展開イメージのサービスと管理ツール
バージョン: 10.0.18362.1139

イメージのバージョン: 10.0.18363.1256

機能を有効にしています
[==========================100.0%==========================]
操作は正常に完了しました。
```

## 仮想マシン機能を有効化
すでに要件を満たしたWindowsバージョンなので、仮想マシン機能の有効化を実施します。

```powershell:powershell
> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

展開イメージのサービスと管理ツール
バージョン: 10.0.18362.1139

イメージのバージョン: 10.0.18363.1256

機能を有効にしています
[==========================100.0%==========================]
操作は正常に完了しました。
```

## Linuxカーネル更新プログラムパッケージのインストールと設定
[x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ](https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi)
上記リンクからパッケージをダウンロードし、インストールを実行します。
その後、PowerShell上でWSL2を規定バージョンとして設定します。

```powershell
> wsl --set-default-version 2
```

## Linuxディストリビューションのインストール
今回はUbuntu20.04をWSL2用にインストールします。
[Ubuntu 20.04 LTS を入手 - Microsoft Store](https://www.microsoft.com/ja-jp/p/ubuntu-2004-lts/9n6svws3rx71?rtc=1&activetab=pivot:overviewtab)
上記リンクを開き「入手」ボタンを押すと、Microsoft Storeが開きます。その画面でもう一度「入手」ボタンを押します。ダウンロード完了後、Ubuntuを起動を選択するとshellが起動します。

```shell
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: username
New password:
Retype new password:
passwd: password updated successfully
```
username/passwordを設定すると完了です。PowerShellでディストリビューションを確認します。

```powershell:powershell
> wsl -l -v                                                                                           NAME            STATE           VERSION
* Ubuntu-18.04    Running         1
  Ubuntu-20.04    Installing      2
```

あと便利なので[Windows Terminal](https://www.microsoft.com/ja-jp/p/windows-terminal/9n0dx20hk701?activetab=pivot:overviewtab)もインストールしておきましょう。
参照：[Windows ターミナルのインストール | Microsoft Docs](https://docs.microsoft.com/ja-jp/windows/terminal/get-started)

また、デフォルトで起動するディストリビューションをUbuntu20.04に変更します。

```powershell:powershell
> wsl -s Ubuntu-20.04
> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-20.04    Running         2
  Ubuntu-18.04    Running         1
```
# 挙動確認
Ubuntu20.04にログインして操作を実施してみます。

```powershell:powershell
> wsl
username@DESKTOP-V2VK678:/mnt/c/Users/xxx $ sudo apt update && sudo apt upgrade
[sudo] password for xxx:
```
デフォルトではWSL2にマウントされたWindows側のファイルシステムディレクトリにログインするようです。
Windows Terminalの設定を変えてみます。Windows Terminalを起動し「▽」->「設定」を選択し、settings.jsonを開きます。

```json:settings.json
            {
                "guid": "{07b52e3e-de2c-5db4-bd2d-ba144ed6c273}",
                "hidden": false,
                "name": "Ubuntu-20.04",
                "source": "Windows.Terminal.Wsl",
                "startingDirectory": "//wsl$/Ubuntu-20.04/home/username" # 追加
            }
```
この設定は`//wsl$/イメージ名/パス`という構成です。
保存後、再度Ubuntu20.04をWindows Terminalで開くと設定が反映されています。

# まとめ
WSL2と聞くと、WSLのバージョンアップのように聞こえますが、アーキテクチャを見るとほとんど別物になりました。
特に「システム コールの完全な互換性のサポート」は良いですね！
WSL1とWSL2は棲み分けされているため、しばらくは両方ともサポートが続くようですが、特殊な用途でない限りはWSL2を利用するのが無難そうです。