WSL2が圧迫していたCドライブを救った話 —— 実使用12GBなのにシステムは80GB表示の怪
こんにちは。今日は、ぼくがWSL2のUbuntuで遭遇した容量問題と、その解決方法について書いていきます。
同じような問題で困っている人の参考になれば嬉しいです。
何が起きていたのか
ぼくは普段、Windows上でWSL2を使ってUbuntuを動かしています。ある日、Cドライブの容量が足りなくなってきたので調べてみると、Ubuntuが使っているVHDXファイル(ext4.vhdx)が88.2GBもあることがわかりました。
「えっ、そんなに使ってたっけ?」と思って、Ubuntu内で容量を確認してみました。
du -h --max-depth=1 ~ | sort -hr | head -10
このコマンドを実行すると、ホームディレクトリ全体で12GB程度しか使っていないことがわかりました。つまり、実際には12GBしか使っていないのに、Windowsから見ると80GB以上も容量を食っているという状態です。
これは困りました。Cドライブの空きは10.7GBしかなく、すでにできる限りの容量確保はやり尽くしていました。
最初に試したこと
まず、Ubuntuをシャットダウンして1時間以上放置してみました。VHDXファイルが自動的に縮小されることを期待したのですが、変化はありませんでした。
次に、Windowsのdiskpartとvmcomputeというツールを使って、VHDXファイルを圧縮しようとしました。でも、これをやったらシステムクラッシュが起きてしまいました。これは危険だと判断して、この方法は諦めました。
バックアップを取るなら、本来はCドライブ内に保存するのが一番安全で速いです。でも、ぼくのCドライブは空きが10GB以下しかなかったので、それも不可能でした。
外付けドライブにバックアップを取ることも考えました。でも、ぼくの外付けドライブはFAT32でフォーマットされていて、1ファイル4GBまでしか保存できません。
圧縮してもバックアップファイルが4GBを超えてしまうため、この方法も使えませんでした。しかも、すでにDドライブには他のファイルが入っているので、4GB以上のファイルのやりとりができるexFATやNTFSにフォーマットし直すこともできませんでした。
解決策:クリーンインストール
色々と試した結果、ぼくは思い切ってUbuntuをクリーンインストールすることにしました。手順は次の通りです。
ステップ1:データを分割してバックアップ
まず、重要なデータを3GB以下のファイルに分割します。これなら、FAT32の外付けドライブにも保存できます。
cd ~
tar czf - . | split -b 3G - /mnt/d/ubuntu-backup-
このコマンドは、ホームディレクトリ全体を圧縮しながら、3GBごとのファイルに分割してDドライブに保存します。
念のため、バックアップが正しく作成されているか確認します。
tar tzf /mnt/d/ubuntu-backup-aa | head -20
ファイルリストが正しく表示されれば、バックアップは成功しています。
ステップ2:設定ファイルだけ別途保存
軽量な設定ファイルは、Cドライブに別途保存しておきます。
tar czf /mnt/c/Users/YourName/ubuntu-configs.tar.gz \
.bashrc .profile .ssh .config .vscode-server/data/Machine
注意:YourNameの部分は、自分のWindowsユーザー名に置き換えてください。
ステップ3:WSLをクリーンインストール
PowerShellを管理者権限で開いて、以下のコマンドを実行します。
wsl --unregister Ubuntu
wsl --install Ubuntu
これで、Ubuntuが完全に削除されて、新しくインストールされます。VHDXファイルもゼロからやり直しになるので、容量問題は解決します。
ステップ4:データを復元
新しいUbuntuが起動したら、バックアップしたデータを復元します。
cat /mnt/d/ubuntu-backup-* | sudo tar xzf - -C ~
tar xzf /mnt/c/Users/YourName/ubuntu-configs.tar.gz -C ~
これで、以前の環境が戻ってきます。
定期的なメンテナンス:fstrimコマンド
クリーンインストールで容量問題は解決しましたが、また同じ問題が起きないように、定期的にメンテナンスをすることにしました。それが「fstrim」というコマンドです。
sudo fstrim -av
fstrimって何をするの?
fstrimは「ファイルシステムのゴミ掃除」をするコマンドです。どういうことか、順を追って説明します。
通常、Ubuntu内でファイルを削除すると、次のようなことが起きます。
- Ubuntu内でファイルを削除する
- Linux側は「ここは空いてるよ」と認識する
- でも、VHDXファイル(Windowsのディスク)には伝わっていない
- 結果、VHDXファイルのサイズは減らない
これが、VHDXファイルがどんどん大きくなってしまう原因です。
fstrimを実行すると、次のようなことが起きます。
- 削除済みファイルが使っていた領域を探す
- 「この領域はもう使っていません」という信号をWindowsに送る(これをTRIM命令と言います)
- Windows側が「あ、ここは空いてるんだ」と認識できるようになる
実際に使ってみる
コマンドを実行すると、こんな感じの結果が表示されます。
/: 5.2 GiB (5586341888 bytes) trimmed
これは、5.2GB分の「削除済みだけど通知されていなかった領域」を通知したということです。
重要な注意点
ただし、fstrimを実行しただけでは、VHDXファイルは小さくなりません。fstrimは「ここは空いてるよ」と伝えるだけで、実際にVHDXファイルを縮小するには、別の作業が必要になります。
それでも、定期的にfstrimを実行しておくことで、VHDXファイルがムダに大きくなることを防ぐことができます。
まとめ
WSL2のUbuntuで容量問題が起きた時は、クリーンインストールが一番確実な解決方法でした。手順は少し面倒ですが、データをしっかりバックアップしておけば、安全に作業できます。
そして、今後は定期的にfstrimコマンドを実行して、VHDXファイルがムダに大きくなるのを防ぐようにします。
同じような問題で困っている人は、ぜひ試してみてください。
Discussion