私はなぜ私たちにinodeが必要なのか本当に理解していません。マニュアルを検索した後、マニュアルがファイルまたはディレクトリに関するいくつかのメタデータを保存することがわかりました。しかし、それはすでにディレクトリの役割ではありませんか? (サイズ、名前などを保持するファイル項目を保存します。)
答え1
まさに実装方法です。
一部のディレクトリに対してモードを設定してみてください。
読み取ることができますがインターリーブされないように設定しますug=r
。ファイル名は表示されますが、モード、ファイルサイズなどは表示されません。
インターリーブ処理が読み取れないようにしてくださいug=x
。名前は表示されませんが、名前がわかるとモード、ファイルサイズなどがわかります。
なぜ
メタデータをディレクトリ構造の外に保持すると(つまり、名前のみ)、速度が速くなる可能性があります。不要な大量のデータを処理する必要はありません。その後、必要に応じて読むことができます。
各inodeは0個以上の名前を持つことができます(おそらく別のディレクトリにあります)。その名前を削除すると、ファイル名はゼロになりますが、そのファイルはプロセスによって開かれ続けます。名前が複数ある場合もあります。
名前を変更する方が簡単になります。 inodeの新しいディレクトリエントリ(名前)を作成し(おそらく別のディレクトリに)、古いディレクトリエントリ(名前)を削除します。
以前のファイルシステムでは、ディレクトリに..
親ディレクトリのinodeを指すエントリがありました。これを行うには、単一のファイルに複数の名前を許可することが重要です(ディレクトリはファイル形式です)。インデックスノードを複製しないことは良いことです(矛盾がなく、無駄が少なくなります)。最新のファイルシステム(例:ext3、ext4)では、これは(私が知っている限り)エミュレートされます。
答え2
"インデックスノード", Wikipedia:
各 inode は属性を保存します。およびディスクブロックの位置オブジェクトデータ
(サイズではなく位置が重要)
ディレクトリは、inodeに割り当てられた名前のリストです。。ディレクトリには、それ自体、親ディレクトリ、および各サブディレクトリのエントリが含まれています。
オブジェクトが通常のファイルの場合は葉であり、データのみが含まれます。ディレクトリのデータはその他リストなどを含む追加ディレクトリを含むファイルのリスト。
これらすべてには実用的な側面(空間、速度、堅牢性)があります。 ReiserFSには明示的なinodeがないようです。
一部のUnixスタイルのファイルシステム(ReiserFSなど)はinodeテーブルを省略します。 同等のデータを保存する必要があります。同等の機能を提供します。データ統計と言える、プログラムにデータを提供するstatシステムコールを参照してください。
説明するために段落を作成しました。 /sysで実行しました。 Sysfsのトップレベルのinodeは「1」です(procと同様に -インストール済み; 「/」には「2」があり、ls -a DOT
では「2..」と表示されます。
for dir in . block bus; do echo -n "---[$dir]"; command ls -ali $dir | sed -E 's/( *\w ).*( \w*)/\1\2/' |head -5; done |sed "s/total .*/---/"
これには、ディレクトリと2つのサブディレクトリにある最初の4つのエントリが一覧表示され、inodeと名前のみが表示されます(最初のフィールドls -ali
と最後のフィールドのみが表示されます)。
---[.]---
1 .
2 ..
3321 block
8 bus
---[block]---
3321 .
1 ..
62233 ../devices/virtual/block/loop0
62347 ../devices/virtual/block/loop1
---[bus]---
8 .
1 ..
25390 ac97
3573 acpi
name
たとえば、id
汎用データベーステーブルの場合、parent_id
これは次のとおりです。
"/" 2 2
sys 1 2
bus 8 1
block 3321 1
ac97 25390 8
ファイル(またはエントリ)「ac97」にはparentid = 8があります。したがって、「バス」に属します。 (私は指でした)
技術的には、同じディレクトリにある2番目の「ac97」も一意のIDを取得する限り大丈夫です。これはハードリンクの逆です。パス名が足りないので/sys/bus/ac97 with inode xy
誰も欲しくないので、「ファイルが存在します」というメッセージが表示されるか、man 2 mkdir
よく説明されています。
EEXIST pathname already exists (not necessarily as a directory).
This includes the case where pathname is a symbolic link, dangling or not
...なぜなら、デッドリンクにもディレクトリがあるからです。
ファイルと同様に、ディレクトリも複数のブロックで拡張できる必要があります。階層はユーザーのためにデータを分割します。そしてシステム。ファイル名はユーザーが使用するためのものです。システムの inode (inode 番号)。ハードリンクは、ユーザーがファイル名だけでなく、実際のファイルを処理する方法です。
Inodeは、ユーザーディレクトリ構造とブロック内のファイルシステムデータとの間のリンクとして機能します。
古典的な意味(「インデックス」オフセット/アウトソーシングメタデータ)では必要ありません。
「ファイルシステムツリー」の下の「btrfs」記事には、次のものがあります。
各ディレクトリのディレクトリエントリは、[この右キー値]が[対応するCRC32Cハッシュ値]のディレクトリエントリとして表示されます。 ファイル名。彼らのデータは場所キー、または索引ノード項目ポイントします。したがって、ディレクトリエントリは一緒にinodeパスを検索するためのインデックスとして機能できます。
記事ツリー、最初の明確さ:
ツリーデータ構造を定義できます。再帰的としてノードの収集(ルートノードから始まる)、各ノードは値で構成されるデータ構造です。ノードへの参照リスト (「子」)、重複した参照がなく、ルートを指すこともないという制約が適用されます。
誰ですかいいえNODEの前の「i」が何を意味するのか尋ねてください。誰ですか?
記事「接続リスト」、「検索速度の向上」
もう一つの一般的なアプローチは「インデックス」より効率的な接続リストの使用外部データ構造。例えば、 レッドブラックツリーまたは、要素が関連付けられたリストへの参照であるハッシュテーブル節。これらの複数のインデックスは単一のリストに構築できます。欠点は、ノードが追加または削除されるたびに(または少なくともインデックスが再利用される前に)これらのインデックスを更新する必要があることです。
「i」が「inode」から多くを示さず、「index」だけを表すのは当然です。