Summary(概要)
wsl2を使っていると、ホストOSディスク容量がだんだん圧迫されていきます。
特に顕著なのは、大きなファイルをアップロードしたり大容量データを生成した後。
そして、wsl上のそういったデータを削除しても、なぜかPCのディスクが解放されません。
そこで、以下の記事に書かれている方法を試しました。
しかし、うまくいかない!!! >_<。
そんなときにとった方法を説明します。
※注意
失敗するとwsl2が動かなくなることもあります
ここに書いてあることを過信せず、よく調べてから自己責任で実施お願いします。
本当に誰にも失敗してほしくないので、
- 他の記事も参照しながら、実施
- 場合によってはバックアップもとってから実施
としてください。
- WSL環境のバックアップ方法
例えばこの記事などに書かれていました。
色々な記事があるので、一度でもバックアップできることを確認しておくのがおすすめです。
実施内容
1. 状態の確認
まずディスク容量を見ておきます。
PS C:\Users\myname> wsl
> df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sdb 263174212 90058840 159677216 37% /
tmpfs 9516516 0 9516516 0% /mnt/wsl
tools 498799612 305241112 193558500 62% /init
...
C:\ 498799612 305241112 193558500 62% /mnt/c
2. wsl停止
次に、OS上で動いているwslを全て停止させましょう。
> exit
PS C:\Users\myname> wsl --shutdown
3. ext4.vhdx
のファイルの位置を確認
この ext4.vhdx
というファイルが元凶です。
でもファイルの場所がわからないと対処できないので探さないといけません。
私の場合は、
C:\Users\myname\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState
というフォルダ内にありました。
おそらく以下の部分はPCによって名前が違うと思います。
各自の環境に当てはめて探してみてください。
myname
CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc
4. optimize-vhdを試してみる
冒頭の記事に書かれている通りに、コマンド(Optimize-VHD -Path .\ext4.vhdx -Mode full
)を実行してみます。
私の場合は、そんなコマンドないわとpowershellに怒られました。
PS C:\Users\myname> Optimize-VHD -Path .\ext4.vhdx -Mode full
Optimize-VHD : 用語 'Optimize-VHD' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前とし
て認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、
再試行してください。
発生場所 行:1 文字:1
+ Optimize-VHD -Path .\ext4.vhdx -Mode full
+ ~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Optimize-VHD:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
PCにoptimize-vhdが入っているならそれでOK!その場合はここで終わり(こうならなかったので私はわかりません?)
上記のようなエラーが出た人は次に進みましょう。
5. diskpartを使う
次に、以下の記事のmerkuriyさんのコメントに頼りました。
For Windows 10 Home (alternative Optimize-VHD cmdlet):
powershellwsl --shutdown diskpart # open window Diskpart select vdisk file="C:\WSL-Distros\…\ext4.vhdx" attach vdisk readonly compact vdisk detach vdisk exit
Thanks to @davidwin for the tip #4699 (comment).
早速実施していきます。
PS C:\Users\myname> diskpart
diskpartコマンドを実行すると、diskpart.exeが実行状態になり、別windowが立ち上がりました。
残りのコマンドをそのまま実行していきます。
ここでは [3. ext4.vhdxのファイルの位置を確認] で見つけたext4.vhdx
のパスを使ってコマンドを実行していきます。
DISKPART> select vdisk file="C:\Users\myname\AppData\…\ext4.vhdx"
DiskPartにより、仮想ディスクファイルが選択されました。
DISKPART> attach vdisk readonly
100%完了しました
DiskPartにより、仮想ディスクファイルがアタッチされました。
DISKPART> compact vdisk
100%完了しました <- サイズが大きいと結構時間かかる。私は20分はかからなかったくらい。
DiskPartにより、仮想ディスクファイルは正常に圧縮されました。
DISKPART> detach vdisk
DiskPartにより、仮想ディスクファイルがデタッチされました。
DISKPART> exit
6. 結果を確認
結果をpowershellで確認しました。
PS C:\Users\myname> wsl
> df
これで容量が減っていれば大成功(^ワ^*)
怖かったですが、私は今のところ無事に動いています。
ある程度使ってみて、問題ないかどうかも追記したいと思います。
(そういう情報ほしいですよね)
約20日経過後 (2021/07/20)
|・`ω・´)チラリッ ほぼ毎日wsl2使ってますが、今のところ何の問題もないです!
お役立ち情報!! (2022/08/23)
上記のようにdiskpart
で圧縮する前に、wsl内で以下のコマンドを実行してdocker関連のゴミ掃除をしておくと、圧縮される量が高まります!!
# 使ってないコンテナを削除
$ docker container prune
# 使ってないイメージを削除
$ docker image prune
# 使ってないボリュームを削除 ← 環境によっては大きな効果があるかも?
$ docker volume prune
# docker imageのビルド時に利用するキャッシュを削除!! ← 強烈
$ docker builder prune
diskpart使ってもあんまりディスク容量が空かないなぁ....
というときはぜひご利用ください!
お役立ち情報追記!! (2023/08/15)
以下のコマンドでもかなりのゴミ掃除ができた!
皆さんもお試し下さいな。
$ docker system prune
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all dangling images
- all dangling build cache
Are you sure you want to continue? [y/N] y
Deleted build cache objects:
...(略)
Total reclaimed space: 42.45GB
以下の記事からこのコマンドを拝借いたしました。
参考情報
「参考」って言うレベルじゃないくらい超重要な情報だと思うんですけど。。。本文とは関係ないので、おまけ扱いにしています。
さて WSL はネットワークが非常に遅いです!!!
私と同じくそんな風に感じている方は、以下の記事をお試しください!
docker 上でのパッケージインストールなども非常に高速になりました!!