〜Linux初心者に捧ぐ〜 原始的だけど確実なディスクのお掃除テク

ある日、仕事で出会った開発系の若者が自サーバで何かトラブルがあったらしく、

「なんか・・・なんか・・・アプリケーション動かんくなったんですけど・・・」

なんや、どした？

「なんか・・・なんか・・・こんな英語が出てくるんですけど・・・」

ピロンッ（Slack通知音） `No space left on device`

そんくらいのイングリッシュはマウスで言え。
まーまーまー、若者よ、怖がることはない。
`df`と`du`コマンドって知ってるかい？

というやり取りがあり、意外と知らないもんなんやなと思い、教えてあげた解決方法です。


## 兎にも角にも現状を把握しよう
手元ではLinux系ディストリのUbuntuを使ってるので、そいつを例に解説していきます。

- df  
  パーティション毎のディスク使用量が見れます。
  - `-h` デフォでByte表記になるので、人が見やすい、Mega,Giga表記で表示してくれるオプション

```
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            2.9G     0  2.9G   0% /dev
tmpfs           597M  1.4M  595M   1% /run
/dev/sda2        80G   79G    1G 100% / ←ココ
tmpfs           3.0G     0  3.0G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           3.0G     0  3.0G   0% /sys/fs/cgroup
/dev/loop0       94M   94M     0 100% /snap/core/9066
/dev/loop1       98M   98M     0 100% /snap/core/9289
tmpfs           597M     0  597M   0% /run/user/1000
```

パーティションがいくつか出てきますが、私の場合`/`一本なので、上の内容はUbuntuの最小構成だと思います。
`/` は `80G` 中 `79G` 使っていて、残り `1G` しかないということがわかりますね。


## ドロ臭いけど一番確実な方法は`du`コマンドをひたすら繰り返すこと
`du`は、ディスクの使用量をディレクトリごとに集計して表示するコマンドです。
[【 du 】コマンド――ディスクの使用量を表示する](https://www.atmarkit.co.jp/ait/articles/1610/25/news016.html)

どこのファイルが肥大化しているのか全く検討が付かない場合は、一番上の階層である`/`から始めましょう。
あたりが付いてるようであれば、そのディレクトリ配下から始めましょう。
素直に使ってれば大体溜まりやすいのは、`/home` `/usr/` `/var`あたりでしょう。

`du`コマンドに付けるオプション

- `-h` デフォはByte表記なので、見やすいようにMega,Giga表記  
  ディレクトリ数が多い場合は、逆に付けない方がひと目で見分けやすいこともあります。
- `-d` 何回層下までもぐるか  
  今回はわかりやすくするために`1`階層毎に繰り返します。

```
$ sudo du -hd 1 /
15M     /bin
142M    /boot
0       /dev
5.4M    /etc
4.4G    /home
838M    /lib
0       /lib64
0       /media
0       /mnt
0       /opt
...省略...
```
※`/`など権限規制がかかっているようなディレクトリに関しては`sudo`を使ってルート権限で実行する必要があります。

一部省略してますが、`/home`で4.4G取られてるみたいなので、次はここを探ってみましょう。

```
$ sudo du -hd 1 /home
4.4G    /home/nyamane
32K     /home/kamaitachi
4.4G    /home/
```
私のホームディレクトリの容量がほとんどということがわかりますね。
では次は、私のホームディレクトリを探っていきましょう。
ディレクトリ数が多い場合は、`M`とか、`G`が並んでると見分けにくいこともあるので、試しに`-h`オプションを取って見てみましょう。

```
$ sudo du -d 1 /home/nyamane/
40420   /home/nyamane/.cache
0       /home/nyamane/.gnupg
16      /home/nyamane/.ssh
3444    /home/nyamane/.config
2251960 /home/nyamane/repos
0       /home/nyamane/snap
87396   /home/nyamane/pkgs
11436   /home/nyamane/.kube
4       /home/nyamane/.k9s
4       /home/nyamane/.docker
1316    /home/nyamane/.kubectx
41556   /home/nyamane/google-cloud-sdk.staging
159004  /home/nyamane/google-cloud-sdk
1103432 /home/nyamane/.vscode-server
357428  /home/nyamane/.npm
366672  /home/nyamane/.rbenv
4892    /home/nyamane/.gem
27016   /home/nyamane/.solargraph
59920   /home/nyamane/.local
80      /home/nyamane/.pylint.d
4516088 /home/nyamane/
```

`/home/nyamane/repos` 約2.2GB
`/home/nyamane/.vscode-server` 約1.1GB

さー、いよいよ核心に近づいて来ましたね。
ここは私の開発用のリポジトリをまとめたディレクトリです。
後は今ままでの作業を繰り返して一歩ずつ進むのみです。
最終的に最下層まで調べたとして、最後は`ls`でファイル単位まで突き止めましょう。

```
$ ls -laF /home/nyamane/repos/some_repos/logs
```
lsで調べた結果、`development.log`というファイルが大きいことがわかったので、消しちゃいましょう。

```
$ rm -f /home/nyamane/repos/some_repos/logs/development.log
```

おめでとうございます。
これであなたは+何GBかのディスク容量を確保することができました。

## おわりに
今回は自作アプリケーションが出力している開発用のログ・ファイルだったので、ただ単に`rm`してますが、そもそも消していいファイルかどうかの判断も必要なので、そこは適宜調べて対処する必要があります。
何も考えずに消してしまうと、痛い目に合う可能性もありますのでご注意下さい。

しょっちゅうディスク容量が頭打つ場合は、そもそもの容量設定が厳しいので、ディスクサイズの拡張、HDD換装なども検討しましょう。
開発用に使ってるサーバであれば、アプリケーションでログ出し過ぎということも考えられます。