WSL E_UNEXPECTED エラーからの完全復旧記録 -- ext4破損からデータ救出まで
PC再起動後にWSLがE_UNEXPECTEDエラーで起動不能に。ext4ファイルシステム破損が原因でした。wsl --mount --vhd --bareでデータを救出し、新規インストールで完全復旧するまでの全記録です。
はじめに
PC再起動後、WSLが二度と起動しなくなりました。
2026年4月9日。いつも通りの再起動のつもりでした。しかしVSCodeからWSLに接続しようとすると沈黙。ターミナルから wsl を叩くと返ってきたのは Wsl/Service/E_UNEXPECTED という、見たこともないエラーでした。
結論から言うと、ext4ファイルシステムの破損が原因で、ディストロの修復は不可能でした。しかし wsl --mount --vhd --bare でデータを救出し、新規インストールからの完全復旧に成功しました。
この記事では、原因特定からデータ救出、環境再構築までの全工程を時系列で記録しています。同じエラーに遭遇した方の助けになれば幸いです。
Phase 1: 状態確認 – 何が起きているのか
まずWSL自体の状態を確認しました。
PS> wsl --status
既定のディストリビューション: Ubuntu-24.04
既定のバージョン: 2WSL2として認識されており、既定ディストロも正しい状態です。ディストロの稼働状態を見ます。
PS> wsl -l -v
NAME STATE VERSION
* Ubuntu-24.04 Stopped 2Stopped。起動を試みます。
PS> wsl
致命的なエラーです。
エラー コード: Wsl/Service/E_UNEXPECTED起動自体が失敗しています。 Stoppedなだけではなく、起動プロセスのどこかで致命的なエラーが発生しています。この時点では原因が全く分かりませんでした。
Phase 2: サービス・コンポーネント修復試行
「WSL E_UNEXPECTED」で検索すると、多くの記事が「WSLサービスの再起動」や「WSLの再インストール」を勧めています。一通り試しました。
WSLサービスの再起動
まずWindowsサービスの確認から。LxssManager は古いWSL1時代のサービス名で、もう存在しません。
PS> net stop LxssManager
無効なサービス名です。正式なサービス名を検索します。
PS> Get-Service | Where-Object { $_.DisplayName -like "*WSL*" -or $_.DisplayName -like "*Linux*" }
Status Name DisplayName
------ ---- -----------
Running WSLService WSL ServiceWSLServiceはRunning。サービス自体は動いています。念のため再起動しました。
PS> Restart-Service WSLService
PS> wsl
致命的なエラーです。
エラー コード: Wsl/Service/E_UNEXPECTED変化なし。問題はWSLサービスレベルではありません。
仮想化基盤の確認
WSL2はHyper-Vベースの軽量VMで動作します。仮想化関連の機能を確認しました。
PS> dism /online /get-featureinfo /featurename:Microsoft-Hyper-V
エラー: 0x800f080c
機能名 Microsoft-Hyper-V は不明です。PS> dism /online /get-featureinfo /featurename:VirtualMachinePlatform
状態 : 有効Microsoft-Hyper-VはWindows Home Editionのため存在しません。これは正常です。VirtualMachinePlatformは有効済み。仮想化基盤に問題はありません。
WSLコンポーネントの更新・再インストール
PS> wsl --update --pre-release
Linux 用 Windows サブシステムをバージョン 2.7.1 に更新しています。更新後も同じエラーでした。WSLコンポーネント自体の再インストールも試しました。
PS> wsl --install --no-distribution
この操作を正しく終了しました。PC再起動。結果は同じ E_UNEXPECTED です。
ここまでで分かったこと: WSLサービスは正常に動いています。仮想化基盤も問題ありません。WSLコンポーネントの更新・再インストールも効果なし。つまり、WSL基盤側の問題ではない可能性が高いです。
Phase 3: 問題の切り分け – VM層かディストロ層か
ここで転機になったのが wsl --debug-shell です。このコマンドはディストロを介さずWSL VMに直接接続します。WSL2の構造を「VM層」と「ディストロ層」に分離して考えることができます。
PS> wsl --debug-shell
Welcome to Microsoft Azure Linux 3.0 (x86_64) - (hvc2)
Chillaptop login: root (automatic login)WSL VMは正常に起動しました。 ただし直後に切断されました。
エラー コード: Wsl/DebugShell/ERROR_PIPE_NOT_CONNECTEDこれで問題の所在が明確になりました。VM層(WSL基盤)は正常に動いています。問題はディストロ内部にあります。
イベントログの確認
念のためWindowsのイベントログも確認しました。
PS> Get-WinEvent -LogName System -MaxEvents 20 | Where-Object { $_.Message -like "*WSL*" }WSL(Hyper-V firewall)のネットワーク初期化はすべて正常に完了していました。ネットワーク層の問題でもありません。
Phase 4: データバックアップ – まず逃がす
ディストロ内部の問題と分かった時点で、方針を切り替えました。修復よりもまずデータの確保が最優先です。
vhdxファイルの場所を探す
WSLのディスクイメージ(ext4.vhdx)を探す必要があります。デフォルトの AppData\Local\Packages 配下を探しましたが見つかりません。Cドライブ全体を検索しても出てきませんでした。
PS> Get-ChildItem -Path "C:\" -Filter "*.vhdx" -Recurse -ErrorAction SilentlyContinue
(結果なし)WSLストア版は、従来とは異なるパスに保存されています。 レジストリから正確なパスを取得しました。
PS> Get-ChildItem "HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss" -Recurse |
Get-ItemProperty | Select-Object DistributionName, BasePath
DistributionName BasePath
---------------- --------
Ubuntu-24.04 C:\Users\<ユーザー名>\AppData\Local\wsl\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}このパス配下に ext4.vhdx がありました。ここでひとつ注意点があります。WSLストア版のvhdxは AppData\Local\Packages ではなく AppData\Local\wsl\{GUID} に保存されます。ネット上の古い情報に惑わされないようにしてください。
vhdxのバックアップ
まずvhdxファイルをそのままコピーしました。
PS> Copy-Item "C:\Users\<ユーザー名>\AppData\Local\wsl\{...}\ext4.vhdx" -Destination "C:\temp\wsl_backup.vhdx"コピー後、元ファイルとサイズが一致していることを確認。バックアップ完了です。
wsl –export の試行(失敗)
tar形式でのエクスポートも試みましたが、これは失敗しました。
PS> wsl --export Ubuntu-24.04 C:\temp\wsl_export.tar
エクスポートが進行中です。これには数分かかる場合があります。 (290 MB)
bsdtar: Can't open `final.target': Input/output error
エラー コード: Wsl/Service/WSL_E_EXPORT_FAILEDfinal.target(systemdのターゲットファイル)でI/Oエラー。この時点でファイルシステム破損の可能性が浮上しました。
Phase 5: 修復試行と断念
バックアップ済みのvhdxを使って、ディストロを再登録してみました。
PS> wsl --unregister Ubuntu-24.04
登録解除。
PS> wsl --import Ubuntu-24.04 "C:\Users\<ユーザー名>\AppData\Local\wsl\Ubuntu-24.04" "C:\temp\wsl_backup.vhdx" --vhd
この操作を正しく終了しました。
PS> wsl -d Ubuntu-24.04
致命的なエラーです。
エラー コード: Wsl/Service/E_UNEXPECTED同じvhdxを再登録しても同じエラーです。これで確定しました。vhdx内のファイルシステム自体が壊れています。 WSLの設定やレジストリの問題ではなく、ディスクイメージの中身が原因です。
Phase 6: 新規インストールとデータ救出
修復は諦めて、新規インストール + 旧vhdxからのデータ救出に切り替えました。
新規ディストロのインストール
PS> winget install --id Canonical.Ubuntu.2404 --source winget
インストールが完了しましたwsl -l -v ではまだ表示されませんでしたが、スタートメニューから「Ubuntu 24.04」を起動して初回セットアップ(ユーザー名・パスワードの設定)を完了させました。
PS> wsl -l -v
NAME STATE VERSION
* Ubuntu-24.04 Running 2新しいディストロが正常に起動しました。ここまで来ればあとはデータを戻すだけです。
旧vhdxからのデータ救出
ここが今回の復旧で最も重要なポイントです。壊れたvhdxを、新しいWSLからブロックデバイスとしてマウントします。
PS> wsl --mount "C:\temp\wsl_backup.vhdx" --vhd --bare
この操作を正しく終了しました。--bare オプションは、vhdxをWSL内のブロックデバイスとして接続するが自動マウントはしない、という意味です。破損したファイルシステムをいきなりマウントするのは危険なので、まず手動で確認します。
WSL内でブロックデバイスを確認します。
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 364.8M 1 disk
sdb 8:16 0 144.5M 1 disk
sdc 8:32 0 2G 0 disk [SWAP]
sdd 8:48 0 1T 0 disk /
sde 8:64 0 1T 0 disk ← 旧vhdx
sdf 8:80 0 1T 0 disksdeが旧vhdxです。読み取り専用でマウントしました。
$ sudo mount -o ro /dev/sde /mnt/backup
$ ls /mnt/backup/home/
chillarinマウントに成功しました。 ext4のジャーナルリカバリが自動で走り、読み取り専用でのマウントが可能になりました。起動はできなくても、ファイル単位での読み取りはできます。これがext4ジャーナリングの恩恵です。
データ復元
rsyncで旧ホームディレクトリの内容をまるごと復元しました。
$ sudo rsync -ah --progress /mnt/backup/home/chillarin/ /home/chillarin/新規ディストロではUIDが異なるため、パーミッションを修正します。
$ sudo chown -R chillarin:chillarin /home/chillarin/復旧確認です。
$ ls ~/.ssh/
config id_ait id_ait.pub id_ait_cisco id_ait_cisco.pub known_hosts known_hosts.old
$ ls ~/
ansible ansible-venv go go-dist projects protoc terraform workSSH鍵、Ansibleのプレイブック、Terraformの定義、プロジェクトファイル。すべて帰ってきました。VSCodeからのWSL接続も正常に動作しました。
一安心。そう思いました。
Phase 7: データの復旧は環境の復旧ではない
安心したのも束の間でした。開発作業を再開しようとプロジェクトディレクトリに移動し、git status を叩いた瞬間。
$ git status
Command 'git' not found, but can be installed with:
sudo apt install gitgitが入っていません。
冷静に考えれば当然です。rsyncで復元したのは /home/chillarin/ 配下のユーザーデータだけ。gitやその他の開発ツールはシステムパッケージとしてインストールされていたもので、ホームディレクトリにはありません。新規インストールしたUbuntuは、まっさらな状態です。
Ubuntu 24.04はデフォルトでgitがプリインストールされていません。手動でインストールが必要でした。
$ sudo apt update && sudo apt install -y gitgitを入れたら次はGitHub CLI。認証が必要なリポジトリへのpushにはghが要ります。
$ sudo apt install -y gh
$ gh auth login他にも、開発に必要なパッケージを洗い出して入れ直す作業が続きました。Python仮想環境の再構築、Go関連ツールの確認、各種CLIツールのインストール。ファイルは全部戻っていても、それを動かす「道具」がすべて消えていました。
「データの復旧」と「環境の復旧」は別物です。 ファイルが戻れば復旧完了ではありません。開発環境には、aptでインストールしたパッケージ群、シェルの設定、言語ランタイム、各種CLIツールなど、ホームディレクトリの外にあるものが大量にあります。これらは rsync では戻りません。
Phase 8: 原因の特定(事後調査)
復旧作業がひと段落した後、旧vhdxをマウントした状態で dmesg を確認し、根本原因を特定しました。
EXT4-fs (sde): INFO: recovery required on readonly filesystem
EXT4-fs (sde): write access will be enabled during recovery
EXT4-fs warning (device sde): ext4_clear_journal_err:6312:
Filesystem error recorded from previous mount: IO failure
EXT4-fs warning (device sde): ext4_clear_journal_err:6320:
Marked fs in need of filesystem check.
EXT4-fs (sde): recovery complete
EXT4-fs (sde): mounted filesystem ro with ordered data mode.EXT4-fs (sde): error count since last fsck: 16
EXT4-fs (sde): initial error at time 1775663638: ext4_validate_block_bitmap:421
EXT4-fs (sde): last error at time 1775666188: ext4_validate_block_bitmap:421ブロックビットマップの破損が16箇所。 PC再起動時にWSLが正常にシャットダウンされず、ext4のメタデータが不整合な状態で放置された結果です。
旧ディストロの起動試行時のエラーログも残っていました。
WSL (2 - init-systemd) ERROR: /sbin/ldconfig failed with status 0x100
WSL (2 - init-systemd) ERROR: Processing ldconfig failed
WSL (2 - init-systemd) ERROR: symlink(/mnt/wsl/resolv.conf, /etc/resolv.conf) failed 17
WSL (2 - init-systemd) ERROR: creat /etc/hostname failed: 5
WSL (2 - init-systemd) ERROR: creat /etc/hosts failed 5
WSL (1 - init-systemd) ERROR: execvpe(/sbin/init) failed 5
WSL (1 - init()) ERROR: Init has exited. Terminating distributionエラーコード5はすべてEIO(Input/output error)です。ファイルシステム破損により、ディストロ初期化処理のどのステップもI/Oエラーで失敗しています。ldconfig、resolv.conf、hostname、hostsの生成、そして最終的に /sbin/init の実行まで、すべてが連鎖的に失敗して起動を断念しました – これが E_UNEXPECTED の正体でした。
教訓
今回の復旧から得た学びをまとめます。
- WSLのvhdxは定期バックアップすべきです。
wsl --exportまたはvhdxファイルの直接コピーで構いません。PCの突然の再起動でファイルシステムが壊れるリスクは現実にあります - vhdxが壊れていても
wsl --mount --vhd --bareでデータ救出が可能です。 ext4ジャーナルリカバリのおかげで、起動できないディストロからでもファイルを読み取れました wsl --debug-shellでVM層とディストロ層の問題を切り分けられます。 VMが起動するならWSL基盤は正常。問題はディストロ内部にあります- WSLストア版のvhdxは
AppData\Local\wsl\{GUID}に保存されます。 レジストリHKCU:\...\LxssのBasePathで場所を特定できます。ネット上の古い情報(AppData\Local\Packages配下)にはご注意ください - PC再起動前に
wsl --shutdownを実行する習慣をつけましょう。 明示的なシャットダウンでファイルシステム破損のリスクを下げられます - データの復旧は環境の復旧ではありません。 ホームディレクトリを丸ごと戻しても、gitすら入っていない状態です。aptパッケージ一覧のエクスポートやセットアップスクリプトの用意も検討してください
最後の教訓は意外と見落としがちです。バックアップというとファイルの保全に意識が向きますが、開発環境は「ファイル + ツール + 設定」の三位一体で成り立っています。どれか一つが欠けても、すぐには仕事に戻れません。
今回はClaudeと二人三脚で復旧に当たりましたが、パニックに陥らず体系的に切り分けを進められたのは大きかったです。WSLが壊れた時、まず必要なのは冷静さと、データを逃がす判断力です。
コメント