ファイルシステムのお話 〜「保存」から錆びた鉄の円盤まで〜
- 6. とりあえず「保存」してみる
「保存」は OS カーネルにお願いする
== システムコールを呼ぶ
この先お世話になるカーネルは Linux Kernel を仮定
「保存」は fd = open(“”, O_CREAT); write(fd, mydata, size);
open システムコール: ファイルを開く; O_CREAT は「なければ作成」
write システムコール: データを書く
- 9. Linux VFS で乗り換え
VFS: Virtual File System
OS の他の部分から見たときの「ファイルシステム」
いろんなファイルシステムの実装が守るべき共通のインターフェースを
定義
システムコールハンドラは「他の部分」
open(2) や write(2) の処理を行うハンドラは,VFS を通してファイルシステ
ムに対して然るべき操作を行う
詳細は後述
ファイルやディレクトリという概念はここで導入されるもの
「ディレクトリ」は「フォルダ」のこと
VFS 的には,ファイルシステムといえば階層構造のこのようなもの
ファイルとディレクトリを表すデータ構造は同じ…!?
- 10. ファイル? ディレクトリ? … inode!
inode: ファイルシステムに格納されているオブジェクト
ファイルもディレクトリもファイルシステム上のオブジェクト = inode
inode は自身に対するメソッドの一覧を持つ
ファイルの場合: read, write…
ディレクトリの場合: iterate…
メソッドの実装はファイルシステムの実装が提供
<linux/fs.h> の struct inode
linux/fs.h ってことはまだ VFS を守るファイルシステム一般の話
- 11. inode に対する操作 (一部)
ファイルの inode に対する操作
read: データの読み出し
write: データの書き込み
open: ファイルを「開く」
ディレクトリの inode に対する操作
iterate: ディレクトリにある inode の一覧を返す
構造体にメソッドの関数ポインタを入れて,inode に持たせる
<linux/fs.h>の struct file_operations
「開かてたファイル」を表すデータを受け取るシグネチャのメソッド
「開かれたファイル」…struct file
inode をもつ
dcache (パスと struct inode を対応付けるキャッシュ) のエントリも持つ
- 12. ファイルシステム自体の表現は? … super block
VFS が持つ,使用中のファイルシステム自体に関する情報
使用中 ==「マウント」されている
ファイルシステムが乗っているブロックデバイスの情報をもつ
ブロックデバイス == HDD,SSD などランダムアクセスできるデバイス
inode の存在に関するメソッドの一覧を持つ
mkdir, create, lookup…
メソッドの実装はファイルシステムの実装が提供
<linux/fs.h> の struct super_block
linux/fs.h ってことはまだ VFS を守るファイルシステム一般の話
- 13. inode の存在に関する操作 (一部)
mkdir: ディレクトリの inode を作成する
create: ファイルの inode を作成する
lookup: 親ディレクトリからファイル名を指定して inode を探す
構造体にメソッドの関数ポインタを入れて,super block に持たせる
<linux/fs.h> の struct inode_operations
こいつらは素直に struct inode *を受け取る
しかし,親となる inode のもの
- 18. inode 作る系メソッド
空いている inode 番号を探す
struct inode を生成,初期化
実装固有の inode オブジェクトを生成,ディスクに書き出し
なかにデータが格納されているディスク領域へのポインター
ディスクを等分割した「ブロック」へのポインター
ブロックポインターが 1 つとは限らない (実装次第)
直接ユーザーデータのブロックを指すとも限らない (実装次第)
実装固有の inode を struct inode に入れる
親ディレクトリの実装固有 inode が持つ内容物一覧を更新
dcache に登録…struct inode と dcache 内のエントリを対応付け
- 19. lookup
親ディレクトリの struct inode から実装固有の inode を取り出す
親ディレクトリの内容物一覧をディスクから読み出す
ファイル名で検索すると,inode 番号が得られる
inode 番号から inode をディスクに取りに行き,struct inode も合わ
せて生成する
struct inode を dcache に登録
- 20. open
struct file に入れて dcache のエントリが渡されるので,そこから
ファイル名を抽出
渡された親ディレクトリにある inode 一覧を,ファイル名で検索
上記で得れた inode 番号から,ディスク上の inode を読み出す
これに合わせた struct inode も生成
その struct inode を返す
半分初期化された struct file を渡されるので,そこに書き加える形