12
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WSL2 が HCS/ERROR_FILE_NOT_FOUND で起動しない:原因は modules.vhd 欠落だった

12
Posted at

はじめに

Windows 上で WSL2 の Ubuntu を起動しようとしたところ、以下のエラーで起動できなくなりました。

PS C:\Users\<Windowsユーザー名>> wsl -d Ubuntu
指定されたファイルが見つかりません。
エラー コード: Wsl/Service/CreateInstance/CreateVm/HCS/ERROR_FILE_NOT_FOUND

最終的な原因は、Ubuntu 側の ext4.vhdx の破損ではなく、WSL 本体側の以下ファイルが欠落していたことでした。

C:\Program Files\WSL\tools\modules.vhd

modules.vhd を復元したところ、WSL2 は正常に起動しました。

この記事では、発生状況、切り分け、原因特定、復旧手順を備忘録としてまとめます。


環境

wsl --version

出力例:

WSL バージョン: 2.7.3.0
カーネル バージョン: 6.6.114.1-1
WSLg バージョン: 1.0.73
Windows バージョン: 10.0.26200.xxxx

ディストリビューション:

wsl -l -v
  NAME      STATE           VERSION
* Ubuntu    Stopped         2

エラー発生前に行っていたこと

エラーが発生する前に、WSL を更新するために以下のコマンドを実行していました。

wsl --update

しかし、更新処理が途中で進まなくなったように見えたため、Ctrl + C でキャンセルしようとしました。

その後、WSL を起動しようとすると、以下のエラーが出るようになりました。

wsl -d Ubuntu
指定されたファイルが見つかりません。
エラー コード: Wsl/Service/CreateInstance/CreateVm/HCS/ERROR_FILE_NOT_FOUND

このため、今回の障害は wsl --update の途中終了、または更新処理の不完全終了により、WSL 本体のファイル配置が中途半端な状態になった可能性が高いです。

ただし、Ctrl + C が唯一の直接原因だったとまでは断定できません。
より正確には、WSL 更新処理の途中で WSL 本体側の構成ファイルが欠落した可能性がある、という整理が妥当だと考えています。


発生した症状

wsl または wsl -d Ubuntu を実行すると、以下のエラーが発生しました。

PS C:\Users\<Windowsユーザー名>> wsl -d Ubuntu
指定されたファイルが見つかりません。
エラー コード: Wsl/Service/CreateInstance/CreateVm/HCS/ERROR_FILE_NOT_FOUND

wsl.exe 自体は存在していました。

where.exe wsl
C:\Windows\System32\wsl.exe
C:\Users\<Windowsユーザー名>\AppData\Local\Microsoft\WindowsApps\wsl.exe

WSL の状態も確認できました。

wsl --status
既定のディストリビューション: Ubuntu
既定のバージョン: 2

ディストリビューションの登録も残っていました。

wsl -l -v
  NAME      STATE           VERSION
* Ubuntu    Stopped         2

この時点で、WSL コマンド自体は動作しているが、Ubuntu の起動時、より正確には WSL2 VM の作成・起動時に失敗していると考えました。


最初に疑ったこと

このエラーを見ると、まず Ubuntu の実体である ext4.vhdx が消えた、または壊れた可能性を疑いました。

そこで以下を確認しました。

Get-ChildItem "$env:LOCALAPPDATA\Packages" -Recurse -Filter ext4.vhdx -ErrorAction SilentlyContinue |
  Select-Object FullName, Length, LastWriteTime

結果、ext4.vhdx は存在していました。

C:\Users\<Windowsユーザー名>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_...\LocalState\ext4.vhdx

サイズも大きく、Ubuntu のデータ自体は残っている可能性が高い状態でした。

この時点で、すぐに wsl --unregister Ubuntu するのは危険だと判断しました。


WSL の登録情報を確認

WSL のディストリビューション登録情報も確認しました。

Get-ChildItem "HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss" |
  ForEach-Object {
    Get-ItemProperty $_.PSPath |
      Select-Object DistributionName, BasePath, Version, State
  }

結果:

DistributionName BasePath                                                                                         Version State
---------------- --------                                                                                         ------- -----
Ubuntu           C:\Users\<Windowsユーザー名>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_...\LocalState       2     1

さらに、BasePath 配下に ext4.vhdx が存在するか確認しました。

Get-ChildItem "HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss" |
  ForEach-Object {
    $p = Get-ItemProperty $_.PSPath
    [PSCustomObject]@{
      DistributionName = $p.DistributionName
      BasePath = $p.BasePath
      Ext4Exists = Test-Path (Join-Path $p.BasePath "ext4.vhdx")
    }
  }

結果:

DistributionName BasePath                                                                                         Ext4Exists
---------------- --------                                                                                         ----------
Ubuntu           C:\Users\<Windowsユーザー名>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_...\LocalState       True

この時点で、少なくとも以下は否定できました。

  • Ubuntu の ext4.vhdx が消えている
  • WSL の登録情報と BasePath が大きくずれている

system.vhd 欠落に気づいたきっかけ

次に WSL 本体側のファイルを確認しました。

この確認を行ったきっかけは、以下の記事で C:\Program Files\WSL\system.vhd が見つからないケースが紹介されていたためです。

この記事では、C:\Program Files\WSL\system.vhd が存在しないことを確認し、WSL の MSI を展開して system.vhd を取り出し、C:\Program Files\WSL\ にコピーする流れが紹介されていました。

自分の環境でも同様に確認しました。

Test-Path "C:\Program Files\WSL\system.vhd"

すると、最初は system.vhd が存在しませんでした。

このため、まずは system.vhd の欠落が原因ではないかと考え、復元しました。

復元後:

Test-Path "C:\Program Files\WSL\system.vhd"
True

ただし、system.vhd を復元しても、まだ wsl -d Ubuntu は同じエラーで失敗しました。

wsl -d Ubuntu
指定されたファイルが見つかりません。
エラー コード: Wsl/Service/CreateInstance/CreateVm/HCS/ERROR_FILE_NOT_FOUND

ここで分かったのは、system.vhd の欠落は実際に起きていたものの、今回の環境ではそれだけが原因ではなかった、ということです。

つまり、既存記事の system.vhd 欠落パターンに近い状態ではありましたが、追加で別の WSL 本体ファイルも欠けている可能性がありました。


権限確認

system.vhd の権限も確認しました。

icacls "C:\Program Files\WSL\system.vhd"

出力例:

C:\Program Files\WSL\system.vhd NT AUTHORITY\SYSTEM:(I)(F)
                                BUILTIN\Administrators:(I)(F)
                                BUILTIN\Users:(I)(RX)

属性も確認しました。

Get-Item "C:\Program Files\WSL\system.vhd" |
  Format-List FullName,Length,CreationTime,LastWriteTime,Attributes
FullName   : C:\Program Files\WSL\system.vhd
Length     : 382497280
Attributes : Archive

権限不足や読み取り専用属性ではなさそうでした。


Hyper-V Worker ログを確認

原因を特定するため、Hyper-V Worker のログを確認しました。

Get-WinEvent -LogName "Microsoft-Windows-Hyper-V-Worker-Admin" -MaxEvents 30 |
  Select-Object TimeCreated, Id, ProviderName, Message |
  Format-List

すると、以下のようなログが出ていました。

Hyper-V-SynthStor:
次のエラーが原因でアタッチメント
'C:\Program Files\WSL\tools\modules.vhd (Lun 1)'
が見つかりませんでした:
'指定されたファイルが見つかりません。'

さらに、Synthetic Storage の電源オン失敗も出ていました。

Synthetic Storage:
電源をオンにできませんでした。
エラー: '指定されたファイルが見つかりません。' (0x80070002)

ここで、直接の原因が分かりました。


原因

直接の原因は、WSL2 の起動に必要な以下のファイルが欠落していたことでした。

C:\Program Files\WSL\tools\modules.vhd

また、調査の途中で以下のファイルも欠落していたことを確認しました。

C:\Program Files\WSL\system.vhd

発生前に wsl --update を実行しており、その処理が途中で進まなくなったように見えたため Ctrl + C でキャンセルしていました。

そのため、今回の障害は wsl --update の不完全終了により、WSL 本体のファイル配置が中途半端な状態になった可能性が高いです。

Ubuntu の ext4.vhdx 自体は残っており、WSL のディストリビューション登録情報も正しかったため、Ubuntu 側のデータ破損ではなく、WSL 本体側の欠損と判断しました。


なぜ modules.vhd 欠落で WSL2 が起動しないのか

WSL2 は軽量 VM として動作します。
起動時には、Ubuntu の ext4.vhdx だけでなく、WSL 本体側の仮想ディスクもアタッチされます。

今回のログでは、Hyper-V 側が以下のファイルを Synthetic Storage として VM に接続しようとしていました。

C:\Program Files\WSL\tools\modules.vhd

しかし、このファイルが存在しなかったため、仮想ディスクのアタッチに失敗しました。

その結果、WSL2 VM の電源オンに失敗し、最終的に以下のエラーとして表示されたと考えられます。

Wsl/Service/CreateInstance/CreateVm/HCS/ERROR_FILE_NOT_FOUND

つまり、エラーの意味は「Ubuntu のファイルが見つからない」とは限りません。
今回の場合は、WSL 本体側の仮想ディスクファイルが見つからない という意味でした。


対応

まず、参考記事と同様の方法で WSL の MSI を展開し、欠落していた system.vhd を取り出して復元しました。

その後も同じエラーが続いたため、Hyper-V Worker ログを確認したところ、今度は以下のファイルが欠落していることが分かりました。

C:\Program Files\WSL\tools\modules.vhd

そこで、modules.vhd についても system.vhd と同様に、WSL の MSI を展開して取得し、以下の場所へ復元しました。

C:\Program Files\WSL\tools\modules.vhd

復元後に確認:

Test-Path "C:\Program Files\WSL\tools\modules.vhd"
True

その後、WSL を起動すると正常に起動しました。

wsl -d Ubuntu
<WSLユーザー名>@<PC名>:/mnt/c/Users/<Windowsユーザー名>$

復旧後の確認

PowerShell 側:

wsl --status
wsl -l -v
wsl -d Ubuntu

結果:

既定のディストリビューション: Ubuntu
既定のバージョン: 2

  NAME      STATE           VERSION
* Ubuntu    Running         2

必要な WSL 本体ファイルも確認しました。

Test-Path "C:\Program Files\WSL\system.vhd"
Test-Path "C:\Program Files\WSL\tools\modules.vhd"
True
True

WSL 内でも確認しました。

uname -a
df -h

出力例:

Linux <PC名> 6.6.114.1-microsoft-standard-WSL2 #1 SMP PREEMPT_DYNAMIC ... x86_64 GNU/Linux

Filesystem      Size  Used Avail Use% Mounted on
none            7.7G     0  7.7G   0% /usr/lib/modules/6.6.114.1-microsoft-standard-WSL2
/dev/sdc       1007G  268G  688G  29% /
C:\             927G  660G  267G  72% /mnt/c

/usr/lib/modules/... がマウントされているため、modules.vhd の復元は成功していると判断しました。


やらなくてよかったこと

今回、以下は実行しませんでした。

wsl --unregister Ubuntu

これは正解でした。

wsl --unregister Ubuntu を実行すると、Ubuntu のディストリビューション登録やデータを削除してしまう可能性があります。

今回のケースでは、Ubuntu の ext4.vhdx は存在しており、壊れていたのは Ubuntu 側ではなく WSL 本体側でした。

そのため、いきなり unregister していたら、復旧難度が上がっていた可能性があります。


今回の切り分けまとめ

確認項目 結果 判断
発生前の操作 wsl --update を途中で Ctrl + C WSL 本体ファイルの配置が不完全になった可能性
wsl.exe 存在 WSL コマンド自体はある
WSL バージョン 表示できる WSL 本体は一部動作している
Windows の WSL 機能 Enabled Windows 機能は有効
Ubuntu 登録 あり ディストリビューション登録は残っている
ext4.vhdx 存在 Ubuntu データは残っている
BasePath 正しい 登録パス不整合ではない
system.vhd 欠落していた WSL 本体側の欠損。MSI 展開で取得して復元
modules.vhd 欠落していた 直接原因。system.vhd と同様に MSI 展開で取得して復元
Hyper-V Worker ログ modules.vhd 欠落を明示 原因確定

同じエラーが出たときの確認コマンド

同じような症状が出た場合は、まず WSL 本体側の VHD ファイルを確認します。

Test-Path "C:\Program Files\WSL\system.vhd"
Test-Path "C:\Program Files\WSL\tools\modules.vhd"

Ubuntu の実体ファイルも確認します。

Get-ChildItem "$env:LOCALAPPDATA\Packages" -Recurse -Filter ext4.vhdx -ErrorAction SilentlyContinue |
  Select-Object FullName, Length, LastWriteTime

WSL の登録情報も確認します。

Get-ChildItem "HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss" |
  ForEach-Object {
    $p = Get-ItemProperty $_.PSPath
    [PSCustomObject]@{
      DistributionName = $p.DistributionName
      BasePath = $p.BasePath
      Ext4Exists = Test-Path (Join-Path $p.BasePath "ext4.vhdx")
    }
  }

さらに、Hyper-V Worker ログを確認します。

Get-WinEvent -LogName "Microsoft-Windows-Hyper-V-Worker-Admin" -MaxEvents 30 |
  Select-Object TimeCreated, Id, ProviderName, Message |
  Format-List

注意点

C:\Program Files\WSL 配下のファイルを手動でコピー・復元する場合は、以下に注意してください。

  • 信頼できる入手元のファイルを使う
  • 可能であれば WSL の修復・再インストールで復元する
  • 既存の Ubuntu を安易に wsl --unregister しない
  • ext4.vhdx が残っている場合は、まずバックアップを検討する
  • wsl --update が進まないように見えても、すぐに中断せず、可能であれば状況を確認する

今回のように ext4.vhdx が残っている場合、ディストリビューションを削除するより、WSL 本体側の欠損を疑った方が安全です。


参考にした記事

system.vhd の欠落に気づくきっかけになった記事です。

この記事では、C:\Program Files\WSL\system.vhd が見つからない場合に、WSL の MSI を展開して system.vhd を取り出し、C:\Program Files\WSL\ にコピーする方法が紹介されています。

今回のケースでは、この記事を参考に system.vhd の欠落には気づけました。
ただし、system.vhd を復元しただけでは直らず、最終的には Hyper-V Worker ログから C:\Program Files\WSL\tools\modules.vhd の欠落も判明しました。

modules.vhd についても、system.vhd と同様に WSL の MSI を展開して取得し、C:\Program Files\WSL\tools\ 配下へ復元しました。

そのため、今回のポイントは以下です。

system.vhd 欠落パターンに見えたが、
実際には modules.vhd も欠落していた

最終結論

今回の Wsl/Service/CreateInstance/CreateVm/HCS/ERROR_FILE_NOT_FOUND の原因は、Ubuntu の ext4.vhdx ではなく、WSL 本体側の以下ファイル欠落でした。

C:\Program Files\WSL\tools\modules.vhd

エラーだけを見ると「Ubuntu が壊れた」「ディストリビューションを入れ直すしかない」と考えがちです。

しかし、Hyper-V Worker ログを見ることで、実際に欠落しているファイルを特定できました。

今回のポイントは次の3つです。

  1. ext4.vhdx が残っているなら、すぐに wsl --unregister しない
  2. HCS/ERROR_FILE_NOT_FOUND は WSL 本体側のファイル欠落でも発生する
  3. Hyper-V Worker ログを見ると、実際に欠落しているファイルを確認できる場合がある

参考:復旧後に確認した状態

最終的には以下の状態になり、WSL2 の Ubuntu は正常に起動しました。

wsl -l -v
  NAME      STATE           VERSION
* Ubuntu    Running         2
Test-Path "C:\Program Files\WSL\system.vhd"
Test-Path "C:\Program Files\WSL\tools\modules.vhd"
True
True
12
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?