サーバー

Ubuntuが容量いっぱいなときに叩くdu, dfコマンドやncduの紹介

Ubuntuが容量いっぱいなイメージ

こんにちは、サーバ立てていろいろ実験したりしているとたまに容量がいっぱいになってしまいます。
You don't have enough free spaceと見ると「ああ、来たか」という気持ちになりますね。

いつも調べなおしたりするのが面倒なので、ここに自分の備忘録も兼ねて書いておこうと思います。

どのディレクトリが容量を食っているか確認

一番最初に全体の確認をしてしまいましょう。

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            837M     0  837M   0% /dev
tmpfs           169M   18M  152M  11% /run
/dev/sda1       9.7G  7.6G  2.1G  79% /
tmpfs           845M     0  845M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           845M     0  845M   0% /sys/fs/cgroup
tmpfs           169M     0  169M   0% /run/user/1001

このコマンドで /dev/sda1 がやたら容量を食っているのがわかります。
今回は79%ですが、97%越えたあたりから打てなくなるコマンドが多くなる気がします。

ですが、 /dev/sda1 ってどこやねん、という話なので、実際にどこの容量がこの割合を占めているかチェックしていきます。
先に答えを書いておくと、だいたいの場合が /usr/var です。
一応 /lib もそれなりに多いのですが、ライブラリに関してはアホみたいに突っ込まない限りはそんなに整理すべきものはないと思います。

du -s /usr/* | sort -rn | head -30
1193172	/usr/local
1047724	/usr/lib
651948	/usr/bin
542204	/usr/src
469392	/usr/share
43528	/usr/sbin
42224	/usr/include
4	/usr/games
4	/usr/etc

とすると、 /usr 以下の容量を食っている順30位までを表示してくれます。
ちょっと時間がかかるので、ある程度特定できているときはより深い階層を調べると良いです。

これを続けて原因を特定したら「何が消せるかを判断する」という流れになります。

要らないカーネルや不要なキャッシュをクリア

今回の場合、最初の段階で E: You don't have enough free space in /var/cache/apt/archives/ というメッセージが出てきていたので、aptのキャッシュがいっぱいなんだな、すぐにわかる状況でした。

というわけで、

$ cd /var/cache/apt/archives/
$ ls

としたところ、やたらdebファイルが存在していました。
基本的に全部要らないので、

$ sudo apt-get clean

とすると、ほとんどのファイルが消去されて2%ほど容量に空きができました。(少ない。。)

そしてその後、 /usr/src/ 内の掃除をしたいなぁと思ったら、ほとんどすべて古いカーネルだったので、

$ sudo apt-get -y autoremove

で一気に依存関係がなく、必要のないものを除去します。

だいたいここまでやると容量はかなり空くのでしばらく大丈夫な状態になります。
しかし、今回はかなりざっくりとしたやり方なので、もし本番運用中のアプリケーションを置いているサーバなどの場合はしっかり原因把握してから作業にあたりましょう。

※本記事でコマンドを叩いたは自分の遊び場用サーバなので軽めにやっています。

ncduコマンドのインストール

ついでだったので ncdu をインストールしてみました。

$ sudo apt-get -y install ncdu
$ cd /var
$ ncdu

とすると、

  702.6 MiB [##########] /lib
  412.8 MiB [#####     ] /www
  303.4 MiB [####      ] /cache
   11.2 MiB [          ] /log
    2.6 MiB [          ] /backups
   36.0 KiB [          ] /spool
   12.0 KiB [          ] /tmp
e   4.0 KiB [          ] /snap
e   4.0 KiB [          ] /opt
e   4.0 KiB [          ] /mail
e   4.0 KiB [          ] /local
e   4.0 KiB [          ] /crash
@   0.0   B [          ]  lock
@   0.0   B [          ]  run

こんな感じの画面が立ち上がるはずです。
ここから十字キーで移動してEnterを押すと下階層まで辿っていけるので非常に便利です。
視認性が一気によくなるので、容量の空きがあるときに入れておくと良いかもしれません。
閉じるときは普通に Ctrl + c です。

本番ならディスク容量の監視・検出と通知はマスト

実際に何かWebアプリケーションを運用する際、監視ツールを導入して残ディスク容量の多寡を検出できるようにしておくと良いです。
GUIベースの監視ツールを毎日見ながら運用する、というのも一つの手ですが、SlackやEメール、電話で通知させるようにするとより運用がラクになります。

運用コストを下げればその分だけ別のことに集中できるので、導入するメリットは強いです。
ネットワーク周りからロギングまでさざまな監視ツールがあります。
Zabbix, Mackerel, Nagios, muninなどなど。
シェルスクリプトにしてcronで叩かせてアラートを出すという手段もあります。

さまざまな方法がありますが、導入コスト自体そこまで高くないのでぜひ導入を検討してください。
各監視ツールについては後々導入や使用感について記事にしていきたいと思います。

ABOUT ME
UOT合同会社 / SOT Co.,Ltd 合同開発部
UOT合同会社 / SOT Co.,Ltd 合同開発部
UOT合同会社 / SOT Co.,Ltd開発部の合同公式ブログ。 代表がITエンジニア出身のデジタルノマド→日本とベトナム・ホーチミンでIT企業設立。 海外デジタルノマドやエンジニアのリモートワーク、プログラミング、オフショア開発やミニラボ情報などをまとめていきます。