iノードとはファイルシステム上でファイルやディレクトリを管理するためのデータです。
iノード番号というものがあり、これは限りがあります。この限界を超えてしまうとファイルやディレクトリが作成できなくなってしまうのです。 このiノード番号はパーティションサイズにより限界値が決まります。
iノードで管理されるもの
iノード番号、UID(ユーザID)、GID(グループID)、パーミッション、ファイルサイズ、ファイル作成時間、更新日時、実際のデータの位置(ディスク上の物理的な場所)、そのファイル自身への参照数を管理しています。確かめてみる
vagrantでubuntu14.04を立ち上げてみて、iノードを見てます。
# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 2621440 69573 2551867 3% /
none 62719 2 62717 1% /sys/fs/cgroup
udev 61480 401 61079 1% /dev
tmpfs 62719 328 62391 1% /run
none 62719 1 62718 1% /run/lock
none 62719 1 62718 1% /run/shm
none 62719 2 62717 1% /run/user
vagrant 1000 0 1000 0% /vagrant
vagrant_data 1000 0 1000 0% /vagrant_data
各フィールドの意味
フィールド名 | 意味 |
---|---|
Inodes | そのデバイスで作成できる、inodeの限界値 |
IUsed | 現在のinode 使用量 |
IFree | 残り作成できるinode数 |
IUse% | inodeの使用率(%) |
/dev/sda1はiノードが2621440あって、現在69573使っていて残りは2551867みたいですね。 残り2551867はファイルやディレクトリが作成できます。
次にiノード番号を見てみます。 hoge.txtを作りました。
# ls -li
total 0
284 -rw-r--r-- 1 root root 0 Sep 25 04:33 hoge.txt
一番左がiノード番号ですので、284これがhoge.txtのiノード番号です。
そういえば、ファイルを作る前は/dev/sda1はiノードの残りが、2551867でした。 hoge.txtを作った後はどうなったか見てみます。
# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 2621440 69574 2551866 3% /
ちゃんと1減ってますね。
iノードを枯渇させてみる
iノードが少ないパーティションを用意してみました。
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda5 2560 11 2549 1% /mnt
iノードの空きが2549あるので、2549個ファイルを作ってみます。
touch {1..2549}.txt
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda5 2560 2560 0 100% /mnt
見事iノードが100%になりました。この状態でファイルを作ろうとすると。。。
touch hoge.txt
touch: cannot touch ‘hoge.txt’: No space left on device
空き容量が無いとエラーになりました。実際に容量をみてみると余裕はあります。
df -h /mnt
Filesystem Size Used Avail Use% Mounted on
/dev/sda5 8.7M 147K 7.9M 2% /mnt
まとめ
- iノードがiノード番号、UID(ユーザID)、GID(グループID)、パーミッション、ファイルサイズ、ファイル作成時間、更新日時、実際のデータの位置(ディスク上の物理的な場所)、そのファイル自身への参照数を管理している
- パーティションサイズによってiノードの限界値が決まる
- ディスク容量だけ注視するのではなく、iノードの数にも気をつける
- 大量にファイルが作成される場合は、iノードの数に気をつける