2010年12月19日日曜日

第5回 V7から始めるUNIX講座 復習とまとめ

第5回 V7から始めるUNIX講座 復習とまとめ

●復習

・2針クロックアルゴリズム
VAX(DECの32ビットマシン)はリファレンスビットがなかった。
ハードウエアによっては、エラー書き込み例外からの再実行が許さないものもあったので、この実装を参考にした。

これは、Copy on Writeのことでしょうか?
コピーした振りをしておいて、どちらかに書き込み(変更)があった場合にエラー書き込み例外が発生
その例外の中で本当に領域を探して割り当てて、再実行することにより、上位には何事もなかったかの
ように見せかける。

http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%94%E3%83%BC%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%88

・BSD2.9のインストール
問題なし

stty erase '^H'の設定がうまく行かない件
UbuntuのターミナルがVT100と異なるためのよう、ちょっと後で調べます。

●第5回目:ファイルシステムとは?

まずいきなりソースコードを読んでも理解できない。
まずファイルシステムとは何か?という概観を理解して、どう実装しているのかをソースで確認しましょう。
実装詳細は次回以降として、今回はファイルシステムの説明です。
UNIXファイルシステム(UFS)については以下参照
http://ja.wikipedia.org/wiki/Unix_File_System


1、ファイルの実態
まずファイルについては、ハードディスクに格納されているわけですが、ディスクはブロックという単位でリード・ライトされます。
1ブロックは512Byteです。
ファイルの実態はブロック単位でハードディスクのどこかに格納されています。

2、ファイルシステムの役割
おおまかに言うと
1.どこを使うか(上記のブロック単位でどこからどこまで)
2.誰が使うか(ユーザ管理)

初期のころは黒板に書いて管理していたが、これらをマシンに管理されるようにしまた。

3、ファイルを管理(識別)するために
ファイルそのものを示すのはファイル名ではありません。
inodeがファイル管理のために使われます。
ファイル名は人間が分かりやすいようにinodeに対して名前を付けただけのものです。
ディレクトもファイル名の拡張です。
そのため、同じinodeに対して複数のファイル名を付与できます。

例:
$ cd /tmp
$ touch test
$ ls -l test
-rw-r--r-- 1 user user 0 2010- 12- 19 14:05 test

UNIXではハードリンクすれば同じinodeに複数のファイル名を付けられます。
$ ln test test2
$ ls -l test*
-rw-r--r-- 2 user user 0 2010- 12- 19 14:05 test
-rw-r--r-- 2 user user 0 2010- 12- 19 14:05 test2

数字が1から2になっています。これはリンクカウントを示します。
つまりinodeに対してリンクが2(2ファイル)あることになります。
本当に同じinodeなのか確認しています。lsで iオプションを使うとinodeを表示します。
$ ls -il test*
917548 -rw-r--r-- 2 user user 0 2010- 12- 19 14:05 test
917548 -rw-r--r-- 2 user user 0 2010- 12- 19 14:05 test2

ということで同じinodeを使用していることが分かりました。

では、inodeを管理するための構造体だけ確認しておきましょう。
http://www.tamacom.com/tour/kernel/unix/S/61.html
の26行目struct inodeです。

31 ino_t i_number; /* i number, 1-to-1 with device address */
これがinodeの番号です。

今日の説明で重要なのは、
32 unsigned short i_mode;
です。
MODEに格納されているのは、以下ですが、今日の説明で重要なのは、directoryとregularです。
64 #define IFDIR 0040000 /* directory */
65 #define IFCHR 0020000 /* character special */
66 #define IFBLK 0060000 /* block special */
67 #define IFREG 0100000 /* regular */

directoryはそのファイルがディレクトリであること、regularはそのファイルが一般に公開されていることを示します。

●疑問
ファイルのパーミッションはRWXで3ビットづつ(だから8進数の方が都合が良い)で格納されているということでしたがstruct inodeのどこに当たるのでしょう?

3、ファイルシステムの構造
ファイルシステムは以下のように分かれています。

スーパーブロック:ファイルシステム全体の管理情報を保持しています。
inode:inodeが0からの配列で格納しています。
一般ブロック:実際のファイルをブロック単位で格納しています。

質問1:上記の構造を作るのは誰?
⇒mkfsです。mkfsのパラメータにはフォーマットするデバイスを指定します。mkfsで上記のような構造をディスク上に作成します。

質問2:じゃ、ファイルシステムをOSから使えるようにするには?
⇒mount コマンドでOS上のマウントポイントにマウントして使えるようにします。

UNIXではファイルシステムはひとつのツリー構造にするので、mountコマンドは親のツリーに接ぎ木する感じ。
接ぎ木のルートは必ずinodeが2と決まっています。
例:
$ ls -id /
2 /
となりました。ルートのinodeは2番です。

mountコマンド:inodeの2を指定した場所に接ぎ木します。
umountコマンド:接ぎ木を外します。ただし全てのファイルがクローズしていないとエラーになります。

4、ファイルの作成
では、今までの話を踏まえて、新しくファイル(通常のファイル)を作成すると内部ではどうなるでしょうか?
(1)未使用のinodeをさがして、そこにregular fileと書き込む。
(2)一般ブロック領域をひとつ確保してつなげる。
(3)リファレンスカウントをインクリメントする

●疑問
inodeと一般ブロックの結びつけは、inode構造体の以下の部分にinodeに対応する一般ブロックを書き込むことで行うということでよろしいですか?
ファイルの編集でサイズが変更になった場合は、使用する一般ブロックも更新する?


38 struct {
39 daddr_t i_addr[NADDR]; /* if normal file/directory */
40 daddr_t i_lastr; /* last logical block read (for read-ahead) */
41 };


5、ではファイル名はどこに?
inode構造体でファイル名は管理していませんでした。
つまり、ファイル名とinode番号のペアを管理している台帳があるはずです。
⇒これがディレクトリファイルになります。

試しに、「cat .」を実行すると、ディレクトリファイルが表示されます。
化け化けになりますがファイル名と何らかの情報を保持していることが分かります。

6、ファイルの削除タイミング
リファレンスカウントが0になったらファイルは不要(削除)になる??
いつ消えるかは今後のお楽しみ。

(補足)
以前、SUNのワークステーションを使っていたときに、ディスクが余っているにも関わらずファイルが作成できなくなったことがありました。
つまり、inodeが足らなくなったんですね。
その時は先輩がごにょごにょして、使えるようにしてくれました。

0 件のコメント:

コメントを投稿