ディレクトリのinodeがext4ファイルシステムにファイル名を保存するのはなぜですか?

ディレクトリのinodeがext4ファイルシステムにファイル名を保存するのはなぜですか?

私の理解は、ディレクトリinodeが通常のファイルinodeと根本的に異なっていないことです。Ext4ディスクレイアウトそれだけです:

ディレクトリエントリ:したがって、ディレクトリは一連のデータブロックであり、各ブロックはディレクトリエントリの線形配列を含むと言う方が正確です。

ディレクトリエントリは、ファイル名とそのインデックスノードへのポインタを格納します。それでは、ドキュメントに各ブロックにディレクトリエントリが含まれていることがわかりますが、debugfsディレクトリinodeに保存されているファイル名とは異なる内容を報告するのはなぜですか?これは ext4 形式のフラッシュドライブのデバッグセッションです。

debugfs:  cat /sub
 .
  ..�
     spam�spam2�spam3��spam4

これらのファイル名を保存することは不可能だと思い、inode_i_block60バイトを超える非常に長いファイル名でファイルを作成しました。catinodeで実行するとdebugfsファイル名も表示されるため、長いファイル名がinodeに再び表示されます。

コンテンツinode.i_block:

inode.i_block60バイトのストレージスペースは、inodeで説明されているファイルタイプに応じてさまざまな方法で使用できます。通常、通常のファイルやディレクトリではファイルブロックインデックス情報として使用し、特殊ファイルでは特別な目的に使用します。

また、ファイル名が格納されているinodeへの参照はありません。 ハッシュツリーディレクトリ これは最新の実装部分です。そのファイルに何か欠けているような気がします。

主な質問は、ディレクトリ内のinodeにファイル名が含まれている場合は、そのデータブロックに何を格納するかです。

答え1

inode.i_blockディレクトリエントリはデータブロックに保存されます。リンクしたドキュメントの「インラインデータ」と「インライン目次」を参照してください。

答え2

cat結果ファイルコンテンツつまり、データブロックです。のように/bin/cat

catこのコマンドは、inode 構造のバイトを端末に書き込む場合には役に立ちません。比較inode_dumpしてstat

一部の文書では、歴史的にUNIXがこのデータを読み取ることを許可していることを伝えています/bin/cat。これは、ユーザー空間でディレクトリエントリを一覧表示する元の方法でした。目次と項目lsが開き、説明さread()れます。使用法とは異なり、readdir()カーネルはデフォルトのファイルシステム形式に関係なく、標準形式でエントリを提供します。

答え3

ディレクトリデータには以下が含まれます。dirent記入。各ディレクトリエントリにはファイル名とインデックスノードとして。効率を上げるために、ext4 inodeに小さなファイルのデータ内容を含めることができるため、他のブロック読み取りを実行する必要はありません。

これ「小さい」値ファイル属性の場合は60バイト、拡張ファイル属性を使用しない場合は最大160バイトです。

答え4

私はマンページの言語が混乱していると思いますが、debugfs catコマンドはinode自体の内容を表示しないと思います。多くの場合、マニュアルページに「inode filespec」が言及されていますが、これは読者がファイルの仕様がパス名またはinode番号になる可能性があることを思い出させる重複方法だと思います。マニュアルページから抜粋した次の内容を比較してみてください。

文書仕様- inodeの内容をダンプします。文書仕様標準出力として。

統計資料 文書仕様- inode 構造の内容を表示します。文書仕様

catがinode filespecの内容を表示するのではなく、「inode filespec」の内容を表示すると思います。ファイル名は inode ではなくデータ・ブロックに確実にリストされています。

関連情報