はじめに
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つです。
-
ext4.vhdxが残っているなら、すぐにwsl --unregisterしない -
HCS/ERROR_FILE_NOT_FOUNDは WSL 本体側のファイル欠落でも発生する - 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