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. そのタイプは現在の「ディレクトリ」と異なる必要があります。

答え2

Stéphane Gimenezの投稿を展開すると、新しいディレクトリを作成することができます。生成するプロセスです。 call: '.' はこの新しい inode を指し、 '..' は親ディレクトリを指し、次に inode と新しいディレクトリの名前を使用して親ディレクトリにエントリを作成します。最初と最後の部分が呼び出されます。 mknod(2) システムによって。さらに、rootman mknod(2)を使用して、私たちが議論している作業の種類を実行できるようになりました。

たとえば、デフォルトでmkdir("/home/larry.user/xyzzy", 0666)は次のようになります(SysV日のCコード[1])。

int mode = 0666;
char newdir[] = "/home/larry.user/xyzzy";
char path1[NAMESZ+4, path2[NAMESZ+4], *p;
mknod(newdir, S_IFDIR|mode);
strcpy(path1, newdir);
strcat(path1, "/."); /* "." link */
link(newdir, path1);
strcat(path1, ".");  /* ".." link */
strcpy(path2, newdir);
if ((p = strrchr(path2, '/') == (char *)0) /* root directory */
    link(".", path1);
else {
    *p = '\0';
    link(path2, path1);
}
  1. HavilandとSalama、「UNIXシステムプログラミング」、1987、pp。 69-71。

これはエラーが発生しやすいため(fsckの主な理由の1つ)、これを行うためにmkdir(2)システムコールが作成されました。

amyファイルシステムオブジェクトは、mknod(2)を使用して作成できます。通常のファイル、ディレクトリ、デバイスファイル、シンボリックリンクなど。したがって、OPの質問の1つに答えると、はい、ディレクトリはファイルです。つまり、「I/O インタフェースを介して動作するファイルシステムに常駐する inode で表示されるオブジェクトです」という意味です。

答え3

Unix / Linuxファイルシステムについてもっと知りたい場合は、2冊の本をお勧めします。Linuxカーネルについて学ぶそしてLinuxカーネルの開発。 Linuxカーネルについて学ぶのに最適な本です。

「汎用ファイルモデル」Unixシステムでは、各ディレクトリはファイルとディレクトリのリストを含むファイルとして扱われます。

VFS(Virtual File System)はディレクトリを呼び出します。dentry。これはdentry 文字列名です(名前)、inodeへのポインタ(d_inode)および親ディレクトリエントリへのポインタ(d_parent)。アイノードは、ファイルシステムでファイル情報を処理するために使用される構造です。たとえば、ディレクトリがある場合、/tmp/test/fooVFSはパス名の各コンポーネントに対してdentryオブジェクトを作成します。したがって、1 つの dentry オブジェクト、ルート ディレクトリのエントリの/2 番目の dentry オブジェクト、テスト ディレクトリのエントリの 3 番目の dentry オブジェクトが作成されます。testfoo

答え4

読むことから始めてください。http://www.freebsd.org/doc/en/books/design-44bsd/book.html#OVERVIEW-FILESYSTEM。詳細については、素晴らしい古典書「4.4 BSDオペレーティングシステムの設計と実装」を参照してください。

関連情報