IBM®
本文へジャンプ
    Japan [変更]    ご利用条件
 
 
検索範囲検索:    
    ホーム    製品    サービス & ソリューション    サポート & ダウンロード    マイアカウント    
skip to main content

developerWorks Japan  >  Linux | Open source  >

サーバークリニック:仮想ファイルシステムを動かす

VFSの抽象は実際に驚くほど効果的

developerWorks
ページオプション

JavaScript を要するドキュメントオプションは表示されません

原文はこちら

原文はこちら


レベル: 中級

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ならただでそれを手に入れることができます。

あるいは、ほとんどただでというべきかもしれません。プログラマーが新たに学ぶべきことは何もありません。これまでずっと使ってきたファイルシステムの openclose などを行い続ければよいのです。そこが味噌です。コードはすべて、いつもの物でよいのです。ただ、現在のところ完全な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氏の研究は特筆に値します。



参考文献



著者について

Photo of Cameron Laird

Cameronは、Phaseit, Inc. の常勤のコンサルタントです。オープン・ソースなどの技術的なトピックについて、数々の執筆や発言を行っています。Cameronのメール・アドレスはclaird@phaseit.net です。




記事の評価


サイト改善のため、ご意見をお寄せください。こちらのフォームからお願いいたします。



 


 


不充分・不完全である大変素晴らしい
 


この記事を共有する

del.icio.us del.icio.us newsing newsing FC2ブックマーク FC2ブックマーク
Choix! Choix! ニフティクリップ ニフティクリップ Yahoo!ブックマーク Yahoo!ブックマーク
MM/memo MM/memo CZブックマーク CZブックマーク livedoorクリップ livedoorクリップ
はてなブックマーク はてなブックマーク Buzzurl(バザール) Buzzurl(バザール)




上に戻る


    日本IBMについて プライバシー お問い合わせ