メンテナンス・トラブルシュート - ディスク・ファイル・メモリ - 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 の数)が調べられます。
cp: cannot create regular file `/パス/ファイル名': デバイスに空き領域がありません
> 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
> 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
> 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の値を指定