Error code: Wsl/Service/CreateInstance/MountVhd/HCS/E_ACCESSDENIED

参考資料

qiita.com

現象

  • Windows 10を再インストールしたらWSL2のcronが動いていないことが発覚。起動用バッチファイルを動かしても動かない。
  • エラーメッセージを調べてみると、WSL2にディストリビューションが正しく登録されていないことが原因なので、再登録が必要になるらしい。
E:\Bin>wsl -u root -- service cron start
ディスク 'J:\WSL2\Ubuntu-22.04\ext4.vhdx' を WSL2 にアタッチできませんでした: アクセスが拒否されました。
Error code: Wsl/Service/CreateInstance/MountVhd/HCS/E_ACCESSDENIED

E:\Bin>wsl -l
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu-22.04 (既定)

E:\Bin>wsl --unregister Ubuntu-22.04
登録解除。
この操作を正しく終了しました。
  • 登録解除して再登録しようと思ったら、指定されたパスが見つかりません...だと?
C:\Windows\system32>wsl --update
更新プログラムを確認しています。
Linux 用 Windows サブシステムの最新バージョンは既にインストールされています。

C:\Windows\system32>wsl --import-in-place Ubuntsu-22.04 j:\WSL2\Ubuntu-22.04\
指定されたパスが見つかりません。
Error code: Wsl/ERROR_PATH_NOT_FOUND

C:\Windows\system32>dir j:\WSL2\Ubuntu-22.04\
 ドライブ J のボリューム ラベルは TOSHIBA です
 ボリューム シリアル番号は 1A51-5D20 です

 j:\WSL2\Ubuntu-22.04 のディレクトリ

2024/06/16  10:56    <DIR>          .
2024/06/16  10:56    <DIR>          ..
               0 個のファイル                   0 バイト
               2 個のディレクトリ  215,308,496,896 バイトの空き領域
  • 仮想ストレージのext4.vhdxがストレージから無くなってるのですが、どういうことですか!?さすがに想定外すぎる。
  • かなりへたったSSDを使っているとは言え、他のファイルは問題ないので何らかの事故で消えちゃったとしか思えない。
  • 仕方ないのでバックアップから復元と思ったら、このドライブのバックアップ取って無いことが発覚。orz
  • 再インストール手順はメモに残しているので最初からやり直しかと思ったら、あったよバックアップ!
C:\Windows\system32>dir e:\efs\_Backup\WSL2
 ドライブ E のボリューム ラベルがありません。
 ボリューム シリアル番号は 66F8-DFAE です

 e:\efs\_Backup\WSL2 のディレクトリ

2023/07/02  08:24    <DIR>          .
2023/07/02  08:24    <DIR>          ..
2023/07/02  08:24     1,864,970,240 20230702-Ubuntu-22.04.tar
               1 個のファイル       1,864,970,240 バイト
               2 個のディレクトリ  1,733,945,237,504 バイトの空き領域

復旧手順

   --import <ディストリビューション> <インストール先> <ファイル名> [オプション]
       指定された tar ファイルを新しいディストリビューションとしてインポートします。
       stdin の場合はファイル名に - を使用できます。

       オプション:
           --version <バージョン>
               新しいディストリビューションに使用するバージョンを指定します。

           --vhd
               指定されたファイルが tar ファイルではなく .vhdx ファイルであることを指定します。
               この操作により、指定されたインストール先に .vhdx ファイルのコピーが作成されます。
  • wsl.exeのimportオプションを読むと、tarからのインストール先を指定できるらしい。これをJ:\WSL2\Ubuntsu-22.04にすればよさそう。
:\Windows\system32>wsl.exe --import e:\EFS\_Backup\WSL2\20230702-Ubuntu-22.04.tar J:\WSL2\Ubuntu-22.04
Copyright (c) Microsoft Corporation.All rights reserved.
この製品のプライバシー情報については、https://aka.ms/privacy をご覧ください。

使用方法: wsl.exe [引数] [オプション...] [コマンドライン]
  • あれ、何か失敗したっぽい。
  • あ、引数を書く場所が逆だ。あぶねえ。
C:\Windows\system32>wsl.exe --import  J:\WSL2\Ubuntu-22.04 e:\EFS\_Backup\WSL2\20230702-Ubuntu-22.04.tar
Copyright (c) Microsoft Corporation.All rights reserved.
この製品のプライバシー情報については、https://aka.ms/privacy をご覧ください。

使用方法: wsl.exe [引数] [オプション...] [コマンドライン]
C:\Windows\system32>wsl.exe --import Ubuntu-22.04 J:\WSL2\Ubuntu-22.04 e:\EFS\_Backup\WSL2\20230702-Ubuntu-22.04.tar
インポート中です。この処理には数分かかることがあります。
この操作を正しく終了しました。

C:\Windows\system32>dir J:\WSL2\Ubuntu-22.04
 ドライブ J のボリューム ラベルは TOSHIBA です
 ボリューム シリアル番号は 1A51-5D20 です

 J:\WSL2\Ubuntu-22.04 のディレクトリ

2024/06/16  11:31    <DIR>          .
2024/06/16  11:31    <DIR>          ..
2024/06/16  11:31     2,059,403,264 ext4.vhdx
               1 個のファイル       2,059,403,264 バイト
               2 個のディレクトリ  213,249,028,096 バイトの空き領域
  • おお、うまくいったっぽい。後はインストール手順を最初からやり直せばよかろう。
C:\Windows\system32>wsl.exe --update
更新プログラムを確認しています。
Linux 用 Windows サブシステムの最新バージョンは既にインストールされています。

C:\Windows\system32>wsl.exe -l
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu-22.04 (既定)

C:\Windows\system32>wsl.exe -v
WSL バージョン: 2.2.4.0
カーネル バージョン: 5.15.153.1-2
WSLg バージョン: 1.0.61
MSRDC バージョン: 1.2.5326
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.26091.1-240325-1447.ge-release
Windows バージョン: 10.0.19045.4529

C:\Windows\system32>wsl.exe -l -v
  NAME            STATE           VERSION
* Ubuntu-22.04    Stopped         2

C:\Windows\system32>dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

展開イメージのサービスと管理ツール
バージョン: 10.0.19041.3636

イメージのバージョン: 10.0.19045.4529

機能を有効にしています
[==========================100.0%==========================]
操作は正常に完了しました。

C:\Windows\system32>dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

展開イメージのサービスと管理ツール
バージョン: 10.0.19041.3636

イメージのバージョン: 10.0.19045.4529

機能を有効にしています
[==========================100.0%==========================]
操作は正常に完了しました。

C:\Windows\system32>wsl.exe --set-default-version 2
WSL 2 との主な違いについては、https://aka.ms/wsl2
 を参照してください
この操作を正しく終了しました。

C:\Windows\system32>wsl.exe --set-version Ubuntu-22.04 2
WSL 2 との主な違いについては、https://aka.ms/wsl2
 を参照してください
変換中です。これには数分かかる場合があります。
ディストリビューションは既に、要求されているバージョンです。
Error code: Wsl/Service/WSL_E_VM_MODE_INVALID_STATE

C:\Windows\system32>wsl.exe -u root -- service cron start

C:\Windows\system32>wsl.exe -u #######
Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.153.1-microsoft-standard-WSL2 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage


This message is shown once a day. To disable it please create the

.bash_profileが自動実行されない件

  • 原因を探ってみると、ログインシェルがbashになっていないっぽい。
  • echo $SHELLするとbashが返ってくるけど、ターミナルに色付いてないし。
  • 手動でコマンドをたたけば動くところまでは確認したので、一から再インストールした方がよいかな...
  • 気がついたらUbuntu-24.04がリリースされているようなので、こっちで試してみましょうか。

再インストールしたら直った!

  • よく分からない状態になったら、解決策を考えるよりもさっさと再インストールした方が速いという教訓でありました。:-)
  • もしかしてext4.vhdxが消えたのは、wsl --unregister Ubuntu-22.04を実行したからだったりするのか?まさか仮想ストレージを物理消去するコマンドだとは思ってもみませんでした。なんてこったい。orz
  • 消してしまったのは大問題だし、バックアップ取ってなかったのもよくないですが、どのみちおかしなことになっていたのは回避できなかったでしょうから、結果オーライと思うことに使用。