メモリはバイト単位 ディスクはブロック単位 歴史的経緯で512byte単位 ファイルシステムはこのブロックの使い方を決めましょう、というルール 大昔は、どの「ブロック」を使うかを物理的なメモ帳とかに「Address」を書いてやりくりした No.0 blockはAさん、1はBさん、というように。 telコマンド(?) ・どこを使っているか 複数のブロックの場合も、単一のブロックで済む場合もある Unixで採用された、ブロックが自動で拡張されるという機能は結局批判されながらも広まっていった ・誰が使うか inode http://www.tamacom.com/tour/kernel/unix/S/61.html 32行目 i_mode ファイルのモード shortなので16bit rwxで3bit * 3 = 9bit 63行目〜 隠れたモード (i_mode) 〜67行目 D => directory R => regular file 内容がユーザに開放されているのがregular file directoryはOSが使用するので、ユーザは普通意識しない 今日はinodeしかしないよ 伝統的な*nixのファイルシステム ディスク内の順番 先頭 superblock => 次回以降 inodeエリア 一般ブロック superblock 全体の情報 初期化するのはmkfs等のツール inodeエリア inodeが固まりでぎっしり入っている inodeの配列 一般ブロック directoryやregular fileで埋まっている mkfsしただけではファイルシステムとして認識されない ファイルシステムとして、mkfsしたディスクをOSに認識させるのはmountコマンド mountコマンドが何をするか superblockを読んで、正しいFSか、致命的な不整合がないか mount /dev/blockdev mountpoint inodeの2番を読んで、mountpointに追記 2番なのは決まっている inodeの2番は非常に重要 umount ファイルが全て閉じているか inodeが全てlockされていない inodeの2番 各FSの2番inodeはディレクトリ構造のrootとなっている mkfsコマンドのFSの初期化直後は、mkfsコマンドが2番をディレクトリに必ずセットする inode一個が一つのファイル inodeの配列から、未使用のinodeを探してきて、メモリ上に読み込み、regular <= +1してdiskに書き戻す 未使用を探すアルゴリズムは別にある 一般ブロックの空き領域を探す 探すアルゴリズムが別にある 39行目のNADDRが未使用 *nixではinode自体がファイル 「ファイル = inode」 inodeは識別子ではないので、番号がついている 「i_no」 「ls -i」でinode番号が出る "ls -id /" => 2 lnコマンドでhardlinkを作る ファイルをinodeの番号で呼ぶのは面倒なので、名前をつける ファイル名は複数つけられる 消えるタイミングはrmコマンドを打った瞬間とは限らない 「ino <=> file name」の組み合わせを配列として持っている奴が居る |ino | file name | | 41 | file A | | 41 | file B | のような管理簿的な物 実はこれがディレクトリファイル ディレクトリファイルを無理矢理見ると見える "cat ." Linuxは構造が違うので見れない 今のLinuxとV7のファイルシステムの構造は同じ ファイルシステムの基本的なデザイン構造は同じ もちろん実装上の工夫・進化はある アンティークなUnixを今回取り上げた理由はこれ tempファイル ファイルを作った瞬間にunlink => プロセスが事故死しても勝手にファイルが消える 昔はディスクが高価で大きな単一ディスクを用意するのが難しかったので、 小さなディスクを接ぎ木して、大きく見せるという苦肉の策 => inode 2