原因不明なWSL2のエラーの修復

Docker Desktop for WindowsというかWSL2が壊れたのでなんとかしたメモ

起きたこと

PCの再起動後にDocker Desktop for Windowsが起動に失敗してメッセージが表示され、読んでみると、どうやらWSL2が壊れたようです。仮想プラットフォームの有効化を確認しろだとか出ました。メッセージはこのようなもの:

System.InvalidOperationException:
Failed to deploy distro docker-desktop to C:\Users\<USERNAME>\AppData\Local\Docker\wsl\distro: exit code: -1
 stdout: Windows の仮想マシン プラットフォーム機能を有効にして、BIOS で仮想化が有効になっていることを確認してください。

詳細については、https://aka.ms/wsl2-install を参照してください


 stderr: 
   場所 Docker.ApiServices.WSL2.WslShortLivedCommandResult.LogAndThrowIfUnexpectedExitCode(String prefix, ILogger log, Int32 expectedExitCode) 場所 C:\workspaces\master-merge\src\github.com\docker\pinata\win\src\Docker.ApiServices\WSL2\WslCommand.cs:行 146
   場所 Docker.Engines.WSL2.WSL2Provisioning.<DeployDistroAsync>d__17.MoveNext() 場所 C:\workspaces\master-merge\src\github.com\docker\pinata\win\src\Docker.Engines\WSL2\WSL2Provisioning.cs:行 168
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 Docker.Engines.WSL2.WSL2Provisioning.<ProvisionAsync>d__8.MoveNext() 場所 C:\workspaces\master-merge\src\github.com\docker\pinata\win\src\Docker.Engines\WSL2\WSL2Provisioning.cs:行 77
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 Docker.Engines.WSL2.LinuxWSL2Engine.<DoStartAsync>d__29.MoveNext() 場所 C:\workspaces\master-merge\src\github.com\docker\pinata\win\src\Docker.Engines\WSL2\LinuxWSL2Engine.cs:行 190
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 Docker.ApiServices.StateMachines.TaskExtensions.<WrapAsyncInCancellationException>d__0.MoveNext() 場所 C:\workspaces\master-merge\src\github.com\docker\pinata\win\src\Docker.ApiServices\StateMachines\TaskExtensions.cs:行 29
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 Docker.ApiServices.StateMachines.StartTransition.<DoRunAsync>d__5.MoveNext() 場所 C:\workspaces\master-merge\src\github.com\docker\pinata\win\src\Docker.ApiServices\StateMachines\StartTransition.cs:行 67
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   場所 Docker.ApiServices.StateMachines.StartTransition.<DoRunAsync>d__5.MoveNext() 場所 C:\workspaces\master-merge\src\github.com\docker\pinata\win\src\Docker.ApiServices\StateMachines\StartTransition.cs:行 92

これのメッセージの後、WSL2上のDebianが起動しなくなっていることに気づきました。ほぼ同じメッセージが表示されます(スタックトレースがないくらいの違い)。

WSL2が壊れた、ないと困るということでなんとかする必要が出てきました。

少しの心当たり

心当たりとしては、C++再頒布可能パッケージ2015(64bit/32bit版ともに。名称はMicrosoft Visual C++ 2015 Redistributable)を再インストールしたことぐらいです。

しかしシステム要件的には必要なさそうなので、これが原因とは思えず、Windowsの仮想マシンプラットフォーム機能の有効化と、BIOSでの仮想化が有効になっていることを確認することにしました。

メッセージの確認事項をチェック

まずは後者のBIOSで仮想化が有効になっているか確認します。再起動してF2を連打してBIOSを確認してみると、Intel Virtualization Technologyの項目があるので、Enabledになっていることを確認しました。

前者は、Windowsの機能の一覧にあるのでLinux用Windowsサブシステム仮想マシンプラットフォームの2項目(下部画像の緑色蛍光線部)にチェックが入っていることを確認しました。両方にチェックが入っていることを確認し、一旦OFFにして再起動して、再びONにして再起動までしておきました。

ちなみに青色蛍光線の箇所のWindowsハイパーバイザープラットフォームVirtualBoxWSL2の共存などができる仕組みのようです。

おかしいなー有効のはずなのになーと思っていると、やはりC++再頒布可能パッケージが原因なのかと疑い始めました。

Virtualboxもダメ

VirtualboxのSSH接続で同じようにできるかもと思い、試してみたら、こちらもダメなようでした。メッセージはこんな感じ:

仮想マシン"Debian"のセッションを開けませんでした。

WHvCapabilityCodeHypervisorPresent is FALSE! Make sure you have enabled the 'Windows Hypervisor Platform' feature. (VERR_NEM_NOT_AVAILABLE).

VT-x is not available (VERR_VMX_NO_VMX).

終了コード : E_FAIL (0x80004005)
コンポーネント: ConsoleWrap
インターフェース: IConsole {872da645-4a9b-1727-bee2-5585105xxxxx}

こちらは、上述のWindowsの機能にあるWindowsハイパーバイザープラットフォームを有効にしていなかったので、チェックを入れて有効化した後に試したけどダメでした。

こっちは使えたらいいなくらいの気持ちで試したので、試したのはここまでです。

似たような状況があるか調査

同じ状況で、

bcdedit /set hypervisorlaunchtype auto

で直ったという記事もありましたが、自分の環境ではすでにautoになっていて改善しませんでした。

壊滅的悪あがき

やらない方がいいかと思っていますが、Debianを再インストールすれば直らないにしても何か分かるかと思って、再インストールを試してみました。Dockerで少し使うくらいなので、まあ一旦消えても大丈夫かなという思いでした。

Debianを再インストールしようとすると、初回起動のインストール動作で、WslRegisterDistribution failed with error: 0x80370102というエラーが出てインストールが完了できませんでした。

ということでダメでした。しないでおけば以前のDebian環境はまた使えたとは思います。

なんとか修正

ここまでやって、やっぱりC++再頒布可能パッケージ周りをいじるしかないかなと思いました。

これをなんとかするならWindowsの復元ポイントを使うのが一番手っ取り早いと思います。 あまり手動では復元ポイントを作らないので、これがなかったらもうダメだったかもしれません。

幸運なことにC++再頒布可能パッケージをいじった辺りで復元ポイントが作成されていたので、そのポイントを指定して再起動されると、WSL2のエラーは出なくなりました。

Debianなどは再設定が必要でしたが、とりあえず済んで、元の通りWSL2は使えるようになりました。

Docker Desktop for Windowsについては、少々面倒なことになっていました。なので、まだDebiandocker psはできませんでした。

Docker Desktopの修正

Docker Desktop内でファクトリーリセットをかけてしまっていて、それでも上手くいかないのでアンインストールしようと思いました。しかし実行するも、アンインストール画面が真っ白で30分ほど放置しても何も進んでいないようなので、アンインストールを一旦やめました。セーフモード状態で行っても同様に進まず、アンインストールが完了しませんでした。

WSL2を復元ポイントで修正した後、この状態で起動しようとしたら、起動に失敗したので修正する必要が出てきました。

修正は、インストーラを使って上書きインストールすることで行いました。注意点としてはインストール済みのDocker Desktop完全に終了させて、replaceしてインストールする?との確認ダイアログではいを選択しておくことくらいです。

これで目につくところはだいたい修正できたと思います。

おわり

原因が分からずじまいで少しもやっとしています。復元ポイントは手動で後からでも分かるように名前付けして作成した方がいいかもしれませんね。

戻す時、復元ポイントの推奨箇所がより最近のポイントになっていました。これを無視してC++再頒布可能パッケージをいじった時の復元ポイントにしました。しかし、よく考えてみると、より最近のポイントで一旦復元し、改善しなければ今回戻したポイントを指定すべきだったかなと思っています。

Windowsキーを押下の機能の検索が意外と便利で重宝しています。Cmd+Spaceみたいなものですね。復元ポイントやアプリと機能なども打てばヒットします。

Debian内の~/.bashrcなどが再インストールにより初期化されたのは少し手間でした。バックアップはしましょう。

以上です。


Amazonアソシエイト

https://amzn.to/33qGFCm

コメント

タイトルとURLをコピーしました