
状況
- 250GBのSSDをWSL専用にして使っていた
- 収集スクリプトを放置してたらこうなっていた
- WSLが起動しなくなった
wsl --shutdownも応答しなくなった
復旧手順
一切責任は取らないので自己責任で。
無理やりシャットダウン
taskkill /f /im wslservice.exe
VHDの修復
.vhdxファイルが破損しているのを修復する。
以下に手順が書いてあるのでそのとおりに進めるとよいとAIが言っていた。 可能なら事前にVHDをバックアップしておくといい。
具体的な内容はリンク先を見てもらうとして、注意点だけ書いておく。
- 別distributionをインストールする必要がある
wsl --install --distribution Debian --location <path> --no-launchとか
lsblkの結果から該当するデバイス名を判断する簡単な方法は存在しなさそう- 消去法で選んだり、マウント前後で結果を比較して判断
e2fsckの実行中はyes-noでいろいろ聞かれる- あまり理解していないのでAIにそれぞれ聞いてなんとかした
不要ファイルの削除
修復ができたら起動できるのかもしれないが、先に別distroから不要ファイルを削除しておくのが安全な気がする。
mkdir -p /mnt/rescue
mount /dev/<device name> /mnt/rescue
rm <不要ファイル>
fstrim -v /mnt/rescue
umount /mnt/rescue
あとはwsl --unmountしてwsl --shutdownする。
VHD最適化
VHDは中身を消しても基本的には縮小しない。 sparse VHDというのもあるらしいがunsafeらしい。
HyperV PowerShellモジュールがある場合はOptimize-VHDコマンドが使えるはず。
ない場合もdiskpartを使う方法がある。
Optimize-VHD <path> -Mode Full
ここまでやったら無事起動できた。

対策
ディスクがいっぱいになるのは仕方がないとして、WSLが起動できなくなったりVHDが破損するのは面倒なので対策を考えている。
どれも実行はしていないがアイディアだけ置いておく。
VHDの大きさを制限する
特に設定をいじっていなかったので、WSL内部から見た仮想ディスクサイズは1TBになっていた。 なんとなくだが、仮想ディスクには空きがあるのに物理ディスクに空きがないという状態は、仮想ディスクに空きがない状態よりよくない気がする。
あと、VHD内に空き容量があればVHD外には空き容量はなくていいとなんとなく思い込んでいたが、WSL起動時の処理とかがあるのでそんなことはないとAIに言われた。 言われてみればそのような気がしてくる。
というわけでVHDの大きさを200GBぐらいに制限するのがよさそうだが、すでにあるVHDに制限をつけるのは面倒そう。
別VHDを使う
収集スクリプトで集めたデータが80GBを超えていて、今後も増えていくことを考えると250GB SSDに置き続けるのは現実的ではない。
容量が余っているHDDにVHDを作成してmountするのがよさそう。