メンテナンス・トラブルシュート - ディスク・ファイル・メモリ - inode が枯渇する

 
1. 概要
2. 参考サイト
3. inode の数をディレクトリ単位で調査する

1. 概要

 実際に現象が発生したのは、CentOS なのですが、調査するのに使ったコマンドは FreeBSD にそのまま使えそうなので、記録しておきます。  対象のマシンで何かのスクリプト(最終的に cp で発生したようですが)を実行したときに

cp: cannot create regular file `/パス/ファイル名': デバイスに空き領域がありません
 と出力されたのです。  df コマンドで見てみると(実際のマシンではないので値は全然違います)

> df -H
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/ada0p2    306G     33G    249G    12%    /
devfs          1.0k    1.0k      0B   100%    /dev
 実際のマシンで、ディスク容量そのものには充分な空きがありました。  あれこれ試した結果

> df -i -H
Filesystem     Size    Used   Avail Capacity iused ifree %iused  Mounted on
/dev/ada0p2    306G     33G    249G    12%    767k   38M    2%   /
devfs          1.0k    1.0k      0B   100%       0     0  100%   /dev
 と inode を見たときに実際のマシンでは %iused が 100% になっていて、ファイルが何も作られない状況にあったのです。  inode をこんな感じで意識したことはなかったなぁ。  で、あわくって調べるわけです。

2. 参考サイト

 inode が何者かについては「i ノード(inode)とは」が大変参考になります。  かいつまんでいうとファイルおよびディレクトリ1つにつき1つ分のエリアを使用するもので、ディスクの容量とフォーマットによって最大数が決まってくるもの・・・。  これを調べることに関しては「Linux で inode が枯渇した場合にどうやって調査するか - astamuse Lab」が大変参考になります。

3. inode の数をディレクトリ単位で調査する

 ここは、参考サイトまるまるでコマンドを使用して(この時点でコマンドの意味を理解していない)

> find / -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -nr
523439 usr
131480 var
2614 boot
2099 root
 491 etc
 243 tmp
 146 rescue
 134 sbin
  73 lib
  45 bin
   8 libexec
   1 entropy
   1 COPYRIGHT
   1 .sujournal
   1 .rnd
   1 .profile
   1 .cshrc
 ルートディレクトリの下のファイルの数をディレクトリ単位で集計して、多い順にソートしているようです。  では、ここで /usr が多いのがわかったので /usr 以下を見るには、以下のようにして調べるようです。

> find /usr -xdev -type f | cut -d "/" -f 3 | sort | uniq -c | sort -nr
201471 ports
173173 local
72544 src
39800 home
15498 share
15219 obj
2324 lib
1811 include
 506 lib32
 485 bin
 294 sbin
 272 libexec
  31 libdata
  13 tests
 なるほど、法則はわかりました。

> find /パス -xdev -type f | cut -d "/" -f 3 | sort | uniq -c | sort -nr
        ↑                                 ↑
        パスを指定                         パスの階層+2の値を指定
 って指定していけば、ディレクトリ単位でファイル数(≒inode の数)が調べられます。