ファイルシステムAPI

ファイルシステムAPIとは、開発者がファイルシステムをオペレーティングシステム (OS) に移植する際のAPIであり、OSはそのファイルシステムについて何も知らなくてもよいように設計されている。
これはドライバAPIの機能と似ており、ユーザープログラムやOS自身はそのファイルシステムについて何も知らなくてもよい。
ファイルシステムAPIには一般的な保守機能（新しいファイルシステムの作成、メタデータの一貫性のチェック、デフラグなど）へのインタフェースを提供するものもあり、それらを実際に行うアプリケーションが新たなファイルシステムも透過的に扱えるようになっている。
歴史.
本来、OSには一種類のディスクファイルシステムしかなかった。しかし、以下のような問題がシステムの発展に伴って発生してきた。
古い手法では、全ファイルシステムとネットワークプロトコルはOSのカーネル内の固有機能であり、ファイルへのアクセスはローカルであれリモートであれ全てカーネル内で処理されていた。
この手法では、新たなファイルシステムのサポートはカーネルの大幅な改造を意味する。これは効率が悪いので、OS設計者はファイルシステムのコードをカーネル内のファイル操作やネットワーク処理のコードから分離するようにした。これがファイルシステムAPIである。
カーネル型API.
カーネルがファイルシステム開発者向けAPIを提供するだけでなく、ファイルシステム自身がカーネル空間に置かれる場合に「カーネル型API」と呼ぶ。
従来の手法ではファイルシステムのコードはカーネル内の各コードと複雑に絡み合っていたが、カーネル型のファイルシステムAPIではファイルシステムがカーネルに提供すべきインタフェースとカーネルがファイルシステムに提供するインタフェースが明確化されている。
これは、最もきれいな手法とは言えないが、従来の手法の持っていた欠点を解決している。
モジュール化されたカーネルでは、ファイルシステムも他のモジュールのように追加可能なモジュールとして扱われる（つまり、APIだけでなくABIも規定されて、オブジェクトファイルの形で追加することが可能）。モジュール化されていないカーネルではファイルシステムのコードを追加したときにはカーネルの再コンパイルが必要である（従って、ソースの公開されていないOSでは、OS開発業者がOEM供給を受けてファイルシステムを追加することになる）。
Linuxを含めたUnix系システムはこの手法を採用している。
MS-DOS（4.0以降）と互換OSでは、同様の手法でCD-ROMやネットワークファイルシステムをサポートしていた。カーネルにコードを追加するのではなく、カーネルの機能を利用したカーネル型APIである。ファイル関連のコールを全て捉えて、必要に応じて特定のファイルシステムドライバを呼び出し、ファイルシステムドライバは低レベルなBIOS機能を使って直接ディスクにアクセスしていた。
ドライバ型API.
カーネルが必要なAPIを提供するが、ファイルシステムが完全にユーザ空間にある場合、これをドライバ型APIと呼ぶ。
ファイルシステムのコードが独立しているので、これはよりきれいな手法と言える。この手法ではソースの公開されていないOSにも対応できるし、オンラインでファイルシステムの追加・削除が可能となる。
この手法の例として、Windows NTとOS/2それぞれのIFSがある。
カーネル・ドライバ混合API.
このAPIは、ファイルシステムがカーネル内にあるものの、実際にはそのファイルシステムを使わずにドライバ型APIの別のファイルシステムを使用するものである。この手法はVFATとしてWindows 3.11以降のWindows 9x系で使われたものである。
しかし、このAPIは完全な文書が存在せず、サードパーティーはこのインタフェースを使用したファイルシステム開発に非常に苦労したという。
ユーザーランド型API.
このAPIはカーネルが特にファイルシステムのために用意したわけではない機能（一般のユーティリティなどがディスクアクセスに使用するライブラリ）でファイルシステムを構築するものを指す。
これは様々なディスクイメージを処理する手法として有効である。
この手法の大きな利点は、利用するインタフェースが標準的なライブラリだけであれば、多くのOSに簡単に移植できる点である。欠点は特にこのタイプのAPIが規定されていないので、ファイルシステム作成者によって使うAPIが全く異なる点である。
この手法の例として、HFSをMac OS以外でもアクセスできるようにした hfsutils がある。
ファイルシステムAPI間の相互運用性.
全てのファイルシステムはカーネルから同等の機能を提供されるので、違った型のAPIであっても、ファイルシステムをあるAPIから別のAPIに移植するのは可能である。
例えば、OS/2に移植された ext2ドライバは、Linux の VFS から OS/2 の IFS へのラッパーであり、ファイルシステム自体はLinuxのカーネル型のものである。OS/2のHFSドライバは上述のhfsutilsをOS/2のIFSに移植したものである。