Docker
ファイルシステムはinodeと呼ばれるファイルのインデックス領域と実データ領域を持ち、全てのファイルはinode番号2番のルートディレクトリから繋がっている。2番のデータ領域を含むディレクトリのデータ領域には、ファイルやディレクトリ名とinode番号が存在しており、そこからディレクトリやファイルなどを辿ることが出来る。(ファイル名は実データにはなく、ディレクトリのデータ領域に存在する(ハードリンク))
inode領域にはinode番号と実ファイルの物理的な配置情報が存在する。データ領域にはファイルなら中身、ディレクトリならそのディレクトリ以下のファイルやディレクトリのinode番号と名前が保管されている。
ファイルシステムは様々で色々な実装が存在するが、LinuxではVFS(Virtusl File System)というAPIで全て統一的に扱えるようになっている。VFSの下でデバイスドライバが抽象的な操作を各ファイルシステム用の操作に翻訳しているからだ。
アプリケーションからはVFSしか見えないので、非常にシンプルに扱える。
(ディレクトリの中身の一覧を取得しようと思うと、読み込み権限だけでなく実行権限も必要
ディスクへの読み書きはとても遅い処理であり、なるべく最後までやらないようにしたいタスク。そこでLinuxは、VFSの内部に設けられているバッファを利用することで、ディスクに対する操作をなるべく回避している。
→Linuxでファイルを読み書きする場合、まずバッファにデータが格納される。アプリケーションへはバッファに格納された時点で処理が返る。ファイルからデータを読み込むときも一旦バッファに蓄えられ、そのファイルに対する書き込みが行われていないならバッファからしか読み込まない。(バッファと実際のストレージとの同期は、アプリケーションが知らないところで非同期で行われるのだ)
Dockerでは、chrootというシステムコールを使い、擬似的なミニOS環境を作り出してサービスを隔離する。あたかもそれがファイルシステム(inodeとデータ領域)全体であるかのように、特定のプロセスに対して見せかける仕掛けを使っている。