仮想ファイルシステム

仮想ファイルシステムは、実際のファイルシステムの上位に位置する抽象化層である。VFSの目的はクライアントアプリケーションが様々なファイルシステムに同じ方法でアクセスできるようにすることである。例えば VFS を使うと、クライアントアプリケーションはローカルな記憶装置にもネットワーク上の記憶装置にも透過的にアクセスできるため、その違いを意識する必要がない。あるいは、Windows、Mac OS、UNIXといったオペレーティングシステム  の違いを超えてファイルシステムの違いを意識することなくアクセスすることが可能となる。

VFSは、カーネルと実際のファイルシステムとのインタフェースあるいは規約を定義している。従って、その規約に従うことで簡単に新たなファイルシステムをカーネルに追加することができる。規約の条件はリリースの度に非互換な変更を加えられる可能性があり、ファイルシステムは新たなリリースに対応するために修正を施したり、再コンパイルする必要がある。あるいは、OS側で規約変更を下位互換を保つように行っていれば、各ファイルシステムは新たなバージョンのOSでもそのまま使用可能となる。

1. 実装
-----

Unix系システムでの最初のVFS機構は、1985年サン・マイクロシステムズが SunOS 2.0 に導入した。その時点で、ローカルなUFSファイルシステムとリモートのNFSファイルシステムを透過的に使用することができた。このため、サンからNFSのコードをライセンス供与されたUNIXベンダー各社は、サンのVFSの設計をコピーすることが多かった。他のファイルシステムを追加することが容易になり、サンはVFS機構を利用してMS-DOSのFATファイルシステムを実装した。SunOSの実装はSystem V Release 4のVFS機構の基盤となった。

John Heidemannは、実験的なFicusファイルシステムのために SunOS 4.0で 「スタッキング 」VFSを開発した。この設計は、実装は異なるが意味的には同等のファイルシステム間でコードの再利用を可能にした。Heidemann はこの成果を4.4BSDでも使用した。macOSを含むBSD系のOSでは、彼の Stacking VFS のコードが使われている。

その他のUnix系システムでのVFS機構として、System V Release 3の File System Switch、Ultrixの Generic File System、LinuxのVFSなどがある。OS/2と Windows では、VFSと同等の機構を Installable File System と呼ぶ。

Filesystem in Userspace  は、Linux、NetBSD、FreeBSD、OpenSolaris、macOSにおいて、ユーザーランドのコードを仮想ファイルシステム機構にプラグインすることを可能にする機構である。

Windowsではシェル名前空間拡張を使ってユーザーランドのコードで仮想ファイルシステムのように実装することができるが、その場合はWindowsの低レベルなファイルシステムアクセスAPIをサポートしないので、あらゆるアプリケーションでそのファイルシステムにアクセスできるわけではない。KDEのKIOやGNOMEのGVfs/GIO もそれと似たような機構を提供しているが、同様の限界がある。しかし、FUSEを活用することもできるので、円滑にシステムに統合することも可能である。WindowsでのFUSE相当の機構としてサードパーティーではあるが、Dokanがある。

2. 単一ファイルによる仮想ファイルシステム
----------------------

仮想ファイルシステムという用語は、単一のファイルやファイル群をコンテナとして扱い、何らかのソフトウェアを通してアクセスすることで、その中身があたかもファイルシステムであるかのように操作できる機能を提供する機構を指すこともある。例えば、PCTaskやUAE といったエミュレータ、オラクルのVirtualBox、マイクロソフトの Virtual PC、VMwareといった仮想化ソフトウェアのハードディスク・エミュレーションが例として挙げられる。

このような機構の利点は、集中管理でき削除が容易という点である。単一ファイルによる仮想ファイルシステムは、通常のファイルシステムが備えると期待される全基本機能を実装しているが、そのファイルシステムの内部構造にアクセスするには専用に書かれたプログラムを使う必要があることが多い。欠点は、通常のファイルアクセスよりも性能が若干低下する点である。特に、その仮想ファイルシステム内のファイルに書き込みを行ったときやファイルを削除したときに、仮想ファイルシステムを構成している大きな単一ファイルの中身の書き換えが広範囲に発生し、性能が低下する。

2.1. 実装
-------

エミュレータや仮想化ソフトウェアは、単にファイルシステムをエミュレートするだけでなく、ハードディスクのレイアウトもエミュレートしている。

PCTask PCTask はAmiga上のエミュレータであり、Intel 8088 4.77MHz を搭載したPCをエミュレートする。Amigaのファイルシステム上に大きなファイルを作成すると、エミュレータがそれをPCのハードディスクとして仮想的にアクセスする。FAT16としてフォーマットし、MS-DOSまたはWindowsを動作させることができた。 WinUAE Windows版UAE であり、Windowsマシンで大きなファイルを作成し、それを Amiga のファイルシステムとして扱う。WinUAEではこのファイルを //hardfile// と呼ぶ。またUAEでは、ホストシステムのファイルシステム上の指定ディレクトリ配下を Amiga のファイルシステムとしてアクセスすることもできる。他にも、セキュリティの観点や利便性の観点から、単一ファイルを特定アプリケーションでのみファイルシステムとしてアクセスできるようにしたいというニーズがあり、以下のような例がある。

whefs - POSIX準拠OSで使用可能なオープンソースのC言語ライブラリで、1つのファイルをファイルシステムとして扱えるアプリケーションをC言語およびC++で作成できる。
Embedded File System  -オープンソースでクロスプラットフォームのC++での実装。
Solid File System  - クロスプラットフォームで暗号化と圧縮機能を備えた単一ファイルによる仮想ファイルシステムまたJavaで、アーカイブファイルを展開せずにディレクトリとファイル群としてアクセスできるソフトウェアも単一ファイルによる仮想ファイルシステムの一種と見ることができる。中にはFTPやHTTPでサーバにアクセスし、サーバ側のディレクトリツリーをローカルなファイルシステムのようにアクセスできるものもある。

[1]
Apache Commons の [2]
[3]

3. 脚注
-----

4. 参考文献
-------

[4]
[5]
[6]
//The Linux VFS//, Chapter 4 of //Linux File Systems// by Moshe Bar . ISBN 0-07-212955-7
Chapter 12 of //Understanding the Linux Kernel// by Daniel P. Bovet, Marco Cesati . ISBN 0-596-00565-2
[7]

5. 関連項目
-------

9P - Plan 9 from Bell Labs のVFS層と直接対応している分散ファイルシステムのプロトコルで、任意のファイルシステムアクセスをネットワーク透過にできる。
Filesystem in Userspace 
KIO
Dokan

6. 外部リンク
--------

[8]