仮想ファイルシステム (かそうファイルシステム、英 : Virtual File System 、VFS )は、実際のファイルシステム の上位に位置する抽象化層である。VFSの目的はクライアント アプリケーション が様々なファイルシステムに同じ方法でアクセスできるようにすることである。例えば VFS を使うと、クライアントアプリケーションはローカル な記憶装置 にもネットワーク 上の記憶装置にも透過的にアクセスできるため、その違いを意識する必要がない。あるいは、Windows 、Mac OS 、UNIX といったオペレーティングシステム (OS) の違いを超えてファイルシステムの違いを意識することなくアクセスすることが可能となる。
VFSは、カーネル と実際のファイルシステムとのインタフェース あるいは規約を定義している。従って、その規約に従うことで簡単に新たなファイルシステムをカーネルに追加することができる。規約の条件はリリースの度に非互換な変更を加えられる可能性があり、ファイルシステムは新たなリリースに対応するために修正を施したり、再コンパイル する必要がある。あるいは、OS側で規約変更を下位互換を保つように行っていれば、各ファイルシステムは新たなバージョンのOSでもそのまま使用可能となる。
実装
Unix系 システムでの最初のVFS機構は、1985年サン・マイクロシステムズ (サン)が SunOS 2.0 に導入した。その時点で、ローカルなUFS ファイルシステムとリモートのNFS ファイルシステムを透過的に使用することができた。このため、サンからNFSのコードをライセンス供与されたUNIXベンダー各社は、サンのVFSの設計をコピーすることが多かった。他のファイルシステムを追加することが容易になり、サンはVFS機構を利用してMS-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と同等の機構を Installable File System (英語版 ) と呼ぶ。
Filesystem in Userspace (FUSE) は、Linux、NetBSD 、FreeBSD 、OpenSolaris 、macOS において、ユーザーランド のコードを仮想ファイルシステム機構にプラグインすることを可能にする機構である。
Windowsではシェル名前空間拡張 を使ってユーザーランドのコードで仮想ファイルシステムのように実装することができるが、その場合はWindowsの低レベルなファイルシステムアクセスAPI をサポートしないので、あらゆるアプリケーションでそのファイルシステムにアクセスできるわけではない。KDE のKIO やGNOME のGVfs /GIO (英語版 ) もそれと似たような機構を提供しているが、同様の限界がある。しかし、FUSEを活用することもできるので、円滑にシステムに統合することも可能である。WindowsでのFUSE相当の機構としてサードパーティー ではあるが、Dokan がある。
単一ファイルによる仮想ファイルシステム
仮想ファイルシステムという用語は、単一のファイルやファイル群(必ずしも具体的なファイルシステム内にある必要は無い)をコンテナとして扱い、何らかのソフトウェアを通してアクセスすることで、その中身があたかもファイルシステムであるかのように操作できる機能を提供する機構を指すこともある。例えば、PCTaskやWinUAE (英語版 ) といったエミュレータ 、オラクル のVirtualBox 、マイクロソフトの Virtual PC 、VMware といった仮想化 ソフトウェアのハードディスク・エミュレーションが例として挙げられる。
このような機構の利点は、集中管理でき削除が容易という点である。単一ファイルによる仮想ファイルシステムは、通常のファイルシステムが備えると期待される全基本機能を実装しているが、そのファイルシステムの内部構造にアクセスするには専用に書かれたプログラムを使う必要があることが多い(ドライバ経由で実装すると汎用的にアクセスできる)。欠点は、通常のファイルアクセスよりも性能が若干低下する点である。特に、その仮想ファイルシステム内のファイルに書き込みを行ったときやファイルを削除したときに、仮想ファイルシステムを構成している大きな単一ファイルの中身の書き換えが広範囲に発生し、性能が低下する。
実装
エミュレータや仮想化ソフトウェアは、単にファイルシステムをエミュレートするだけでなく、ハードディスクのレイアウトもエミュレートしている。
PCTask
PCTask はAmiga 上のエミュレータであり、Intel 8088 4.77MHz(後にIntel486 SX 25MHz) を搭載したPCをエミュレートする。Amigaのファイルシステム上に大きなファイルを作成すると、エミュレータがそれをPCのハードディスクとして仮想的にアクセスする。FAT16としてフォーマットし、MS-DOSまたはWindowsを動作させることができた[ 1] [ 2] 。
WinUAE
Windows 版UAE (英語版 ) であり、Windowsマシンで大きなファイルを作成し、それを Amiga のファイルシステムとして扱う。WinUAEではこのファイルを hardfile と呼ぶ[ 3] 。またUAEでは、ホストシステム(Windows 、Linux 、Mac OS 、AmigaOS )のファイルシステム上の指定ディレクトリ配下を Amiga のファイルシステムとしてアクセスすることもできる[ 4] 。
他にも、セキュリティの観点や利便性の観点から、単一ファイルを特定アプリケーションでのみファイルシステムとしてアクセスできるようにしたいというニーズがあり、以下のような例がある。
whefs[ 5] - POSIX 準拠OSで使用可能なオープンソース のC言語ライブラリで、1つのファイルをファイルシステムとして扱えるアプリケーションをC言語 およびC++ で作成できる。
Embedded File System (EFS)[ 6] -オープンソースでクロスプラットフォームのC++での実装。
Solid File System (SolFS)[ 7] - クロスプラットフォームで暗号化と圧縮機能を備えた単一ファイルによる仮想ファイルシステム
またJava で、アーカイブファイル を展開せずにディレクトリとファイル群としてアクセスできるソフトウェアも単一ファイルによる仮想ファイルシステムの一種と見ることができる。中にはFTP やHTTP でサーバにアクセスし、サーバ側のディレクトリツリーをローカルなファイルシステムのようにアクセスできるものもある。
脚注
参考文献
Put virtual filesystems to work
Vnodes: An Architecture for Multiple File System Types in Sun UNIX
Linux kernel's Virtual File System
Rodriguez, R.; Koehler, M.; Hyde, R. (1986年6月). "The Generic File System". Proceedings of the USENIX Summer Technical Conference . Atlanta, Georgia: USENIX Association . pp. 260–269.
Karels, M.; McKusick, M. K. (1986年9月). "Towards a Compatible File System Interface". Proceedings of the European UNIX Users Group Meeting . Manchester, England: EUUG . pp. 481–496.
Heidemann, John (1995). Stackable Design of File Systems (Technical report). UCLA . CSD-950032。
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
関連項目
外部リンク