Unixファイルシステムでは、ディレクトリはどのように実装されますか?

Unixファイルシステムでは、ディレクトリはどのように実装されますか?

私の質問は、ディレクトリがどのように実装されていますか?テーブル、配列、または類似のデータ構造などの変数などのデータ構造を信頼できます。 UNIXはオープンソースなので、プログラムが新しいディレクトリを作成したときに実行する操作をソースコードで表示できます。このトピックについてどこで見たり詳細に説明したりできるかを教えてください。ディレクトリは私が理解できる「ファイル」であり、ディレクトリは実際にはファイルですか?ファイルが実際に「ファイルに」保存されているかどうかはわかりませんが、「ファイル」という言葉を使用してほとんどすべてを意味することができます。変数「a」ファイル。たとえば、リンクはもちろんファイルではなく、リンクはディレクトリに似ていますが、これはディレクトリファイルですか?違反です。

ベストアンサー1

ディレクトリの内部構造は、使用されるファイルシステムによって異なります。何が起こっているのかを正確に知りたい場合は、ファイルシステムの実装を見てください。

デフォルトでは、ほとんどのファイルシステムでは、ディレクトリは連想配列ファイル名(キー)とinode番号(値)の間。このような:

1167010 .
1158721 ..
1167626 subdir
 132651 barfile
 132650 bazfile

リストは(通常)4KBブロックチェーン内で(やや)効率的な方法でエンコードされます。一般ファイルの内容も同様に保存されます。ディレクトリの場合、これらのブロックで使用されている実際のサイズを知ることは意味がありません。これが報告されたディレクトリサイズがdu4KBの倍数である理由です。

Inode はブロックを結合し、一般的な意味で「ファイル」であるエンティティを形成します。これは一種のアドレスである数字で識別され、各数字は通常単一の特殊ブロックとして格納されます。

これらの管理はすべてカーネルモードで行われます。ソフトウェアでは、システムコールint mkdir(const char *pathname, mode_t mode);を生成する名前の関数を使用してディレクトリを作成するだけで、他のすべての操作はバックグラウンドで行われます。

リンク構造情報:

ハードリンクはファイルではなく、新しいディレクトリエントリにすぎません(例:名前 – アイノード番号Association)は既存のinodeエンティティを表します。これは、同じインデックスノードが異なるパス名からアクセスできることを意味します。特に、メタデータ(権限、所有権、タイムスタンプ...)はinodeに保存されるため、これらのメタデータは一意であり、ファイルにアクセスするために選択したパス名とは無関係です。

シンボリックリンクはい宛先とは異なるファイルです。これは、独自のインデックスノードがあることを意味します。以前は通常のファイルのように扱われていました。宛先パスはデータブロックに保存されました。しかし、今は効率性の理由で最近ズームファイルシステムでは、60バイトより短いパスはinode自体に格納されます(通常はデータブロックへのポインタを格納するために使用されるフィールドを使用)。

-
1.これはを使用して得られますls -ai1 testdir
2. そのタイプは現在の「ディレクトリ」と異なる必要があります。

おすすめ記事