📘

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内でファイルを削除すると、次のようなことが起きます。

  1. Ubuntu内でファイルを削除する
  2. Linux側は「ここは空いてるよ」と認識する
  3. でも、VHDXファイル(Windowsのディスク)には伝わっていない
  4. 結果、VHDXファイルのサイズは減らない

これが、VHDXファイルがどんどん大きくなってしまう原因です。

fstrimを実行すると、次のようなことが起きます。

  1. 削除済みファイルが使っていた領域を探す
  2. 「この領域はもう使っていません」という信号をWindowsに送る(これをTRIM命令と言います)
  3. Windows側が「あ、ここは空いてるんだ」と認識できるようになる

実際に使ってみる

コマンドを実行すると、こんな感じの結果が表示されます。

/: 5.2 GiB (5586341888 bytes) trimmed

これは、5.2GB分の「削除済みだけど通知されていなかった領域」を通知したということです。

重要な注意点

ただし、fstrimを実行しただけでは、VHDXファイルは小さくなりません。fstrimは「ここは空いてるよ」と伝えるだけで、実際にVHDXファイルを縮小するには、別の作業が必要になります。

それでも、定期的にfstrimを実行しておくことで、VHDXファイルがムダに大きくなることを防ぐことができます。

まとめ

WSL2のUbuntuで容量問題が起きた時は、クリーンインストールが一番確実な解決方法でした。手順は少し面倒ですが、データをしっかりバックアップしておけば、安全に作業できます。

そして、今後は定期的にfstrimコマンドを実行して、VHDXファイルがムダに大きくなるのを防ぐようにします。

同じような問題で困っている人は、ぜひ試してみてください。

Discussion