仮想ファイルシステム

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

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

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

John Heidemannは、実験的なFicusファイルシステムのために SunOS 4.0で 「スタッキング (stacking)」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と同等の機構を  と呼ぶ。

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

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

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

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

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

; PCTask
: PCTask はAmiga上のエミュレータであり、Intel 8088 4.77MHz（後にIntel486SX 25MHz） を搭載したPCをエミュレートする。Amigaのファイルシステム上に大きなファイルを作成すると、エミュレータがそれをPCのハードディスクとして仮想的にアクセスする。FAT16としてフォーマットし、DOSまたはWindowsを動作させることができた。
; WinUAE
: Windows版であり、Windowsマシンで大きなファイルを作成し、それを Amiga のファイルシステムとして扱う。WinUAEではこのファイルを *hardfile* と呼ぶ。またUAEでは、ホストシステム（Windows、Linux、Mac OS、AmigaOS）のファイルシステム上の指定ディレクトリ配下を 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

## 脚注

## 参考文献
* Put virtual filesystems to work
* Vnodes: An Architecture for Multiple File System Types in Sun UNIX
* Linux kernel's Virtual File System
* 
* 
* 
* *The Linux VFS*, Chapter 4 of *Linux File Systems* by Moshe Bar (McGraw-Hill, 2001). ISBN 0-07-212955-7
* Chapter 12 of *Understanding the Linux Kernel* by Daniel P. Bovet, Marco Cesati (O'Reilly Media, 2005). ISBN 0-596-00565-2
* The Linux VFS Model: Naming structure

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

## 外部リンク
* Anatomy of the Linux file system by M. Tim Jones