1. ホーム
  2. オペレーティングシステム
  3. ユニックス/BSD

UNIXファイルシステムの解析と比較考察

2022-01-26 18:54:31
Unixのファイルシステムについて、ソースコードの観点から説明したいと思います。(一昨日、トップページに投稿できなかったので再投稿しました。なんで3日制限なんだ?)
ファイルが開かれることなくディスクに保存されるためにまず必要なものは何でしょう?
一般的に必要とされるのは
1, ディレクトリエントリ
2, ディスクInodeエントリ
3, ディスク上のnブロック(nは0でも可)
ディレクトリエントリは構造体であり、最も重要な要素は名前とinode構造体へのポインタである。また、ディレクトリの実行権は、ファイル名をInodeに変換するために存在し、その具体的な操作関数はnameiです(具体的なソースコードを参照できます)。
Inodeのエントリも構造体であり、v7の実装は以下の通りです。
コピーコード
コードは以下の通りです。

struct dinode


unsigned short di_mode; /* mode and type of file */
short di_nlink; /* number of links to file */
short di_uid; /* owner's user id */
short di_gid; /* owner's group id */
off_t di_size; /* number of bytes in file */
char di_addr[40]; /* disk block addresses */
time_t di_atime; /* time last accessed */
time_t di_mtime; /* time last modified */
time_t di_ctime; /* time created */
};

要素で表現される内容に関連するコメントを解説していますが、具体的に紹介しますと
di_mode はファイルのパーミッションとタイプを記述します。
di_nlinkは、ファイル内のリンク数を指定します。
di_uidファイルのユーザ、di_gidファイルのグループ
di_size 論理的にファイルのサイズをバイト数で指定します。
di_addrファイルが占有するディスクブロックのアドレス
アクセス時間、変更時間、作成時間の3回分
ディスクブロックについては特に言うことはなく、具体的な実装は1個512バイトかもしれない
ファイルを参照する場合(ファイルを開く場合ではない)には、次のようなことが必要になる場合があります。
1, メモリ内Inodeエントリ
メモリ内inodeエントリのv7実装は、以下のようになります。
コピーコード
コードは以下の通りです。

struct inode
{
Char i_flag;
char i_count; /* reference count */
dev_t i_dev; /* device where inode resides */
ino_t i_number; /* i number, 1-to-1 with device address */
unsigned short i_mode;
short i_nlink; /* directory entries */
short i_uid; /* owner */
short i_gid; /* group of owner */
off_t i_size; /* size of file */
union {
struct {
daddr_t i_addr[NADDR]; /* if normal file/directory */
daddr_t i_lastr; /* last logical block read (for read-ahead) */
};
struct {
daddr_t i_rdev; /* i_addr[0] */
struct group i_group; /* multiplexor group file */
};
} i_un;
};

基本的な内容はディスクと同じで、いくつかの追加コンテンツと、最も重要なのは参照回数を記録するためのi_countが追加されていることです
ファイルを開くときに必要なコンテンツは以下の通りです。
1. ユーザーのuセクションにあるu_ofile配列のアイテム
2、ファイルテーブルの中の一項目
u_ofile は、特定のファイル構造内の項目へのポインタを格納し、いわゆるファイルディスクリプタは u_ofile 配列の添え字となります。
ファイルテーブルv7は、以下のように実装されています。
コピーコード
コードは以下の通りです。

struct file
{
char f_flag;
char f_count; /* reference count */
struct inode *f_inode; /* pointer to inode structure */
union {
off_t f_offset; /* read/write character pointer */
struct chan *f_chan; /* mpx channel pointer */
} f_un;
};

ファイルテーブルは、コメントがあるように、もともとオフセット(f_offset)を共有するように設計されているようですが、ご存知のように、dupでファイルディスクリプタをコピーするのと、ファイルを再度オープンするのは同じではなく、具体的に違うのはf_countの値です。実際、ファイルのオープン、クローズ、リンク、アンリンクなどのファイル操作をすべて考えることができます(非常に便利だと思いますが、実際にソースコードを参照する必要はなく、何が起こっているかを考えるだけで、UNIXソースコードのレベルは非常に高く、本当にすべてを読むとなると多くの時間を必要とします)。
また、Publish or Rotの原則に基づき、昨夜書いたソースコードを公開します。
ソースコードは、findコマンドに直接引数-name, -user, -groupを付けてシンプルに実装したもので、具体的な使い方は以下の通りです。
ディレクトリ(ファイル)検索リスト オプションの引数
ソースコードもレベルが低く、実装もいい加減なものですが、cを初めて使う読者には、まだまだ参考になるかと思います。
もし、専門家の方で何か変更が必要だと思われる方がいらっしゃいましたら、ご指摘ください。
[...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...]