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ハイパーバイザープラットフォーム
はVirtualBox
とWSL2
の共存などができる仕組みのようです。
おかしいなー有効のはずなのになーと思っていると、やはり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
については、少々面倒なことになっていました。なので、まだDebian
でdocker ps
はできませんでした。
Docker Desktopの修正
Docker Desktop
内でファクトリーリセットをかけてしまっていて、それでも上手くいかないのでアンインストールしようと思いました。しかし実行するも、アンインストール画面が真っ白で30分ほど放置しても何も進んでいないようなので、アンインストールを一旦やめました。セーフモード状態で行っても同様に進まず、アンインストールが完了しませんでした。
WSL2
を復元ポイントで修正した後、この状態で起動しようとしたら、起動に失敗したので修正する必要が出てきました。
修正は、インストーラを使って上書きインストールすることで行いました。注意点としてはインストール済みのDocker Desktop
は完全に終了させて、replace
してインストールする?との確認ダイアログではい
を選択しておくことくらいです。
これで目につくところはだいたい修正できたと思います。
おわり
原因が分からずじまいで少しもやっとしています。復元ポイントは手動で後からでも分かるように名前付けして作成した方がいいかもしれませんね。
戻す時、復元ポイントの推奨箇所がより最近のポイントになっていました。これを無視してC++再頒布可能パッケージをいじった時の復元ポイントにしました。しかし、よく考えてみると、より最近のポイントで一旦復元し、改善しなければ今回戻したポイントを指定すべきだったかなと思っています。
Windows
キーを押下の機能の検索が意外と便利で重宝しています。Cmd
+Space
みたいなものですね。復元ポイントやアプリと機能なども打てばヒットします。
Debian
内の~/.bashrc
などが再インストールにより初期化されたのは少し手間でした。バックアップはしましょう。
以上です。
Amazonアソシエイト
コメント