仮想
ファイルシステム(Virtual File System、VFS)は、実際の
ファイルシステムの上に位置する抽象化レイヤーです。その主な目的は、クライアントアプリケーションが異なる種類の
ファイルシステムに対して、統一された方法でアクセスできるようにすることです。
例えば、VFSを使用することで、アプリケーションはローカルストレージとネットワークストレージの違いを意識せずにアクセスできます。また、Windows、macOS、
UNIXなどの異なる
オペレーティングシステム(OS)間での
ファイルシステムの違いも吸収し、透過的にファイル操作を行うことが可能になります。
VFSは、
カーネルと実際の
ファイルシステム間のインターフェース(規約)を定義します。これにより、新しい
ファイルシステムを
カーネルに追加することが容易になります。ただし、規約はOSのリリースごとに変更される可能性があり、
ファイルシステム側は新しいリリースに対応するために修正や再コンパイルが必要になる場合があります。一方、OS側が下位互換性を維持するよう設計されていれば、既存の
ファイルシステムはそのまま新しいOSでも動作します。
VFSの実装
Unix系システムにおける最初のVFS機構は、1985年にSun Microsystems(Sun)がSunOS 2.0に導入しました。これにより、ローカルのUFS
ファイルシステムとリモートのNFS
ファイルシステムを透過的に利用できるようになりました。このSunのVFS設計は、NFSコードのライセンスを受けた他の
UNIXベンダーにも広く採用されました。
サンはVFS機構を利用して
MS-DOSのFAT
ファイルシステムの実装も行いました。また、John Heidemannは、SunOS 4.0で実験的なFicus
ファイルシステムのために「スタッキング」VFSを開発しました。この設計により、暗号化
ファイルシステムなどが、ファイル名管理やストレージ管理のコードを再利用することが可能になりました。
他の
Unix系システムでは、System V Release 3のFile System Switch、UltrixのGeneric File System、
LinuxのVFSなどがVFS機構として存在します。
その他のOS
OS/2とWindowsでは、VFSに相当する機構をInstallable File Systemと呼びます。また、
Filesystem in Userspace (FUSE) は、
Linux、
NetBSD、FreeBSD、
Open[[Solaris]]、macOSで、ユーザーランドのコードを仮想
ファイルシステム機構にプラグインすることを可能にする機構です。
Windowsでは、
シェル名前空間拡張を使ってユーザーランドのコードで仮想
ファイルシステムのように実装できますが、低レベルな
ファイルシステムアクセスAPIをサポートしないため、すべてのアプリケーションからアクセスできるわけではありません。
KDEのKIOやGNOMEのGVfs/GIOも同様の機構ですが、FUSEを活用することでシステムに円滑に統合できます。Windowsにはサードパーティ製のDokanというFUSEに相当する機構も存在します。
「仮想
ファイルシステム」という用語は、単一のファイルやファイル群をコンテナとして扱い、特定の
ソフトウェアを通してアクセスすることで、その中身が
ファイルシステムのように操作できる機構を指すこともあります。
例として、PCTaskやWinUAEなどの
エミュレータや、Oracle
VirtualBox、Microsoft Virtual PC、
VMwareなどの
仮想化ソフトウェアにおけるハードディスクエミュレーションがあります。これらの機構の利点は、集中管理が可能で削除が容易である点です。
単一ファイルによる仮想
ファイルシステムは、通常の
ファイルシステムと同等の機能を備えていますが、内部構造にアクセスするには専用のプログラムが必要です(ドライバ経由で実装することで汎用的にアクセスすることも可能です)。欠点としては、通常のファイルアクセスに比べて性能が若干低下する点が挙げられます。特に、書き込みや削除の際には、仮想
ファイルシステムを構成する単一ファイルの内容を広範囲に書き換える必要が生じるため、性能が低下しやすくなります。
実装例
エミュレータや
仮想化ソフトウェアは、単に
ファイルシステムをエミュレートするだけでなく、ハードディスクのレイアウトもエミュレートします。
PCTask: Amiga上で動作するエミュレータで、PCのハードディスクをファイルとして扱います。FAT16でフォーマットすることで、MS-DOSやWindowsを動作させることができます。
WinUAE: Windows版のUAEで、Windowsマシン上で作成したファイルを
Amigaの
ファイルシステムとして扱います。WinUAEでは、このファイルを「hardfile」と呼びます。また、ホストOSの
ファイルシステム上のディレクトリを
Amigaの
ファイルシステムとしてアクセスすることも可能です。
その他の例
セキュリティや利便性の観点から、特定のアプリケーションでのみ単一ファイルを
ファイルシステムとしてアクセスしたいというニーズがあり、以下のような例があります。
whefs: POSIX準拠のOSで使用可能なオープンソースのC言語ライブラリで、1つのファイルをファイルシステムとして扱うアプリケーションをC/C++で作成できます。
Embedded File System (EFS): オープンソースでクロスプラットフォームの
C++による実装です。
Solid File System (SolFS): クロスプラットフォームで暗号化と圧縮機能を備えた単一ファイルによる仮想ファイルシステムです。
Javaでアーカイブファイルを展開せずにディレクトリやファイル群としてアクセスできるソフトウェアや、FTP/HTTPでサーバ上のディレクトリをローカルファイルシステムのようにアクセスできるソフトウェアも、単一ファイルによる仮想ファイルシステムの一種と見なすことができます。
TrueZIP: Apache CommonsのVFS機能です。
*
MillScript VFS
まとめ
VFSは、多様な
ファイルシステムを抽象化し、アプリケーション開発の複雑さを軽減する重要な技術です。
Unix系システムを中心に発展し、その応用範囲は広く、
エミュレータや
仮想化ソフトウェア、さらには特定のアプリケーションで単一ファイルを
ファイルシステムとして扱うなど、多岐にわたります。性能面での課題は残るものの、その柔軟性と利便性から今後も重要な役割を担うでしょう。