[前のページ]   [もくじ]   [次のページ]

TVFSの薦め

解決したい問題点

実際に、/usr/local/の下に様々なファイルを置くと、各ファイルがどのソフトウェア・パッケージから展開されたものなのか判らなくなってしまいます。したがって、ひとつのソフトウェア・パッケージは、それ以外のソフトウェア・パッケージの影響を受けない独立したディレクトリに置いた方が管理は楽になりそうに思えます。しかし、それでは、多くのディレクトリにPATHやLIBPATHを通さなければならなかったりして、かえって面倒な面が出て来ます。

方法 長所 短所
様々なファイルをひとつのディレクトリに集中
  • あらたなソフトウェア・パッケージをインストールしても、PATHやLIBPATHを書換えずに済む
  • PATHやLIBPATHが短くて済む
  • 個々のファイルが、どのソフトウェア・パッケージから展開されたものか判らなくなり易い
  • 異なるソフトウェア・パッケージ内に同名のファイルがあるとオーバー・ライトされてしまう
ソフトウェア・パッケージ毎にディレクトリを用意
  • 個々のファイルが、どのソフトウェア・パッケージから展開されたものかが明確に管理できる
  • 異なるソフトウェア・パッケージに同名ファイルがあっても別個に扱える
  • ソフトウェア・パッケージの追加のたびに、PATHやLIBPATHにディレクトリを追加しなければならい
  • PATHやLIBPATHが長くなりがち

表にまとめてみると、このふたつの方法の長所と短所は全く裏返しであり、どちらの方法も完全ではないことがわかります。

TVFSのメリット

そこで、

といったことができれば、上に述べた問題を大幅に軽減できるでしょう。TVFSを使うと、複数のディレクトリを見かけ上、ひとつのディレクトリとして扱うことができます。

このTVFSによるパッケージ管理は、私が公開しているソフトウェアに限らず、他のソフトウェアにも応用が効きます。

TVFSを使ってパッケージを管理するメリットは、

  1. 既に記したように、ファイルをパッケージ毎に分けた複数のディレクトリで管理できるにもかかわらず、PATHやLIBPATHに追加すべきディレクトリは、その写像のディレクトリひとつずつだけで良い
  2. 以前のファイルを消すことなく、新たなパッケージをインストールできる
  3. 新たなパッケージに新たな問題があり、以前のバージョンに戻りたければ簡単に元に戻せる
  4. シンボリック・リンクが使える
などを挙げることができます。

TVFSによるディレクトリ結合の例

例えば、私の手元の環境の/usr/local/ディレクトリは、以下のような、いくつかのディレクトリをTVFSで重ね合せたものです。

TVFS Directory Link X:\usr\local
Order Access Exclude Create Directory
  1     rw     no      yes  D:\usr\local
  2      r     no      no   D:\var\lib\grep
  3     rw     no      no   D:\var\lib\wget
  4      r     no      no   D:\var\lib\w3m
  5      r     no      no   D:\var\lib\sed-ja
  6      r     no      no   D:\var\lib\zip
  7      r     no      no   D:\var\lib\unrpm
  8      r     no      no   D:\var\lib\bash
  9      r     no      no   D:\var\lib\bzip2
 10      r     no      no   D:\var\lib\jless
  :      :      :       :     (以下、略)
注)
REXXインタプリタは、次回からの実行を高速化するために、REXXスクリプトを実行した後に様々な情報を拡張属性に残します。bin/ディレクトレにREXXスクリプトがある場合には、tvlinkのオプションに“-w”も指定した方が良いでしょう。

例えば、いま使っているsedの動作が何か怪しいと疑ったとします。そのような場合、

tvulink X:/usr/local sed-ja
で、sed-jaをディスク上から削除することなくアンインストールできます。そして、より動作実績のあるディストリビューションのsedパッケージを例えばsedディレクトリに解凍し、
tvlink -r X:/usr/local sed
で、/usr/local/にあるsedを入れ替えることができます。

もし疑いが晴れたら、

tvulink X:/usr/local sed.unstable
tvlink -r X:/usr/local sed
で元の状態に戻すことができます。

同名のファイルがいくつかの異なるパッケージで配布されることがあります。このような場合、実際に同じディレクトリにそれらを解凍すると、どちらかのパッケージのファイルがオーバーライトされてしまうでしょう。TVFSを使えば、見かけ上、それらが同じディレクトリにありながら、それらがオーバーライトされることはありません。例えば、grepは、IBM EWSのAIXLIKE 3.51やGNU grep 2.4のパッケージに含まれており、同名のプログラムでありながら、似て非なる機能を持っています。また、例えば、gnuregex.dllは、GNU diffやGNU m4、GNU shell utilsなどのパッケージに含まれています。複数のパッケージのディレクトリを/usr/local/にまとめた時、どれを優先するかは、tvlinkの“-#”オプションで明示できます。

実際には、どのパッケージにどんなファイルがあるかを気にしながらリンクの順番を決めるのは面倒くさいので、私は、bin/ディレクトリやdll/ディレクトリに置くべきファイルの日付を比較し、それが新しいほど優先されるようにtvlinkの“ -#”オプションを設定しています。

日付の比較は、個々のディレクトリに、ファイルの日付を反映させる事で簡単に行えます。例えば、grep/ディレクトリにfgrep.exeの日付を反映させたり、wget.exeの日付をwget/に反映させるには、GNU file utilパッケージに含まれるtouchを使います。

touch -rgrep/bin/fgrep.exe grep
touch -rwget/bin/wget.exe wget
とします。このようにしてtouchされたディレクトリの日付を比較するには、例えば“dir /o-d”とコマンド入力します。
 ドライブ D のボリューム・ラベルは OS/2 です        
 ボリューム・シリアル番号は E73B:5814               
 ディレクトリーは D:\var\lib                        
                                                    
00-03-05 23:31          <DIR>      0 ----  grep     
00-03-05  0:39          <DIR>      0 ----  wget     
00-02-20 11:53          <DIR>      0 ----  w3m      
00-01-23 23:06          <DIR>      0 ----  sed-ja   
00-01-09 19:34          <DIR>      0 ----  zip      
99-11-06 20:24          <DIR>      0 ----  unrpm    
99-10-23 15:50          <DIR>      0 ----  bash     
99-08-03 20:11          <DIR>      0 ----  bzip2    
99-08-01 15:31          <DIR>      0 ----  jless    
    :      :              :        :   (以下、略)   

私の場合、日付による優先順位付けの例外は、D:/usr/local/ディレクトリで、これは無条件に“-#1”としています。D:/usr/localには、fd2やbison、lhaのような、個々のファイル名がソフトウェア・パッケージのそれと等しいか極めて似ており、ひとつのディレクトリに混在しても、どのパッケージを解凍したものか容易に類推できるものをほうり込んであり、tvlink -rwcでリンクしています。

ソフトウェア・パッケージのインストール例 (1)

例えば、私が公開しているwgetを解凍すると、以下のようなディレクトリ/ファイルが展開されます。

wget/
 ├ bin/
 │  └ showsubj.cmd  wget.exe
 ├ doc/
 │  └ wget/
 │       ├ AUTHORS  ChangeLog  changelog.Debian
 │       ├ ChangeLog.info  ChangeLog.srcCOPYING  MACHINES
 │       ├ MAILING-LIST  NEWS  README  README.os2
 │       ├ README.os2.orig  TODO
 │       ├ html/
 │       │    ├ wget_1.html  wget_2.html  wget_3.html
 │       │    ├ wget_4.html  wget_5.html  wget_6.html
 │       │    ├ wget_7.html  wget_8.html  wget_9.html
 │       │    ├ wget_10.html  wget_11.html  wget_foot.html
 │       │    └ wget_toc.html
 │       └ util/
 │           ├ download-netscape.html  download.html  README
 │           └ rmold.pl  wget.spec
 ├ info/
 │  ├ wget.info-1.gz  wget.info-2.gz  wget.info-3.gz
 │  └ wget.info.gz
 ├ man/
 │  └ man1/
 │      └ wget.1.gz
 ├ share/
 │  └ locale/
 │      ├ cs/
 │      │ └ LC_MESSAGES/
 │      │    └ wget.mo
 │      ├ de/
 │      │ └ LC_MESSAGES/
 │      │    └ wget.mo
 │      ├ hr/
 │      │ └ LC_MESSAGES/
 │      │    └ wget.mo
 │      ├ it/
 │      │ └ LC_MESSAGES/
 │      │    └ wget.mo
 │      ├ ja/
 │      │ └ LC_MESSAGES/
 │      │    └ wget.mo
 │      ├ no/
 │      │ └ LC_MESSAGES/
 │      │    └ wget.mo
 │      └ pt_BR/
 │         └ LC_MESSAGES/
 │            └ wget.mo
 ├ src/
 │  ├ diffs/
 │  │  ├ wget-1.5.3-os2-subj.diff.bz2
 │  │  └ wget-1.5.3-os2.diff.bz2
 │  └ wget-1.5.3.ja.po.bz2
 └ doc/
     └ wget/
         └ changelog.os2

上のような構造に解凍されるソフトウェア・パッケージは、

tvlink -r X:/usr/local wget
とすれば、そのまま、代表的なディレクトリ構成の例の項に述べたような/usr/local/ディレクトリ構造として、TVFSドライブ上に参照できるようになります。

もちろん、例えば、もしあなたがwgetをあなたのニーズにあわせてソースコード・レベルでカスタマイズしたいのでなければ、wget/src/以下のツリーは不要ですので、削除してしまって構いません。同様に、例えば、日本語メッセージ以外の各国語メッセージが不要なら、share/locale/以下のja/以外のディレクトリ・ツリーを削除してしまって構いません。

私が1998年12月以降に公開したソフトウェア・パッケージで、その中に多量のファイルがアーカイブされているものは、ここで紹介したような“tvlinkコマンド 一発”でインストールが済むように配慮してあります。例外も少なくないですが…。

なお、以上、OS/2アプリケーションを前提とした説明を行いましたが、このようなTVFSによるディレクトリの結合は、DOSセッションの環境変数PATHのように長い値を設定できない環境では特に有用です。

ソフトウェア・パッケージのインストール例 (2)

慣例的に、XFree86/OS2用のソフトウェア・パッケージは、ルート・ディレクトリでunzipするとXFree86/ディレクトリ以下に展開されるようにアーカイブされるのが普通です。何処か適当なディレクトリで解凍したら、それを適当にリネームして、X:/XFree86/にリンクしてしまえば、ソフトウェア・パッケージ毎に独立したディレクトリでソフトウェアを管理できます。

例:
unzip xvncview
ren XFree86 xvncviewer
tvlink -r X:/XFree86 xvncviewer

シンボリック・リンクの実例

最後に、もうひとつ紹介しておきたいTVFSのメリットは、unixのシンボリック・リンクもどきの使い方です。unix環境で開発されたソフトウェアのいくつかは、同じプログラムでありながら、そのファイル名が異なると、それに応じた異なる動作をするものがあります。例えば、ファイルを圧縮するプログラムであるgzipやbzip2は、それぞれ、zcat、bzcatという名前で呼び出されると、それぞれ、gzip -dcやbzip2 -dcと等価な、ファイルを解凍して標準出力に吐き出すプログラムとして動作します。このようなソフトウェアが私の手元にもいくつかあり、私の場合、以下のようなシンボリック・リンクを張っています。

  • bunzip2.exe → bzip2.exe
  • bz2cat.exe → bzip2.exe
  • bzcat.exe → bzip2.exe
  • gunzip.exe → gzip.exe
  • setlong.cmd → setsubj.cmd
  • showlong.cmd → showsubj.cmd
  • zcat.exe → gzip.exe
  • zipinfo.exe → unzip.exe

また、配布されているファイル名をリネームすることなく、呼び出すコマンド名を変えることもできます。例えば、OS/2が元々用意しているpatch.exeと、GNU patchのOS/2版のpatch.exeは同じ名前ですが、元々OS/2が用意しているものと分けるために、GNU patchの方を、

と、シンボリック・リンクを張っておくだけで、gpatch、gnupatchのどちらの名前でもGNU patchのpatch.exeを呼び出すことができます。このように、元々の名前と違う名前を用意するために、私が張っているシンボリック・リンクを例示しておくと、
  • /bin/sh.exe → bash.exe
  • awk.exe → mawk.exe
  • csh.exe → tcsh.exe
  • lynx.exe → lynx-std.exe
  • nkf.exe → nkf2.exe
  • traceroute.exe → tracerte.exe
このようにしておくことにより、mawkをawkコマンドとしても呼び出すことができます。

しつこく、もうひとつだけ例示しておきます。DOS用のバッチ・ファイルとOS/2のバッチ・ファイルは、拡張子がそれぞれ .BATと .CMDと異なっていますが、実は中身は全く同じという場合があります。もちろん同じものを拡張子を変えてふたつ用意しておけば良いのですが、時々、一方だけを修正し他方の修正を忘れてしまい、後になってから、あれぇ? 修正したはずなのに…と、つまらないことで悩んでしまうこともあります。foo.cmd → foo.batとシンボリック・リンクを張っておけば、このようなトラブルを避けることができます。

TVFSに関する、その他の情報

TVFSの詳細については、TVFSのUser's Guideを参照してください。

TVFSは、以下のサイトからダウンロードできます。

なお、私やはやま かおるさんのように、TVFSをガンガン使えている人がいる反面、原因がよくわかりませんが、TVFSの動作が不安定で、その使用をあきらめてしまった人も少なくないようです。あなたの環境で運悪くTVFSが使えないからと言って、どうしたらうまく動くようになるだろうか?という質問のメールを私に送らないでください。残念ながら私はその解答を持っていません。私からは、せいぜい“かわいそうにねぇ。頑張ってね”と言う回答しか引き出せないでしょう。私は、この文章を読んでいるあなたのOS/2環境では、何の問題もなくTVFSが安定して動くことを祈るのみです。


[前のページ]   [もくじ]   [次のページ]