Windows で開発していると知らないうちに増えていくストレージ使用量を掃除して減らす

Google で『Windows 不要ファイル 削除』『windows 容量 増やす』等で検索すると出てくるのは、

- Windows Update のバックアップファイル等の削除
- ブラウザのキャッシュファイル削除
- Temp ファイル削除

のような一般的な用途で Windows を利用している場合に肥大化するものへの対処が多い。
しかし、Windows で本格的に開発していると、また違ったところが肥大化しているケースがあるので、備忘録的にまとめておく。

# :camel:  注意 :cactus: 

<font color="#b00020">一見必要なさそうなファイルでも、実は重要な役割を持っているものも沢山あります。
以下の操作は、問題が起きても自分でなんとかできると自信のあるもののみ参考にしてください。</font>

# 前準備

まずは何が容量を喰っているのかを知る必要がある。私は WizTree を使っている。

[WizTree - 窓の杜](https://forest.watch.impress.co.jp/library/software/wiztree/)

# VM

Vagrant 等で開発していると、知らず知らずのうちに VM が肥大化する。
新規に立ち上げた時は 1 GB 程度だったのに、色々使っていると知らぬ間に 10 GB 以上になっていることもある。

以下は、VirtualBox を利用している前提で進める。

**保存場所 :** `C:\Users\username\VirtualBox VMs\以下`

( ちなみに私自身は Docker for Windows を使っているので、**VirtualBox も Vagrant も使っていない** )

## 1. 不要 VM の削除

不要な VM があれば削除しよう。

## 2. 退避

日常的に使わないのであれば、NAS, Portable HDD や S3 へ退避する。
7-zip で圧縮することで、1/5 程度まで小さくできるのでオススメ。

パフォーマンスが多少落ちても良いのであれば、Portable HDD や NAS にファイルを移動して、VirtualBox がそこを直接参照して起動することも出来る。

## 3. 仮想 HDD の圧縮

日常的に使う VM は削除や退避が難しい。
その場合は、VBoxManage の Compact 機能が使える。不要領域を削除してスリム化することができる。

1. VM を立ち上げる
2. Guest OS の不使用領域をゼロ埋めする ( パーティション毎 )

    ```bash
    # Guest OS
    # `/` と `/home` が別パーティションなら、どちらでも実行する
    $ cd /home && dd if=/dev/zero of=zero bs=4k && rm zero
    $ cd / && sudo dd if=/dev/zero of=zero bs=4k && sudo rm zero
    ```

3. VM を落とす
4. Windows 側で、以下操作を行う

    ```powershell
    $ cd C:\"Program Files"\Oracle\VirtualBox
    $ .\VBoxManage.exe clonemedium disk C:\Users\username\"VirtualBox VMs"\vmname\box-disk1.vmdk C:\Users\username\"VirtualBox VMs"\vmname\box-disk1.vdi --format vdi
    $ .\VBoxManage.exe closemedium disk C:\Users\username\"VirtualBox VMs"\vmname\box-disk1.vmdk --delete
    $ .\VBoxManage.exe modifymedium disk C:\Users\username\"VirtualBox VMs"\vmname\box-disk1.vdi--compact
    $ .\VBoxManage.exe clonemedium disk C:\Users\username\"VirtualBox VMs"\vmname\box-disk1.vdi C:\Users\username\"VirtualBox VMs"\vmname\box-disk1.vmdk --format vmdk
    $ .\VBoxManage.exe closemedium disk C:\Users\username\"VirtualBox VMs"\vmname\box-disk1.vdi --delete
    ```

# Docker for Windows

Docker for Windows は Linux Container を Hyper-V 上の MobyLinux で動かしているが、そいつが結構でかくなる。

**保存場所 :** `C:\Users\Public\Documents\Hyper-V\Virtual Hard Disks\MobyLinuxVM.vhdx`

## 1. ゴミになっている Container, Image, Volume, Network を削除

Docker を使っていると、知らぬ間に Dead Container, Unused Volumes が増えてゆく。
今は prune コマンドがあるので、これでさっと削除できる。

```powershell
docker system prune --all --volumes
```

## 2. 不要な Image を削除

Image は意外と大きくて、それだけで 10 GB 以上になることもある。
使わないなものを選んで消そう。

```powershell
docker image list
# REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
# <none>                    <none>              77af4d6b9913        19 hours ago        1.089 GB
# committ                   latest              b6fa739cedf5        19 hours ago        1.089 GB
# ...

docker image rm <image>
```

## 3. 仮想 HDD を Shrink

VirtualBox 同様、Hyper-V の仮想 HDD も不要領域が自動でホストOS に返らない。
以下を管理者で実行して Shrink する。

```powershell
Optimize-VHD -Path "C:\Users\Public\Documents\Hyper-V\Virtual Hard Disks\MobyLinuxVM.vhdx" -Mode Quick
```

https://github.com/docker/for-win/issues/244


# WSL

Windows Subsystem for Linux もジリジリと容量が増えていく。
ファイルの場所は Linux Distribution によって異なるが、例えば以下などにある。

**保存場所 :** `C:\Users\username\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_*\LocalState\rootfs`

ただの Linux なので、普段通りのメンテナンスを行う。以下は Ubuntu を前提とする。

## 1. 不要ファイルを削除

```bash
$ sudo apt-get clean
$ sudo apt-get autoremove
$ sudo apt-get autoclean

$ sudo rm -rf /tmp/**/*
```

## 2. 不要パッケージの削除 ( 自信が無ければやらない )

`apt-get autoremove` `apt-get autoclean` で大方削除されるが、誰にも使われていない孤立パッケージが残っていないか以下で探し、不要であれば削除する。

```bash
$ sudo apt-get install deborphan

# 消しきれなかった孤立したパッケージ一覧
$ sudo deborphan

# もう少し深く探す
$ sudo deborphan --guess-all

# 消しきれなかったパッケージ設定ファイル
$ deborphan --find-config

# 全部消すなら
$ sudo apt-get --purge remove (sudo deborphan)
$ sudo dpkg -P (sudo deborphan --find-config)
```

## 3. 不要ロケールファイルを削除 ( 自信が無ければやらない )

以下のような必要と思われるロケールを残して削除する

- en
- en_US.UTF-8
- ja
- ja_JP.UTF-8

```bash
$ sudo apt-get install localepurge
$ sudo localepurge
```

# scoop

Windows のパッケージマネージャ。
[Scoop と PackageManagement を使った Windows 環境の構築 - Qiita](https://qiita.com/kikuchi_kentaro/items/77793e4a21db6ffdb7cd)

scoop はバージョンアップのたびに過去のバージョンを保持していくので、気がつくととても大きくなっている。

**保存場所 :** `C:\Users\username\scoop`

## 1. 古いバージョンを削除

以下コマンドでは、全ての古いバージョンを消してしまう。

```powershell
scoop cleanup *
```

消したくないものがある場合は `*` の部分にパッケージ名を入れて個別に消していくしかない。

しかし、例えば Scoop を使って Python の処理系バージョンの切り替えをしている場合、どうすれば良いのか。
この場合、Versions Bucket の中にマイナーバージョン毎 ( python27, python35, python36, anaconda2, anaconda3 ... ) にパッケージが小分けにされているので、こちらを導入すると良い。

## 2. キャッシュ削除

```powershell
scoop cache rm *
```

# 各プログラム言語環境のクリーンアップ

各プログラム言語環境の不要パッケージ・キャッシュも気づくと容量を相当使っていることがある。
当然キャッシュを消せば、次回実行時にコンパイルが実行され時間がかかるようになるので、必要ならばキャッシュは消さないように。

以下は、肥大化しがちな言語 ( パッケージ管理ツール ) のみ記述した。 

## Python ( pip, conda )

```powershell
rm -r -fo "$env:LocalAppData\pip\cache"

# conda を利用しているなら
conda clean --all
```

Conda 環境は密かに容量を増やしているので、たまにやると 2 GB 位減る。
注意する点として、`conda clearn --all` は問題を引き起こす可能性があると言われているので、**最悪環境を作り直すかもしれない覚悟は必要**。

## Node ( NPM, Yarn )

```powershell
yarn cache clean
npm cache clean
```

## Rust ( Cargo )

```powershell
cargo install cargo-cache
cargo cache --autoclean
```

## Java ( Gradle )

```powershell
rm -r -fo "$env:USER_HOME\.gradle\caches"
```

# 番外編 - 扱いが難しいもの

## hiberfil.sys, pagefile.sys

C: 直下にあるドデカファイル。
大きいので何かと目に入るが、調べると『消すとやばい』的な情報が多く、一体どうすればよいのか分からない奴。

### pagefile.sys

仮想メモリの実態 ( ページファイル )。
物理メモリをたんまり積んでいても使う時は使う。
OS がよしなにやってくれるので、余程邪魔じゃない限りはほっとこう。

一応カスタマイズできるので、余りに大きすぎる場合には固定値にしても良いかも。
[システムのプロパティ → パフォーマンスオプション → 仮想メモリ]

![image.png](https://qiita-image-store.s3.amazonaws.com/0/20198/83044c85-cdf3-7eca-1ff5-47b9b5412365.png)

### hiberfil.sys

休止中状態になる際に、メモリの内容を一旦書き出すファイル。
復旧時はこのファイル内容をメモリにドカッと乗せることで高速化を図る。

一応この機能を切ることもできるらしいが、不具合が出ることもあるらしく、自信がないなら切らないのが吉。