さて、計算機システム概論もいよいよフィナーレが近づいてきました。
今回からは、ファイルシステムの章に突入します。
計算機システム概論 第28回「デバイスとファイルの管理:ファイルシステム」 - YouTube
本記事は↑の動画の学習メモです。
ファイルシステムとは
まずは、ファイルシステムの定義の前にコンピュータシステムにおいてデータに対してどのようなことを実現しなければならないか?について、整理しましょう。
データに対する要求は以下の3点です。
- 大量のデータを保持できること
- データはそれを利用したプロセスが失われても残ること
- 他の複数のプロセスからも利用できること
このような要求がある「データ」を管理する仕組みがファイルシステムです。
前々回で登場したブロック型デバイスを対象としています。
もしも、ファイルシステムがなかったら
ファイルシステム、普段から普通に使っているので、その恩恵を感じることありませんよね。
ここで「ファイルシステムがもしもなかったら」という世界を書いて、ファイルシステムの素晴らしさを感じて見たいと思います。
ファイルシステムがもしもなかったら、、
- データのWrite処理の際には、ストレージデバイス上のどのメモリ位置に保存するかを自分で決める必要がある。
- データのRead処理の際には、データの保存したメモリ番地やサイズを覚えておく必要がある
という感じになります。
日常生活では、本とか鍵とか服とかの場所を自分で覚えておいて取り出すってことをやってますが、その面倒なことをやってくれてるんですね。
ファイルシステムの種類
ちなみに、ファイルシステムには種類があります。
Linuxでは、ext4,XFS, Berfsというファイルシステムがあるそうで、それぞれ特徴があります。どのファイルシステムが一番優れているか?といった序列はなく、一長一短らしい。
MacOSではAPFS。
デバイスの領域
では、続いて内部的な話に入っていきましょう。 ディスク領域は以下のような構造になっています。
講義スライドから引用
ディスク全体
まずは、ディスク全体の構造から理解していきます。
MBP
ディスク全体の先頭のブロックは、MBPです。
MBPは、master boot recordです。
MBPには、PCが起動するためのプログラムが格納されており、電源が入ると最初に読み込まれます。
master boot record、その名の通りですね。
パーティションテーブル
MBRの次に位置しているのは、 パーティションテーブルです。
パーティションテーブルには、 それぞれのパーティションの位置情報が格納されています。
BIOS
master boot recordの話が出たので、周辺知識も整理しておきます。
BIOSとは、PCが電源をいれて最初に実行されるプログラムでファームウェアを呼ばれます。
BIOSとは、Basic Input Output Systemの頭文字ですね。
では、BIOSの実行をステップを踏みながら見ていきましょう。
- PCの電源ON
- CPUがBIOSに格納されたマシン語を実行する
- BIOSがストレージの中のMBRを探索
- MBR、約512Mをメモリにロード。メモリのアドレス0にロード
- CPUは、BIOSの実行を中断
- MBRから順次必要はプログラムをメモリにロード
という流れで起動されます。システムの起動の流れを追うと、MBRの役割がより明確になりましたね。
パーティション
続いては、パーティション内部にも入っていきましょう。
ブートブロック
パーティションの最初のセクタは、ブートブロックといってOSを呼び出すためのプロセスが含まれたプログラムが置かれる。
その名の通り、起動用のブロック。
スーパーブロック
スーパーブロックは、ファイルシステムの属性情報、ファイルシステムの種類などの重要なパラメータがすべて含まれている。
inode
inode領域は、ファイルの情報のメタデータが格納されている。
unix-v6/ino.h at master · hephaex/unix-v6 · GitHub
/* * Inode structure as it appears on * the disk. Not used by the system, * but by things like check, df, dump. */ struct inode { int i_mode; char i_nlink; char i_uid; char i_gid; char i_size0; char *i_size1; int i_addr[8]; int i_atime[2]; int i_mtime[2]; };
inode構造体には、
- i_size0(ファイルサイズ)
- i_addr[8](ストレージのブロック番号)
などが定義されている。
さらに、i_modeには、
/* modes */ #define IFDIR 040000 ディレクトリかどうか #define IFCHR 020000 キャラクタスペシャルファイルかどうか #define IFBLK 060000 ブロックスペシャルファイルかどうか #define ILARG 010000 #define ISUID 04000 #define ISGID 02000 #define ISVTX 01000 #define IREAD 0400 読み込みパーミッション #define IWRITE 0200 書き込みパーミッション #define IEXEC 0100 実行パーミッション
などの情報を持っている。
ストレージ領域
最後にストレージ領域です。この領域にファイルやディレクトリの実際のデータが格納されています。
ファイルシステムの機能と機構
次回、ファイルやらディレクトリを扱うとしてファイルシステムの周辺知識について攫っていきます。
ジャーナリングファイルシステム
ファイルシステムに起こりうるデータの不整合を起こさないための機能の1つ。
どんな場合に不整合が起きてしまうか?ですが、inodeを利用している場合にファイル削除には以下の操作が必要になります
- ディレクトリのエントリの確保
- inodeの情報を削除
- ブロックを解放して空きブロックにする
この間にシステムが強制的にシャットダウンされた場合に、データの不整合がおこります。
では、ジャーナリングという機能ではこの問題にどう対処するかというと
- ファイルの更新削除の一連の処理を、ジャーナルログに書き出す
- ジャーナルログに従って処理を実行
- もし、なんらかの事情で処理が完了しなかったら再起動の際に未完了のログとして内容を実行
すごいアイディアですね。DBのトランザクション処理的なのが、ファイルシステムでも行われているんですね。
クォータ
容量制限のこと。
1つの用途がメモリをめっちゃくちゃ使ってしまって、他のプログラムが使用できなくなるのを防ぐために、設定されている。
まとめ
ファイルシステム、なかなかに面白かったです。
ディスク領域、パーティションの中身を覗いてみたことで、どのようにファイルが管理されているかを理解することができましたし、ジャーナリングも並行処理やトランザクション的な処理に近く、よく作られているな、、と感心しました。
低レイヤのことを調べていて楽しいのは、こういうアイディアや実装に触れて感心してしまうところですね。
ということで、まだまだ理解が浅いので引き続き勉強を進めます。
僕から以上。あったかくして寝ろよー