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


19

私の質問は、ディレクトリの実装方法です。テーブル、配列などの変数のようなデータ構造を信じることができます。UNIXはオープンソースなので、新しいディレクトリを作成したときにプログラムが実行する処理をソースで確認できます。トピックの参照先または詳細を教えてください。ディレクトリは、私が理解できるファイルであり、実際にファイルであるということですか?ファイルが「何か」ファイルに保存されているかどうかはわかりませんが、ほぼすべてについて単語ファイルを言うことができますが、変数aファイル。たとえば、リンクは確かにファイルではなく、リンクはディレクトリのようなものですが、ディレクトリがファイルであることには違反しますか?


1
特定のファイルシステムに興味がありますか?
イグナシオバスケス-エイブラムス

3
UNIXでは、すべてがファイルです(歴史的な知恵)。しかし、すべてのUNIXがオープンソースというわけではありません。GnuのUnixではない、ご存知ですか?Open SolarisはオープンソースのUnixですが、Linuxはunixoid OSのみです。:)そして、はい-ファイルシステム-Reiserfs?Ext2-3-4?XFS?NFS?
ユーザー不明

2
リンク実際にはファイルです。
mattdm

5
シンボリックリンクはファイルです。ハードリンクは、ファイルシステムグラフのエッジです。
dmckee

3
広告:オペレーティングシステム開発サイトの提案に興味があるかもしれません。
ジル「SO-悪であるのをやめる」

回答:


22

ディレクトリの内部構造は、使用中のファイルシステムに依存します。何が起こるかを正確に知りたい場合は、ファイルシステムの実装をご覧ください。

基本的に、ほとんどのファイルシステムでは、ディレクトリはファイル名(キー)とiノード番号(値)の間の連想配列です。このような¹¹:

1167010 .
1158721 ..
1167626 subdir
 132651 barfile
 132650 bazfile

このリストは、(通常は)4KBブロックのチェーン内で、多少なりとも効率的にコーディングされます。通常のファイルのコンテンツも同様に保存されることに注意してください。ディレクトリの場合、これらのブロック内で実際に使用されているサイズを知ることは意味がありません。そのため、レポートさduれるディレクトリのサイズは4KBの倍数になります。

iノードは、ブロックを結び付けて、単一のエンティティ、つまり一般的な意味での「ファイル」を形成するために存在します。それらは、ある種のアドレスである番号によって識別され、各番号は通常、単一の特別なブロックとして保存されます。

これらすべての管理は、カーネルモードで行われます。ソフトウェアはint mkdir(const char *pathname, mode_t mode);、システムコールにつながる名前の関数を持つディレクトリの作成を要求するだけで、残りはすべて舞台裏で実行されます。

リンク構造につ​​いて:

ハードリンクはファイルではなく、既存のiノードエンティティ²を参照する新しいディレクトリエントリ(つまり、名前 -i ノード番号の関連付け)です。これは、異なるパス名から同じiノードにアクセスできることを意味します。特に、メタデータ(許可、所有権、タイムスタンプなど)はiノード内に保存されるため、これらは一意であり、ファイルにアクセスするために選択されたパス名とは無関係です。

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


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


プログラムレベルでディレクトリとファイルの違いを理解できるように、詳しく説明してくれてありがとう。
ニクラス

12

StéphaneGimenezからの投稿を展開するには、新しいディレクトリを作成すると、S_IFDIRのst_mode値(アクセス許可モード)で新しいiノードを作成し、リンクで新しいiノードの最初のデータブロックに2つのエントリを作成します( 2)システムコール:「。」この新しいiノードを指し、「..」は親ディレクトリを指し、次にiノードと新しいディレクトリの名前で親ディレクトリにエントリを作成します-最初と最後の部分は、システムコールmknod( 2)。また、最近話題になっているようなタスクには、rootだけがmknod(2)を使用できます。

たとえば、mkdir("/home/larry.user/xyzzy", 0666)本質的には次のとおりです(これはSysV days [1]のCコードでした)。

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 System Programming」、1987、pp69-71。

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

amyファイルシステムオブジェクトは、通常のファイル、ディレクトリ、デバイスファイル、シンボリックリンクなどのmknod(2)で作成できることに注意してください。 i / oインターフェースで動作するファイルシステムに存在する、inodeで表されるオブジェクトです。」


非常に興味深い答えをありがとう。touch空のファイルを作成するプログラムのソースを調べて、それが何をするのかを理解できると思います。
ニクラス

2

Unix / Linuxファイルシステムに関する詳細情報が必要な場合は、2冊の書籍Linuxカーネルの理解Linuxカーネル開発をお勧めします。これらは、Linuxカーネルを理解するための最高の本です。

「共通ファイルモデル」Unixシステムでは、各ディレクトリはファイルと見なされ、ファイルとディレクトリのリストが含まれます。

VFS(仮想ファイルシステム)では、ディレクトリはと呼ばれる構造で表されdentryます。dentry 文字列名(とC構造でd_name)、iノード(へのポインタd_inode)と親のdentry(へのポインタd_parent)。iノードは、ファイルシステム内のファイルに関する情報を処理するための構造です。たとえば、ディレクトリがある/tmp/test/foo場合、VFSはパス名のすべてのコンポーネントに対してdentryオブジェクトを作成します。SOの/dentryオブジェクトtest、ルートディレクトリのエントリ用の2番目のdentryオブジェクトfoo、テストディレクトリのエントリ用の3番目のdentryオブジェクトを作成します。


ありがとう、Dimitri。あるプロジェクトがBツリー、バイナリツリー、トライまたは連想配列などの特定のデータ構造を選択した理由を理解したいと思います。適切なデータ構造/データモデルを選択することが重要だと思います。さまざまな実装について学習すると、私が探している詳細がわかります。
ニクラス

1

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


リンクをありがとう。どちらのファイルもディレクトリは基本的にファイルまたはディレクトリとして解釈される配列であると理解しています。私が間違っている場合は私を修正してください
。-ニクラス

1
ディレクトリは伝統的に特別にフォーマットされたファイルですが、それはもはや真実ではありません:Re 。ディレクトリは配列として機能する場合がありますが、それはプログラミングの抽象化にすぎません。
ブルースエディガー

詳細をご指摘いただきありがとうございます。今、私はファイルシステムがどのように機能するのか、プログラムlocateがどのように機能するのか、そしてこれがどのように実行することでロケートプログラムの更新に関連するのか疑問に思っていることを理解していると思いupdatedbますおよびインターフェース)
ニクラス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.