レベル: 中級 Cameron Laird (Cameron@Lairds.com), Vice President, Phaseit, Inc.
2003年 4月 29日
仮想ファイルシステム (VFS)
の抽象は驚くほど生産的な働きをします。今では、人気のいろいろな言語がVFS構文をサポートするようになっています。Cameron
Laird氏が、その有効性を紹介してくれます。
「あなた自身で試してみるまでは、それがどれほど便利かわからないことと思います」こんな文章を誰かが私に書いてよこすとき、その人はその機能をよく理解していないからそれをうまく説明できないのだと考えるのが私の常です。
しかし仮想ファイルシステムに関しては、私自身の経験からもその人の言っていることが正しいことがわかります。ActiveState
Corp. 社のシニア開発者であるJeffrey Hobbs氏と私の二人は、仮想ファイルシステム (VFS)
が思いがけず強力な働きをすることをわれわれの目で確認してきました。
考え方は簡単でも効果は絶大
VFSの基本的な考え方は単純で、ファイルシステムでないものをファイルシステムとして表現するということです。ここでいうファイルシステム
とは、「従来のLinuxのようなファイルシステム」のことで、直接アクセスすることのできるディレクトリーや
(通常の)
ファイルからなるツリーあるいは階層のことを意味します。Linux自体その性質の多くをUNIXファイルシステム内のデバイスやテーブルなどのオブジェクトの表現から引き継いでいるわけですから、Linuxを扱っている者なら当然この考え方に興味を覚えるのではないでしょうか。UNIXは、すべてのもの、あるいは少なくとも数多くのものがファイルであるという原理の上に築かれています。VFSは、この原理を一般化して、できるだけ多くのものをファイルシステムとして捉えようというわけです。
注意:
Linuxカーネルの開発者が語るときのVFSは意味合いが異なります。このコラムで扱っているのは、ext2やext3やreiserfsなどのファイルシステム・ドライバーをディスパッチするためのLinuxの仮想ファイルシステム・スイッチのことではありません。
フリーの開発技術者であるJean-Claude
Wippler氏の言葉を借りるなら、VFSは「OSと高級言語環境の境界を不明瞭なものにしつつある」テクノロジーや概念の新たな例であるということもできます。特に、「システム・サービス」をアプリケーション開発言語から見えるようにするとオペレーティング・システムが視野から消えるわけですから、移植が行いやすくなります。
ではファイルシステムでないものでファイルシステムとして表現すれば便利なものとはどんなものなのでしょうか。いろいろなものがあります。FTP、HTTP、WebDAVなどのネットワーキング・プロトコルを介してアクセスされるファイル、
.zip
やCVS (コンカレント・バージョン・システム)
などのアーカイブ・ファイルの中身、データベースのテーブル、セキュリティーなどの制約条件によって制約されている実際のファイルシステムの投影
(projections) などなどです。
そうした資源が自然な形でファイルシステムにマッピングされることは簡単に理解できます。たとえば
example.zip
に以下のファイルが収蔵されているとします。
first
subdir1/second
subdir1/third
subdir2/fourth
このアーカイブは、恐らく現在あるファイルシステムのツリーを直接的に (かつ部分的に)
イメージにしたもので、本来は以下のようなルートまで含めたツリーで表現されます。
./first
./subdir1/second
./subdir1/third
./subdir2/fourth
業界で強みを発揮している数多くの製品がVFSを利用しています。DB2のジャーナル作成型ファイルシステムのような機能のアーキテクチャーにはVFSモデルが採用されています。よく知られているZopeアプリケーション・サーバーは、もう少し高度なVFSの応用例となっています。Zopeの「獲得」という概念は、プログラム上のオブジェクトをURLにマップするというものです。Zopeでは、
context.myproject.object1.method1(year =
"1999")
というメソッドの起動が以下のようなURLのHTTPリクエストに対応付けられます。
http://myzope.com/myproject/object1/method1?year=1999
このありがたみがおわかりになるでしょうか。VFSは簡単に理解でき、お手本にできるという意味でUNIXの「すべてのものがファイルである」という概念にも似ていますが、VFSによってアプリケーション設計がどれほど簡単になるかを理解するには数年かかるのかもしれません。
1つ例を考えてみたいと思います。テキスト・エディターを作成したとします。ファイルを個々にアクセスし、読み出し、修正を加え、それをまた記憶装置に書き戻すといった機能があります。ここでファイルシステムの「仮想化器
(virtualizer)」を利用すると、突如としてその同じコードを使ってFTPやZIPアーカイブを操作し、個々の項目を選択し、それに修正を加え、保存するといったことが可能になります。皆さんは、ローカルなファイルを手際良く処理してくれるブラウザーとかバックアップ・ユーティリティーとかセキュリティー・スキャナーとかバージョン制御システムをお使いでしょうか。そのファイルシステムのアクセスを仮想化すれば、即座に
.tar
ファイルや昔のテープ・リールや仮想プライベート・ネットワーク (VPN)
経由でしかアクセスできない企業資源を利用できるようになります。ベンダーは、そのようなアドオンを何千ドルもの値段で売ろうとしますが、VFSならただでそれを手に入れることができます。
あるいは、ほとんどただでというべきかもしれません。プログラマーが新たに学ぶべきことは何もありません。これまでずっと使ってきたファイルシステムの
open
や
close
などを行い続ければよいのです。そこが味噌です。コードはすべて、いつもの物でよいのです。ただ、現在のところ完全なVFSをサポートする言語のランタイム・ライブラリーがほとんど存在しないという点だけが難点です。一般的な問題としては、書き込み機能にきめの細かいプログラミングが必要である、あるいは単にHTTPなどのプロトコルには書き込み操作の余地がないことから、ドライバーが読み取り専用である場合が多いということもあります。
VFSはどこで使える ?
VFSを最もよくサポートしている言語はTclであり、ActiveState社でHobbs氏が担当している言語です。JavaやPerlなどの他の言語の場合、たとえばPerlの場合の
vfsopen
のように新しいメソッドを用意してコア・ライブラリーのエントリー・ポイントを補足しているという点で、VFSの現在の実装は「純然」なものではありません。これに対してTclのリリース8.4では、VFSのコミュニティー・ページで説明されているとおり「ファイルシステムが完全に仮想ファイルシステムに対応したものとなっています」
このことは、とりわけ構文として通常のファイルを認識できるところであればどこでも仮想的なファイル資源を利用できることを意味します。従来のTclでは、
image create -file myimage.gif
といった記述が可能でしたが、Tcl 8.4はこれを自然な形で拡張して以下のような表現を可能にしています。
image create -file ftp://myserver.com/myimage.gif
1990年代の終わり頃、Tcl向けに初めて堅牢なVFSを実装したのは自営のコンサルタントMatt
Newman氏でした。彼が大手金融企業のために行っていた開発をスムーズに進めるためでした。2000年の終わり頃には、Eurobios社の科学者であるVince
Darley氏がTclのファイルシステムのアプリケーション・プログラミング・インターフェース (API)
に大がかりな書き換えを加え、特にVFSのフックを可能にしています。
実際にTclアプリケーションを開発している技術者は、ほとんどがまず上に示した例にVFSを応用しています。たとえばFTPにスムーズに対応できるエディターなどです。ところが興味深いことに、Wippler氏などTclにVFSを導入した先駆者たちの一番の動機は
(アプリケーション配備についての以前の「サーバー・クリニック」のコラムでも触れたことですが --
参考文献
参照)「裏返しの」VFSでした。すなわち、すでに存在する外部資源にアクセスするためにVFSテクノロジーを利用するのではなく、アプリケーション内部の特殊なデータベースをVFSで完全なファイルシステムとして管理しようというものでした。彼らは、このメカニズムを利用することでアプリケーションの開発や配備を著しく簡単化することができました。この観点から捉えるなら、VFSは開発、品質管理、カスタマー・サイトといったさまざまな稼働環境を統一し統合することで、アプリケーションがそれらすべての環境で首尾一貫した動作をするようにするための1つの方法となっています。外部ファイルに対する透過的なファイルシステムの一般化というのは、おまけなのです。リスト1の2つのコード・サンプルは、Tclのコミュニティー・ページのものを手直ししたものですが、そのおまけの威力を垣間見せてくれます。
リスト1. TclでのVFSの使い方
package require vfs::urltype vfs::urltype::Mount ftp #
With VFS activated, normal Tcl file commands # can copy
files even to and from FTP servers. file copy
ftp://foo.bar.com/pub/Readme . file copy myfile
ftp://user:password@foo.bar.com/private.txt
package require vfs::zip vfs::zip::Mount foo.zip foo.zip
# foo.zip is now part of the normal filesystem
hierarchy. cd foo.zip # Within subdir1 on foo.zip, list
all items. set listing [glob -dir subdir1 *]
|
たいていの言語はFTPやZIPにアクセスするための機能を備えています。その意味でVFSはオブジェクト指向とか高級言語とかランタイム・ライブラリーに似ています。新しいものを何も提供していませんし、VFSが行うことはすべて自分でプログラミングすればできることです。しかしVFSを利用すれば資源管理がはるかに簡単で合理的なものになります。難しい考え方ではありません。むしろ有益な考え方です。
VFSは、いろいろな面白い問題を簡単化してくれます。Tclプログラマーが現在取り組んでいる問題には以下のようなものがあります。
- バージョン管理される動的にロード可能なライブラリーを中央に集約して圧縮したアーカイブ
- インテリジェントなネットワーク・エージェント
- 先進的な「メディア混合型」バックアップ・マネージャー
私は「能動的ファイルシステム (active
filesystems)」のプログラミング可能性についていろいろと実験を行ってきました。能動的ファイルシステムというのは、いくつかの言語がサポートしている「プロパティー」に類するものと考えればよいでしょう。プロパティーとは、アクセスすると副作用を生じる可能性のある属性のことです。たとえば、
result = thing.property
という記述は、単にメモリーから「property」の値を読み出してくるだけではなく、ネットワーク経由でデータを引き出したりシステム・ステータスをチェックするための計算を伴うかもしれません。同様に、
file copy report.pdf backup
といった記述をした場合、ファイルをディレクトリーにコピーするだけでなく、状況によってはファイルを作成するなどの処理を行うことになります。
プロパティー指向プログラミングは副作用に満ちているため危険だと考えられています。実際、基本的にはアクセッサー・メソッドを明示的に呼び出せば行えることしか行いません。それでも、このスタイルに適した状況というものもあります。
makefile
やスクリプトの代わりに能動的ファイルシステムを利用することでコーディングしやすくなる場合が少なくとも時々存在することを私は発見しています。
まとめ
TclはVFSに対して高度な対応を行っているという点で他の言語よりもはるかに優れています。文字の符号化、I/Oアーキテクチャー、パフォーマンスに関する制約といった他の言語コミュニティーではやっと明らかになり始めたばかりの問題にTclは以前から取り組んできています。といっても、TclでなければVFSの考え方
を応用できないというわけではありません。VFSでファイル形式の資源にアクセスする場合のような一貫性の向上は皆さんのプログラミングでも利用できるのでしょうか。最近の言語は、ほとんどが本来の構文を拡張して一貫性の高い強力なI/Oをコーディングするための手立てを用意しています。
TclのVFS機能には、驚くほど数多くのプログラマーが貢献してきています。ましてや他の言語については言うに及ばずです。中でも、すでに触れた開発者以外に、ActiveStateのAndreas
Kupries氏によるI/Oチャネルに関る仕事およびVFSによって生じる「ブートストラップ」の問題についてのGEのKevin
Kenny氏の研究は特筆に値します。
参考文献
-
これからTclのVFS機能について調べたいという方には、
VFSについてのWikiのページ
が一番のお薦めです。
-
VFSは、
Zope
の能力を有名にしている技術的インフラストラクチャーでも大きな役割を果たしています。
-
Apache
は
Jakarta
の1つのコンポーネントとして
VFS
を提供しています。
-
GnomeVFS
は、
ftp://archive.com/something
のようなURIをローカルなアクセス機能にマッピングしてくれる「ファイルシステム抽象ライブラリー」です。このライブラリーに
バインド
できる言語にはPerlなどがあります。
-
「
サーバー・クリニック: アプリケーションの配備
」(developerWorks、2002年6月)
は、VFSの利用方法の1つの方式について触れています。
-
Starkit
はVFSやそれに関連する分野についてのWippler氏の研究の結実で、移植性や永続性や配備といった一般的な問題に対して面白い解法をもたらしてくれるアプリケーションです。
-
Hackerlab
は刺激的なVFSのAPIを特徴とするCのライブラリーです。
-
GUI言語Tcl/Tkについては、チュートリアルの「
Tcl/Tk quick start
」(developerWorks、2001年10月)
が主要な機能や実用的な例を多数紹介した充実した入門書となっています。
-
Read Cameron氏のこれまでの「サーバー・クリニック」のコラムには、以下のものがあります。
-
developerWorks のLinuxゾーンには、他にも
Linux開発者向けの参考文献が多数
掲載されています。
著者について  | 
|  | Cameronは、Phaseit, Inc. の常勤のコンサルタントです。オープン・ソースなどの技術的なトピックについて、数々の執筆や発言を行っています。Cameronのメール・アドレスはclaird@phaseit.net です。 |
記事の評価
|