TL;DR
Windowsの設定で システム>ストレージ>新しいコンテンツの保存先
をCドライブに設定
Xboxのインストール先設定もできればCドライブに
困ったら C:/Program Files/WindowsApps
で ls
すると壊れたかインストール先が違うかを確認
英語で検索するとより多い情報が出ることもある
あれ?更新ができないぞ?
定期的にDocker desktopが使えなくなる癖があって、そのたびにDocker desktopの再インストール、古いバージョンのインストールなどをするようにしています。
ある日再インストールの途中で「Docker Desktop - WSL update failed」と表示されていたので、手動でWSLの更新をかけることにしました。
$ wsl --update
インストール中: Linux 用 Windows サブシステム
パッケージ ファミリ単位のポリシーによってシステム ボリューム以外への展開が制限されているため、展開操作がブロックされました。ポリシーに従って、このアプリはシステム ドライブにインストールする必要がありますが、システム ドライブが既定の場所として設定されていません。[ストレージの設定] で、新しいコンテンツを保存するための既定の場所としてシステム ドライブを設定してから、インストールを再試行してください。
$
こんなエラー文言初めてみたぞ…?と思い、そのまま 日本語で 検索しても情報がなかったのでとりあえず従って設定をしてみました。
筆者はパソコンに複数の内蔵ストレージを設置していますので、デフォルトはSSDを使っているCドライブじゃなくてHDDを使っているDドライブに設定していました。
とりあえず全部Cドライブに戻して、パソコンを再起動してまた wsl --update
を実行しました。
が、まったく同じ文言が表示されていました。
クリーンインストールも効かない
既存でインストールしてあるUbuntuにはアクセスできるものの、Docker desktopが使えない以上Ubuntu上にあるDev Containerも起動できないので、データを退避させてWSL爆発させました。
$ 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の機能からもアンインストールと無効にして再起動します。
再起動後はWindowsの機能を再度有効化にし、ターミナルでWSLインストールを実行しました。
$ wsl --install
インストール中: Linux 用 Windows サブシステム
パッケージ ファミリ単位のポリシーによってシステム ボリューム以外への展開が制限されているため、展開操作がブロックされました。ポリシーに従って、このアプリはシステム ドライブにインストールする必要がありますが、システム ドライブが既定の場所として設定されていません。[ストレージの設定] で、新しいコンテンツを保存するための既定の場所としてシステム ドライブを設定してから、インストールを再試行してください。
$
どういうことだってばよ…
英語で wsl package family
検索すると関連するissueが見つかりました。
コメントにあったやり方で直してみます。
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)
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 runningwsl --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 runls
on the WSL package folder. Got an error. Seems like it was corrupted somehow.
UsedGet-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.
RanRemove-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のインストール先を確認すればいいのですね。
管理者権限でターミナルを起動して確認、と…
$ 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ドライブのほうも確認すると
$ 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ドライブのほうに戻して、パッケージを完全に削除します。
$ Remove-AppxPackage -Package 'MicrosoftCorporationII.WindowsSubsystemForLinux_2.1.5.0_x64__8wekyb3d8bbwe'
$
Windowsの機能で Linux用Windowsサブシステム
と 仮想マシン プラットフォーム
にチェック入れてパソコンを再起動し、 wsl --update
を実行します。
$ wsl --update
インストール中: Linux 用 Windows サブシステム
Linux 用 Windows サブシステム はインストールされました。
$ wsl --install -d Ubuntu-24.04
...
$
無事WSLの更新ができました。
Docker desktopも起動できるようになりました。めでたしめでたし。
以上
英語でもGitHubのissueにしか解決策がなく、日本語だと情報がそもそもなかったので自分で書くことにしました。
日本語は母語じゃなくて独学の第三言語なので下手なところがありますが、記事自体が誰かのお役に立てれば幸いです。
では。