知らぬうちにWSLがCドライブ以外のところにインストールされてた件

## TL;DR

Windowsの設定で `システム＞ストレージ＞新しいコンテンツの保存先` をCドライブに設定
Xboxのインストール先設定もできればCドライブに
困ったら `C:/Program Files/WindowsApps` で `ls` すると壊れたかインストール先が違うかを確認
**英語で**検索するとより多い情報が出ることもある

## あれ？更新ができないぞ？

定期的にDocker desktopが使えなくなる癖があって、そのたびにDocker desktopの再インストール、古いバージョンのインストールなどをするようにしています。

ある日再インストールの途中で「Docker Desktop - WSL update failed」と表示されていたので、手動でWSLの更新をかけることにしました。

```shell-session
$ wsl --update
インストール中: Linux 用 Windows サブシステム
パッケージ ファミリ単位のポリシーによってシステム ボリューム以外への展開が制限されているため、展開操作がブロックされました。ポリシーに従って、このアプリはシステム ドライブにインストールする必要がありますが、システム ドライブが既定の場所として設定されていません。[ストレージの設定] で、新しいコンテンツを保存するための既定の場所としてシステム ドライブを設定してから、インストールを再試行してください。
$
```

こんなエラー文言初めてみたぞ…？と思い、そのまま **日本語で** 検索しても情報がなかったのでとりあえず従って設定をしてみました。
筆者はパソコンに複数の内蔵ストレージを設置していますので、デフォルトはSSDを使っているCドライブじゃなくてHDDを使っているDドライブに設定していました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740657/ac97de65-3e53-807f-bf83-0688d5a13236.png)

とりあえず全部Cドライブに戻して、パソコンを再起動してまた `wsl --update` を実行しました。

が、まったく同じ文言が表示されていました。

## クリーンインストールも効かない

既存でインストールしてあるUbuntuにはアクセスできるものの、Docker desktopが使えない以上Ubuntu上にあるDev Containerも起動できないので、データを退避させてWSL爆発させました。

```shell-session
$ wsl -l -v
  NAME                   STATE           VERSION
  Ubuntu-20.04           Stopped         2
* Ubuntu-22.04           Stopped         2
  docker-desktop-data    Stopped         2
  docker-desktop         Stopped         2

$ wsl --unregister <ディストリビューション名>
登録を解除しています...
$
```

アプリとWindowsの機能からもアンインストールと無効にして再起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740657/f41fcf68-8df3-f117-6f16-3f12455c1dd8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740657/45e47d4e-2d63-a4f5-8410-5ebd790c157e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740657/78081be1-5117-f60f-b4c9-930090f7cca1.png)

再起動後はWindowsの機能を再度有効化にし、ターミナルでWSLインストールを実行しました。
```shell-session
$ wsl --install
インストール中: Linux 用 Windows サブシステム
パッケージ ファミリ単位のポリシーによってシステム ボリューム以外への展開が制限されているため、展開操作がブロックされました。ポリシーに従って、このアプリはシステム ドライブにインストールする必要がありますが、システム ドライブが既定の場所として設定されていません。[ストレージの設定] で、新しいコンテンツを保存するための既定の場所としてシステム ドライブを設定してから、インストールを再試行してください。
$
```

どういうことだってばよ…

**英語で** `wsl package family`検索すると関連するissueが見つかりました。

https://github.com/microsoft/WSL/issues/9453

コメントにあったやり方で直してみます。

> Toggling the "New apps will save to" setting from C to D and back again fixed this!
> 「新しいアプリの保存先」をCドライブからDドライブにし、戻したら直りました！

これは試しましたが、自分の環境だと直りませんでした。

> Quick update here @John-P and for anyone looking for a solution. I did some research over the internet and found this workaround that worked for me: [#6405 (comment)](https://github.com/microsoft/WSL/issues/6405#issuecomment-1297311116)
>> It seems that vmcompute.exe must be strictly Code flow guard (CFG) enabled, otherwise it will not work.
>> Windowsセキュリティ＞アプリとブラウザ コントロール＞Exploit protection＞制御フロー ガード(CFG) をオンにすると直ります

`既定でオンにする` と設定して再起動したが直りませんでした。

> I managed to fix this by running `wsl --install --inbox` and then running `wsl --install --web-download`
> `wsl --install --inbox` (Windowsコンポーネント版をインストール) をして `wsl --install --web-download` (GitHubから最新をダウンロード) すると直りました

`wsl --install --inbox` と `wsl --install --web-download` でディストリビューションをインストールはできましたが、 `wsl --update` は同じエラー文言を吐きますし、 Docker desktopは相変わらず起動でエラー吐いていました。

## 最終的な解決策
> Opened up an admin Powershell, navigated to the default `C:\Program Files\WindowsApps` folder and tried to run `ls` on the WSL package folder. Got an error. Seems like it was corrupted somehow.
> Used `Get-AppxPackage -allusers` in the same Powershell session to get the list of all packages installed and found the offending WSL package that was causing an issue.
> Ran `Remove-AppxPackage -Package 'MicrosoftCorporationII.WindowsSubsystemForLinux_2.0.14.0_x64__8wekyb3d8bbwe'` (this is the package on my system giving an issue, yours may be different).

なるほど、WindowsAppsのインストール先を確認すればいいのですね。
管理者権限でターミナルを起動して確認、と…

```shell_session
$ cd "C:/Program Files/WindowsApps"
$ ls

    Directory: C:\Program Files\WindowsApps

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
...
d----    2024年4月14日 06:26:07 午後                MicrosoftCorporationII.WindowsSubsystemForLinux_2.1.5.0_neutral___8wekyb3d8bbwe -> E:\WindowsApps\MicrosoftCorporationII.WindowsSubsystemForLinux_2.1.5.0_neutral___8wekyb3d8bbwe
...
$
```

ん？

```
MicrosoftCorporationII.WindowsSubsystemForLinux_2.1.5.0_neutral___8wekyb3d8bbwe -> E:\WindowsApps\MicrosoftCorporationII.WindowsSubsystemForLinux_2.1.5.0_neutral___8wekyb3d8bbwe
```

もしかしてこれってシンボリックリンクでWSLが別のドライブにインストールされている…？
Eドライブのほうも確認すると

```shell-session
$ cd E:/WindowsApps
$ ls


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
...
da---    2024年4月14日 06:39:13 午後                Microsoft.Windows.Ai.Copilot.Provider_1.0.3.0_neutral__8wekyb3d8bbwe
d----    2024年4月14日 06:26:07 午後                MicrosoftCorporationII.WindowsSubsystemForLinux_2.1.5.0_neutral___8wekyb3d8bbwe
...
$
```

なぜかWSLがEドライブにインストールされていることが確認できました。なんでやねん…

ターミナルをCドライブのほうに戻して、パッケージを完全に削除します。

```shell-session
$ Remove-AppxPackage -Package 'MicrosoftCorporationII.WindowsSubsystemForLinux_2.1.5.0_x64__8wekyb3d8bbwe'
$
```

Windowsの機能で `Linux用Windowsサブシステム` と `仮想マシン プラットフォーム` にチェック入れてパソコンを再起動し、 `wsl --update` を実行します。

```shell-session
$ wsl --update
インストール中: Linux 用 Windows サブシステム
Linux 用 Windows サブシステム はインストールされました。
$ wsl --install -d Ubuntu-24.04
...
$
```

無事WSLの更新ができました。
Docker desktopも起動できるようになりました。めでたしめでたし。

## 以上
英語でもGitHubのissueにしか解決策がなく、日本語だと情報がそもそもなかったので自分で書くことにしました。
日本語は母語じゃなくて独学の第三言語なので下手なところがありますが、記事自体が誰かのお役に立てれば幸いです。
では。