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 -hとdu -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 -hとdu -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% /