Linuxのiノードはどのように機能するのか?

Linuxを長く使っていると、「iノード」という用語を目にすることがあるでしょう。これは時折現れるもので、あなたがしていることには影響しません。ここでは、iノードとは何か、そしてそれがどのように機能するのかを説明します。
iノードとは?
図書館では、すべての本がジャンル、著者名、または年齢層によって整理されています。「ボビー・ダニエルズ」のスリラーを見つけたい場合、スリラーセクションに直接歩いて行き、「B」で始まる著者名を探し始めるでしょう。図書館と同様に、Linuxシステム内のすべてのファイルは、効率的な検索と使用のために整理されています。iノードは、Linuxシステム内のファイルの配置を助けるエンティティです。
ファイルメタデータとは?
「sample.txt」というファイルがあり、その中に「hello」というデータが含まれているとしましょう。
このファイルには、ファイルサイズ、権限、ユーザーおよびグループの所有権、作成/アクセス/変更のタイムスタンプ、リンクカウントなど、関連するデータと情報があります。これらの情報はすべて、ファイルメタデータと総称されます。

ファイルシステムとは?
ハードドライブのようなストレージデバイスでは、パーティションはファイルストレージに使用される前にファイルシステムとしてフォーマットされます。ファイルシステムはハードドライブの司書です。正式には、パーティション上にファイルを体系的に保存するために連携して機能するデータ構造とアルゴリズムのセットです。
Linuxシステムのパーティションは、頻繁にEXT4でフォーマットされます。他のファイルシステム、例えばB-Treeファイルシステム(BTRFS)、Reiserファイルシステム、ZFSなども使用可能です。
すべてを結びつける
iノードは、ファイルのメタデータを保持するExt4上のデータ構造です。

もちろん、ファイルシステム上には多数のファイルがあります。あなたが推測した通り、各ファイルには独自のiノードがあります。iノードを一意に識別するために、各iノードには番号が付けられています。
iノード番号はどのようになるのか?
ファイルシステム上のiノード番号は1から始まります。最初の10個のiノードはシステム用に予約されています。ユーザーファイルのメタデータはiノード11から保存されます。すべてのiノードは、iノードテーブルにきれいにスタックされています。
iノードテーブルの1エントリは256バイトのサイズです。ファイルに対して、Linuxは256バイト内にすべてのメタデータを賢く整理します!さらに、ファイルのiノードには、ファイルシステム内でファイルのデータがどこにあるかに関する情報も含まれています。覚えておいてください – iノードにはファイルのメタデータのみが保存されます。
ファイルシステム内のiノードの総数は、利用可能なスペースとパーティションに保存できるファイルの数によって決まります。
iノードはどのように割り当てられ、解放されるのか?
ユーザーが新しくフォーマットされたファイルシステムにファイルを追加すると、iノード11から始まるiノードがファイルメタデータを保持するために割り当てられます。
「iノードビットマップ」と呼ばれる別のデータ構造があり、iノードの割り当て状況を追跡します。これは、マップとして機能するビットのコレクションです。
以下の表に示すように、iノードビットマップの8ビットを考慮して、iノード11から18の割り当て状況を示します。ビットマップの値が1であれば、そのiノードは割り当てられている、つまりファイルのメタデータを保持するために使用されています。ビットマップの値が0であれば、そのiノードは現在使用されていないことを意味します。ここでは、iノード17が使用中であることがわかります。

iノード17にメタデータがあるファイルが削除された場合、その対応するビットマップの状態は0になり、他のファイルによって使用されることができることを示します。

ファイルのiノード番号を表示するには?
これを行う方法は2つあります。
最初の方法は、lsコマンドを-iスイッチとともに使用し、ファイル名を続けることです。出力の最初のフィールドが「sample.txt」のメタデータを持つiノード番号です。
同じ情報は、ファイル名の後にstatコマンドを使用することでも取得できます。

パーティションの利用可能なiノードの総数を表示するには、dfコマンドを-iスイッチとともに使用できます。
「/dev/sda4」パーティションでは、404754480のiノードが使用可能で、そのうち359044のiノードが使用されています。
結論
本質的に、iノードテーブルはすべてのファイルのメタデータをiノードに慎重にスタックし、ファイルデータの位置に関する情報を含んでいます。Linuxのiノードについて私たちが議論したことは、単に氷山の一角に過ぎません。その内部の動作についての詳細は、こちらのリンクを参照してください。