[wsl2] ディスク容量が満タンで困った！＞＜でも、Optimize-VHDなんて存在しないとき

# Summary(概要)

wsl2を使っていると、ホストOSディスク容量がだんだん圧迫されていきます。
特に顕著なのは、大きなファイルをアップロードしたり大容量データを生成した後。

そして、wsl上のそういったデータを削除しても、なぜかPCのディスクが解放されません。

そこで、以下の記事に書かれている方法を試しました。

https://qiita.com/sarisia/items/5c53c078ab30eb26bc3b

しかし、うまくいかない！！！ >_<。

そんなときにとった方法を説明します。

## ※注意


:::note info
**失敗するとwsl2が動かなくなることもあります**

ここに書いてあることを過信せず、よく調べてから自己責任で実施お願いします。
:::

本当に誰にも失敗してほしくないので、


- 他の記事も参照しながら、実施
- 場合によってはバックアップもとってから実施

としてください。


- WSL環境のバックアップ方法  
例えばこの記事などに書かれていました。  
色々な記事があるので、一度でもバックアップできることを確認しておくのがおすすめです。

https://qiita.com/koji_hattori/items/1480d25aca8cdf5ac4a1

# 実施内容

## 1. 状態の確認

まずディスク容量を見ておきます。

```powershell:powershell
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を全て停止させましょう。

```powershell:powershell
> 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に怒られました。

```powershell: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さんのコメントに頼りました。

https://github.com/microsoft/WSL/issues/4699#issuecomment-627133168

> For Windows 10 Home (alternative Optimize-VHD cmdlet):
>
> ```powershell:powershell
> wsl --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).


早速実施していきます。

```powershell:powershell
PS C:\Users\myname> diskpart
```

diskpartコマンドを実行すると、diskpart.exeが実行状態になり、別windowが立ち上がりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/2d2d79c4-b81d-4975-dce5-fffd446c818f.png)


残りのコマンドをそのまま実行していきます。


ここでは [3. ext4.vhdxのファイルの位置を確認] で見つけた`ext4.vhdx`のパスを使ってコマンドを実行していきます。

```bash:diskpart
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で確認しました。

```powershell:powershell
PS C:\Users\myname> wsl
> df
```

これで容量が減っていれば大成功(^ワ^*)
怖かったですが、私は今のところ無事に動いています。

ある程度使ってみて、問題ないかどうかも追記したいと思います。
（そういう情報ほしいですよね）

# 約20日経過後 (2021/07/20)

|･`ω･´)ﾁﾗﾘｯ ほぼ毎日wsl2使ってますが、今のところ何の問題もないです！

# お役立ち情報！！ (2022/08/23)

上記のように`diskpart`で圧縮する前に、wsl内で以下のコマンドを実行してdocker関連のゴミ掃除をしておくと、圧縮される量が高まります！！

```bash
# 使ってないコンテナを削除
$ docker container prune

# 使ってないイメージを削除
$ docker image prune

# 使ってないボリュームを削除 ← 環境によっては大きな効果があるかも？
$ docker volume prune

# docker imageのビルド時に利用するキャッシュを削除！！ ← 強烈
$ docker builder prune
```

diskpart使ってもあんまりディスク容量が空かないなぁ....
というときはぜひご利用ください！


# お役立ち情報追記!! (2023/08/15)

以下のコマンドでもかなりのゴミ掃除ができた！
皆さんもお試し下さいな。

```bash
$ 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
```

以下の記事からこのコマンドを拝借いたしました。

https://zenn.dev/bon/articles/docker-nospace-error


# 参考情報

「参考」って言うレベルじゃないくらい超重要な情報だと思うんですけど。。。本文とは関係ないので、おまけ扱いにしています。

さて **WSL はネットワークが非常に遅い**です！！！
私と同じくそんな風に感じている方は、以下の記事をお試しください！

https://qiita.com/bioflowy/items/02c9e945439a2d032cd2

**docker 上でのパッケージインストール**なども**非常に高速になりました！！**