Windows10 HomeのWSLをWSL2にアップグレードしてみた

## はじめに

WSL2にアップグレードする前に、[Windows10 バージョン2004 ビルド19041に上げてみた](https://qiita.com/homelan/items/eb5d404b1e67b8daf555)をご覧ください。

WSL2へのアップグレード方法について、[Windows 10 用 Windows Subsystem for Linux のインストール ガイド](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)に書かれているようだが、WSLのインストール方法しか見つからない。「[WSL 2 に更新する](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10#update-to-wsl-2)」とあるが、項目だけで、アップグレード方法らしき手順が見当たらない。

どうも、話しをまとめると、次の2点ができていれば良いだけらしい。

* `Windows Subsystem for Linux`(`Linux用Windowsサブシステム`)のインストール
* `仮想マシン プラットフォーム`をインストール

しかしながら、後で分かることだが、次の手順も必要。

* インストール済みのLinuxディストリビューションをWSL2に設定
    * コンテナファイルをWSLからWSL2に変換するために、**なんと、1ディストリビューション当たり1時間コース！！**
* `WSL2 Linuxカーネル更新プログラム`をインストール
* `仮想ハードディスクファイルの圧縮と暗号化`を解除

## アップグレード手順？

次に混乱したのが、PowerShellのコマンドしか載っていないこと。
WindowsユーザはGUIだからWindowsを使い続けるのであって、コマンドラインベースの手順しか載せていないところから、この記事が広くWindowsユーザを対象としていないことが分かる。もちろん、Windows上でLinuxを動かそうとしているユーザはLinuxユーザに違いない訳だから、shellで書いてあるなら納得が行く。
PowerShellのような、どこから生まれた思想なのかも分からないコマンドを載せられても、誰も分からないし、戸惑うだけだと思います。

### GUIの場合
という訳で、GUIからWSL2を有効化する方法は次の通りです。

1. [スタートメニュー]をクリックする。
1. [設定]をクリックする。
1. [アプリ]をクリックする。
1. [オプション機能]リンクをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332590/38d8e44b-1010-8832-54c6-580233ebd0b8.png)
1. [Windowsのその他の機能]リンクをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332590/b992dc42-c10c-2a81-acc3-f56eedb49ac2.png)
1. `[Windowsの機能]`ダイアログが表示されるので、`[Linux用Windowsサブシステム]`にチェックが付いていることを確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332590/db22866d-343e-a59c-23fb-8345a9ab2d86.png)
1. `[仮想マシンプラットフォーム]`にチェックを付ける。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332590/d877cccb-3e76-4a06-727d-e696c224850f.png)
1. 再起動を伴うため、まとめて再起動しましょう。`[OK]`ボタンをクリックする。
1. `[今すぐ再起動]`ボタンをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332590/1ad69c45-d41a-27bc-38c3-f129c5817534.png)

### CUIの場合
みんな大好きPowerShell(CUI)では、次のコマンドを実行します。

1. `PowerShell`か`管理者としてコマンドプロンプトを起動`します。
1. `[Linux用Windowsサブシステム]`を有効化する。

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

1. `[仮想マシンプラットフォーム]`を有効化する。

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

1. `オプションの機能`が有効化されていることを確認する方法は次の通りです。`grep`のやり方が分からないので、ガンバってみてください。

    ```powershell
    dism.exe /online /get-features
    ```

    ```text
    機能名 : Microsoft-Windows-Subsystem-Linux
    状態 : 有効
    
    機能名 : VirtualMachinePlatform
    状態 : 有効
    ```

## インストール済みのLinuxディストリビューションをWSL2に設定

1. インストール済みのLinuxディストリビューションの一覧を表示する。

    ```shell
    wsl --list --verbose
    ```

    ```text
      NAME          STATE           VERSION
    * Ubuntu        Stopped         1
      kali-linux    Stopped         1
    ```

1. ここでは、インストール済みの`Ubuntu`をWSL2にアップグレードします。

    ```shell
    wsl --set-version Ubuntu 2
    ```

## `WSL2 Linuxカーネル更新プログラム`をインストール

1. おや？
指示通り、https://aka.ms/wsl2kernel にアクセスします。
[WSL 2 Linux カーネルの更新](https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel)にリダイレクトされます。

    ```text
    変換中です。この処理には数分かかることがあります...
    WSL 2 を実行するには、カーネル コンポーネントの更新が必要です。詳細については https://aka.ms/wsl2kernel を参照してください
    ```

1. CPUアーキテクチャに従い、次のいずれかをダウンロードする。
    * [x64マシン用のLinuxカーネル更新プログラム](https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi)
    * [ARM64マシン用のLinuxカーネル更新プログラム](https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_arm64.msi)

1. `wsl_update_x64.msi`をダブルクリックして起動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332590/6e7ceaaa-98f5-3cb8-d36e-4083af170f9b.png)

1. インストールが終了すると、次の画面が開くので、`[Finish]`ボタンをクリックする。

1. もう一度、次のコマンドを実行します。

    ```shell
    wsl --set-version Ubuntu 2
    ```

## `仮想ハードディスクファイルの圧縮と暗号化`を解除

1. おや？
エラーメッセージが変わった！急いでいるんですけど．．．。

    ```text
    変換中です。この処理には数分かかることがあります...
    WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
    仮想ディスク システムの制限により、要求された操作を完了できませんでした。仮想ハード ディスク ファイルの圧縮と暗号化が解 除されている必要があります。また、仮想ハード ディスク ファイルをスパースに設定することはできません。
    ```

1. [このページ](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)に「この問題の最新情報が追跡されている [WSL Github スレッド #4103](https://github.com/microsoft/WSL/issues/4103) を参照してください。」とあるので、アクセスした。

1. 要するに、`%USERPROFILE%\AppData\Local\Packages\CanonicalGroupLimited.*`というフォルダの圧縮と暗号化を解除する必要がある。

1. `Windows Explorer`で`%USERPROFILE%\AppData\Local\Packages`フォルダを開く。
1. `CanonicalGroupLimited.UbuntuonWindows_*`で始まるファイルを探し、[右クリック]-[プロパティ]を開く。
1. `[詳細設定]`ボタンをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332590/eb4a52eb-6001-649e-d928-d9aefbb38b60.png)
1. `[内容を圧縮してディスク領域を節約する]`のチェックを外し、`[OK]`ボタンをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332590/0a24104e-0a2c-9132-b3a9-a72de982de3f.png)
1. 元の`[プロパティ]`ダイアログに戻るので、`[OK]`ボタンをクリックする。
1. `[属性変更の確認]`ダイアログが開くので、`[変更をこのフォルダー、サブフォルダーおよびファイルに適用する]`が選択されていることを確認し、`[OK]`ボタンをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332590/b2dd8c13-8a82-ef46-3b56-cb222b389c25.png)
1. `[属性の適用エラー]`ダイアログが開くので、`[すべて無視]`ボタンをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332590/76611d02-f1d2-025d-d5f8-bdd63f16d3bf.png)
1. `属性の適用中`ダイアログが開いて、変換処理が開始する。`残りおよそ2時間45分`．．．。
1. さらに、もう一度、次のコマンドを実行します。

    ```shell
    wsl --set-version Ubuntu 2
    ```

    ```text
    変換中です。この処理には数分かかることがあります...
    WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
    変換が完了しました。
    ```

1. ようやく終わりました。

    ```shell
    wsl --list --verbose
    ```

    ```text
      NAME          STATE           VERSION
    * Ubuntu        Stopped         2
      kali-linux    Stopped         1
    ```

### WSL2をデフォルトに設定

1. WSL-WSL2の変換はもう懲り懲りなので、WSL2をデフォルトに設定します。

    ```shell
    wsl --set-default-version 2
    ```

1. が、次のどのディストリビューションをダウンロードしても、WSL2ではエラーになってインストールできませんでした。
WSLに変更すると、正常にインストールできるため、WSL-WSL2変換は避けては通れない？
この辺りは宿題です。

### `Ubuntu 20.04 LTS`
1. `Microsoft Store`から`Ubuntu 20.04 LTS`を`インストール`する。
1. 一時的に、`WSL`に戻す。

    ```shell
    wsl --set-default-version 1
    ```

1. `Microsoft Store`から`Ubuntu 20.04 LTS`を`起動`する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332590/b8a7775b-d5a1-6181-1157-9a2ee7478ba6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332590/718e461d-c9d6-6ac5-ea66-45d2b67eae5b.png)
1. `Windows Explorer`で`%USERPROFILE%\AppData\Local\Packages`フォルダを開く。
1. `CanonicalGroupLimited.Ubuntu20.04onWindows_*`で始まるファイルを探し、[右クリック]-[プロパティ]を開く。
1. `[詳細設定]`ボタンをクリックする。
1. `[内容を圧縮してディスク領域を節約する]`のチェックを外し、`[OK]`ボタンをクリックする。
1. 元の`[プロパティ]`ダイアログに戻るので、`[OK]`ボタンをクリックする。
1. `[属性変更の確認]`ダイアログが開くので、`[変更をこのフォルダー、サブフォルダーおよびファイルに適用する]`が選択されていることを確認し、`[OK]`ボタンをクリックする。
1. `[属性の適用エラー]`ダイアログが開くので、`[すべて無視]`ボタンをクリックする。
1. `属性の適用中`ダイアログが開いて、変換処理が開始する。`残りおよそ7時間30分`．．．。
**筆者の環境では40分程で完了。**
1. 次のコマンドを実行し、`WSL`から`WSL2`に変換する。
**筆者の環境では5分程で完了。**

    ```shell
    wsl --set-version Ubuntu-20.04 2
    ```

    ```text
    変換中です。この処理には数分かかることがあります...
    WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
    変換が完了しました。
    ```

1. ようやく終わりました。

    ```shell
    wsl --list --verbose
    ```

    ```text
      NAME          STATE           VERSION
    * Ubuntu                 Stopped         2
      Ubuntu-20.04           Stopped         2
    ```

1. `WSL2`に戻す。

    ```shell
    wsl --set-default-version 2
    ```

## さいごに

`Edge`はChromeのダウンローダー、`PowerShell`はWSLのインストーラーとして活躍の場を見出すことができました。1つのディストリビューションコンテナがあれば、Dockerを試せるので、次は、[WSL2上でDockerを動かすこと](https://docs.docker.com/docker-for-windows/install-windows-home/)にチャレンジしたいと思います。