df -hを実行してディスク容量がいっぱいになったことを確認し、duを使ってディスク容量を無駄に使っているファイルを探そうとしたが、大きなディスク容量を使用しているファイルがなかった。ルートディレクトリの容量をdu -shx /で確認した結果とdf -hの結果が大きく異なっていた。
du -shx-x, --one-file-systemは、duの引数としてルートディレクトリを指定しているために「違うファイルシステムの物も大量に集計に入ってしまうのを防ぐ」目的で入れているオプション。mountされている追加のディスクがmnt1とmnt2だったら、--excludeオプションを使ってdu -sh --exclude="/mnt*" /でもいいが、-xオプションのほうが短く書ける。

$ df -h | head -2
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        28G   26G  1.5G  95% /
 
$ sudo du -shx / 2>/dev/null
14G     /

ここで原因として考えられるのは、何らかのプロセスが大きなファイルを掴んでいてファイルを削除しても容量が減らないということ。
そのようなプロセスを見つけるために、lsofでファイルを開いているプロセスを確認した。

$ sudo lsof / | head -3
COMMAND     PID    USER   FD   TYPE DEVICE   SIZE/OFF    NODE NAME
init          1    root  cwd    DIR    8,3       4096       2 /
init          1    root  rtd    DIR    8,3       4096       2 /

lsofで開いているファイルのサイズが7列目のSIZE/OFFでわかる。7列目を数値として降順にsortして、初めのほうを見てみる。

$ sudo lsof / | sort -k7 -nr | head -1
rsyslogd  25003    root    1w   REG    8,3 11141439810  276450 /var/log/messages (deleted)

ファイルサイズが11Gのファイルが見つかった。df -hdu -shxの差とほぼ重なるし、ファイル名には「(deleted)」とついている。誰かがファイルを消したがrsyslogdが掴んでいて、ディスク容量を圧迫していたようだ。

$ ls /var/log/messages
ls: cannot access /var/log/messages: No such file or directory
$ ps -ef | grep 2500[3]
root     25003     1  0  2016 ?        01:28:56 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5

rsyslogdを再起動し、df -hdu -shx /の結果が合うようになった。

$ sudo service rsyslog restart
Shutting down system logger:                               [  OK  ]
Starting system logger:                                    [  OK  ]
$ ls /var/log/messages
/var/log/messages
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        28G   14G   12G  55% /