1. 序章

Unixライクなシステムでは、 iノードは、ファイルとディレクトリを記述するデータ構造です。 可能なiノードの数は制限されており、パーティションの作成時に設定されます。 つまり、デバイスにスペースがあっても、それらが不足し、新しいファイルを作成できなくなる可能性があります。 このチュートリアルでは、この状況を防ぐ方法と、発生した場合の対処方法を学習します。

2. iノードが制限されている理由

各iノードには、属性やディスクブロックの場所など、ファイルに関する重要な情報が含まれています。 このデータは、システムがファイルを使用するために必要です。 Linuxベースのシステムのデフォルトである拡張ファイルシステムのファミリーのファイルシステムでは、iノードは固定サイズのテーブルに格納されます。 このテーブルのサイズはパーティションの作成時に決定され、後で変更することはできません。

他のファイルシステム(たとえば、macOSで使用されるAPFS)は、固定サイズのテーブルを使用しませんが、代わりに、Bツリーなどの他のデータ構造を使用します。 したがって、可能なiノードの数ははるかに柔軟です。 インデックスを64ビット整数(または古いファイルシステムでは32ビット)に格納できるサイズによって制限されますが、これを達成するのは困難です。

3. iノード制限の設定

iノードの制限はパーティションの作成時に設定されます。いくつかの適切なデフォルトが設定されているため、通常は心配する必要はありません。 ただし、膨大な数の小さなファイルを保存することがわかっている場合は、これらのデフォルトをオーバーライドできます。 たとえば、システム内の平均的なファイルのサイズはわずか1kBであると予想できます。 1000バイトごとに1つのiノードを持つext4パーティションを作成しましょう。

$ sudo mkfs.ext4 -i 1000 /dev/sdev

または、 Btrfs のように、iノードが制限されていても同じ問題が発生しない別のファイルシステムを選択することもできます。

4. チェックして無料iノード

df コマンドを使用して、使用可能なiノードを確認できます。

$ df -i
Filesystem     512-blocks      Used  Available Capacity iused      ifree %iused  Mounted on
/dev/disk1s5s1  489620264  46865488   34089872    58%  568975 2447532345    0%   /
/dev/disk2s1   1953456384 727555584 1225900800    38% 2842014    4788675   37%   /Volumes/T7

「iused」列は使用済みiノードの数を示し、「ifree」は空きiノードの数を示し、「%iused」列は使用済みiノードのパーセンテージを示します。

残念ながら、不要なファイルを削除する以外にiノードを解放する方法はありません。 問題は、iノードの制限を使い果たすファイルをどこで探すべきかわからない場合があることです。 これに取り組む1つの方法は、ディレクトリ内のファイル数でディレクトリを並べ替えることです。 そうすることで、問題のあるディレクトリをすばやく見つけることができます。

これを実現するには、すべてのファイルを一覧表示し、パスの最初のディレクトリのみを選択してから、各ディレクトリの出現回数をカウントします。

$ sudo find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n
...
1585 Documents
6979 Downloads
7168 Pictures
113659 .nvm
669666 Library
980996 Projects

ご覧のとおり、「Projects」ディレクトリに最も多くのファイルを保存しています。 この時点で、さらに調査するか、ファイルを削除したり、そのディレクトリを他のドライブに移動したりするなどのアクションを実行することを決定できます。

5. 結論

このチュートリアルでは、iノードとは何か、およびその数が制限されている理由を調べました。 ファイルシステムを構成するか、ニーズにより適したファイルシステムを選択することで、iノードの問題を防ぐことを検討しました。 次に、iノードの使用状況を分析して問題のあるディレクトリを見つける方法を学びました。