Linux システムのファイル メタデータ: inode の詳細な説明

WBOY
リリース: 2024-02-10 09:09:13
転載
619 人が閲覧しました

Inode は Linux システムの重要なデータ構造であり、ファイルの種類、サイズ、権限、タイムスタンプ、リンク数、データ ブロックの場所などのファイル メタデータを保存するために使用されます。 inode はファイル システムのコア コンポーネントであり、ファイルの作成、削除、変更、検索などの操作に使用できます。この記事では、inodeの番号付け、割り当て、解放、検索、インデックス付けなど、inodeの原理や特徴を紹介し、使用例や注意点などを紹介します。

ファイル名 -> iノード -> デバイスブロック

Linux システムのファイル メタデータ: inode の詳細な説明

1. i ノードとは何ですか?

inode を理解するには、ファイル ストレージから始める必要があります。

ファイルはハードディスクに保存されており、ハードディスクの最小の記憶単位を「セクタ」といいます。各セクターには 512 バイト (0.5KB に相当) が格納されます。

オペレーティング システムはハードディスクを読み取る際、セクターごとに読み取るのではなく、効率があまりにも悪いため、複数のセクターを一度に連続して読み取ります。つまり、一度に 1 つの「ブロック」を読み取ります。 。複数のセクターから構成されるこの「ブロック」がファイルアクセスの最小単位です。 「ブロック」の最も一般的なサイズは 4KB です。つまり、8 つの連続したセクターがブロックを形成します。

ファイル データは「ブロック」に保存されるため、ファイルの作成者、ファイルの作成日、ファイルのサイズなどのファイルのメタ情報を保存する場所も見つける必要があります。ファイルなどファイルのメタ情報を格納するこの領域はinodeと呼ばれ、中国語訳は「インデックスノード」です。

2. inode の内容

inode には、ファイルのメタ情報、具体的には次の内容が含まれます:

* ファイル内のバイト数

* ファイル所有者のユーザー ID

* ファイルのグループ ID

* ファイルの読み取り、書き込み、および実行の権限

* ファイルには 3 つのタイムスタンプがあります。ctime は i ノードが最後に変更された時刻を指し、mtime はファイルの内容が最後に変更された時刻を指します。atime はファイルが最後に開かれた時刻を指します。

* リンクの数、つまり、この i ノードを指すファイル名の数

* ファイル データ ブロックの場所

stat コマンドを使用して、特定のファイルの i ノード情報を表示できます。

stat example.txt

つまり、ファイル名を除くすべてのファイル情報は i ノードに保存されます。ファイル名がない理由については、以下で詳しく説明します。

3. i ノードのサイズ

Inode はハードディスクの容量も消費するため、ハードディスクがフォーマットされると、オペレーティング システムは自動的にハードディスクを 2 つの領域に分割します。 1 つはファイルデータを格納するデータ領域であり、もう 1 つは inode に含まれる情報を格納する inode 領域 (inode テーブル) です。

各 inode ノードのサイズは通常 128 バイトまたは 256 バイトです。 inode ノードの合計数はフォーマット中に指定され、通常は 1KB ごとまたは 2KB ごとに 1 つの i ノードが設定されます。 1 GB のハードディスクで、各 i ノードのサイズが 128 バイトで、1 KB ごとに 1 つの i ノードが設定されていると仮定すると、inode テーブルのサイズは 128 MB に達し、ハードディスク全体の 12.8% を占めます。

各ハードディスク パーティション内の i ノードの合計数と使用されている数を表示するには、df コマンドを使用できます。

df -i

各 i ノード ノードのサイズを表示するには、次のコマンドを使用できます:

sudo dumpe2fs -h /dev/hda | grep “Inode サイズ”

各ファイルには i ノードが必要なため、i ノードが使い果たされていても、ハードディスクがまだいっぱいになっていない場合があります。現時点では、ハード ドライブ上に新しいファイルを作成することはできません。

4. i ノード番号

各 i ノードには番号があり、オペレーティング システムはその i ノード番号を使用してさまざまなファイルを識別します。

ここで繰り返しておきますが、Unix/Linux システムは内部的にファイル名を使用せず、ファイルを識別するために i ノード番号を使用します。システムにとって、ファイル名は識別を容易にするための inode 番号のエイリアスまたはニックネームにすぎません。表面的には、ユーザーはファイル名でファイルを開きます。実際、システム内のプロセスは 3 つのステップに分かれています: まず、システムはファイル名に対応する i ノード番号を見つけます。次に、inode 番号を通じて i ノード情報を取得します。最後に、inode 情報に基づいて、ファイルデータが配置されているブロックにアクセスし、データを読み取ります。

ls -i コマンドを使用して、ファイル名に対応する i ノード番号を確認します:

ls -i example.txt

5. ディレクトリ ファイル

Unix/Linux システムでは、ディレクトリもファイルの一種です。ディレクトリを開くということは、実際にはディレクトリ ファイルを開くことを意味します。

ディレクトリ ファイルの構造は非常に単純で、一連のディレクトリ エントリ (dirent) のリストです。各ディレクトリ エントリは、含まれるファイルのファイル名と、ファイル名に対応する i ノード番号の 2 つの部分で構成されます。

ls コマンドは、ディレクトリ ファイル内のすべてのファイル名のみをリストします:

ls /etc

ls -i コマンドは、ディレクトリ ファイル全体、つまりファイル名と i ノード番号をリストします。

ls -i /etc

ファイルの詳細情報を表示したい場合は、inode ノードにアクセスし、inode 番号に従って情報を読み取る必要があります。 ls -l コマンドは、ファイルに関する詳細情報を一覧表示します。

ls -l /etc

6. ハードリンク

一般に、ファイル名とinode番号は「1対1」の関係にあり、各inode番号がファイル名に対応します。ただし、Unix/Linux システムでは、複数のファイル名が同じ i ノード番号を指すことができます。これは、同じコンテンツに異なるファイル名でアクセスできることを意味します。ファイル コンテンツを変更すると、すべてのファイル名に影響します。ただし、1 つのファイル名を削除しても、別のファイル名へのアクセスには影響しません。この状況は「ハードリンク」と呼ばれます。

ln コマンドはハード リンクを作成できます:

ln ソース ファイル ターゲット ファイル

上記のコマンドを実行すると、ソース ファイルとターゲット ファイルの i ノード番号は同じになり、同じ i ノードを指します。 iノード情報には「リンク数」という項目があり、そのinodeを指すファイル名の総数が記録されており、この時点で1ずつ増えます。逆に、ファイル名を削除すると、inode ノード内の「リンクの数」が 1 つ減ります。この値が 0 に減少すると、この i ノードを指すファイル名が存在しないことが示され、システムは i ノード番号とそれに対応するブロック領域をリサイクルします。

ところで、ディレクトリファイルの「リンク数」について話しましょう。ディレクトリを作成すると、デフォルトで「.」と「..」の 2 つのディレクトリ エントリが生成されます。前者の i ノード番号は、カレント ディレクトリの i ノード番号であり、カレント ディレクトリの「ハード リンク」に相当します。後者の i ノード番号は、カレント ディレクトリの親ディレクトリの i ノード番号です。親ディレクトリの「ハードリンク」に相当します。したがって、ディレクトリの「ハード リンク」の総数は、常に 2 にそのサブディレクトリ (隠しディレクトリを含む) の総数を加えたものと等しくなります。ここでの 2 は、親ディレクトリの「ハード リンク」と「ハード リンク」です。現在のディレクトリのリンク」。

7. ソフトリンク

ハード リンクに加えて、特殊なケースがあります。ファイル A とファイル B の i ノード番号は異なりますが、ファイル A の内容はファイル B のパスになります。ファイル A を読み取ると、システムは訪問者を自動的にファイル B に誘導します。したがって、どのファイルを開いても、最終的にはファイル B が読み取られます。このとき、ファイルAはファイルBの「ソフトリンク」または「シンボリックリンク」と呼ばれます。

これは、ファイル A がファイル B に依存して存在することを意味します。ファイル B が削除された場合、ファイル A を開くときに、「そのようなファイルまたはディレクトリはありません」というエラーが報告されます。これがソフト リンクとハード リンクの最大の違いです。ファイル A は、ファイル B の i ノード番号ではなく、ファイル B のファイル名を指します。その結果、ファイル B の i ノード「リンク番号」は変わりません。

ln -s コマンドはソフト リンクを作成できます。

ln -s ソース ファイルまたはディレクトリ ターゲット ファイルまたはディレクトリ

8. inode の特別な機能

inode 番号はファイル名から分離されているため、このメカニズムでは Unix/Linux システムに特有の現象が発生します。

1. ファイル名に特殊文字が含まれており、正常に削除できない場合があります。このとき、inodeノードを直接削除することでファイルを削除する役割を果たすことができます。

2. ファイルの移動やファイル名の変更はファイル名を変更するだけで、inode 番号には影響しません。

3. ファイルを開いた後、システムは i ノード番号に基づいてファイルを識別し、ファイル名は考慮されなくなります。したがって、一般に、システムは inode 番号からファイル名を学習できません。

ポイント3により、ソフトウェアの更新が簡単になり、ソフトウェアを終了したり、再起動したりすることなく更新できます。システムはファイル名ではなく i ノード番号によって実行中のファイルを識別するためです。更新すると、ファイルの新しいバージョンによって同じファイル名を持つ新しい i ノードが生成されますが、これは実行中のファイルには影響しません。次回このソフトウェアを実行すると、ファイル名は自動的にファイルの新しいバージョンを指すようになり、古いバージョンのファイルの i ノードがリサイクルされます。

9つの実際的な問題

低構成 (メモリとハード ディスクが少ない) の Linux サーバーの /data パーティションにファイルを作成すると、ディスク領域が不足しているというメッセージが表示されます。df -h コマンドを使用してディスクの使用状況を確認し、 /data パーティションは 66% のみが使用されており、残りのスペースはまだ 12G あるため、この問題が発生しないのは当然です。その後、df -i を使用して /data パーティションのインデックス ノード (inode) を確認したところ、それがいっぱい (Iused=100%) であることがわかり、システムが新しいディレクトリとファイルを作成できなくなりました。

理由を見つけてください:

/data/cache ディレクトリには非常に多数の小さなバイトのキャッシュ ファイルがあり、多くのブロックではなく、多数の i ノードを占有します。

###解決:### 1. /data/cache ディレクトリ内のいくつかのファイルを削除し、/data パーティション内のいくつかの i ノードを解放します。

2. ソフト接続を使用して、空きパーティション /opt の newcache ディレクトリを /data/cache に接続し、/opt パーティションの i ノードを使用して、/data パーティションの i ノード不足の問題を軽減します。
ln -s /opt/newcache /data/cache

この記事を通じて、ファイルの管理と操作に使用できる i ノードの原理と特性を理解しました。実際のニーズに基づいて適切なファイル システムを選択し、i ノードの枯渇の回避、i ノードの状態の定期的なチェック、ハード リンクまたはソフト リンクの使用などのいくつかの基本原則に従う必要があります。 inode は Linux システムの最も基本的な概念の 1 つで、ファイルを抽象化してカプセル化することができ、ファイル システムのパフォーマンスと信頼性も向上させることができます。この記事があなたにとって有益であり、インスピレーションとなることを願っています。

以上がLinux システムのファイル メタデータ: inode の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:lxlinux.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート