NetBSD パッケージシステムにおける
ワイルドカードの取り扱いについて
Hubert Feyrer <hubertf@NetBSD.org>、 2000 年 1 月
概要: この文書では、まず NetBSD パッケージシステムにおいて
依存関係がどのように機能してきたかを振り返り、ワイルドカードを使った
依存関係を持つバイナリーパッケージのインストールのために
ワイルドカードが使われる方法と、パッケージの衝突の処理を説明し、
さらに、 pkg_* ツールが導入されてからの変更点の概要を述べます。
1) これまでのあらすじ
まずは、 *BSD Packages/Ports システムにおいて、依存関係がどのように
処理されてきたかを説明させてください。 RUN/BUILD_DEPENDS は別にすると、
依存関係の仕組みは、パッケージの Makefile での次のような指定によって
働きます:
DEPENDS+= foo-1.2:../../somecat/foo
これは二つのことを指定します:
- このパッケージが依存している "foo" のバージョン。このパッケージを
インストールするためには、 foo-1.2 がなければなりません。
- 必要なバージョンがインストールされていない場合、先にそちらを
パッケージシステムを使って構築するため、一旦そちらの処理に移行します。
インストールの際、必要な "foo" のバージョンがインストールされているか
調べるのに "pkg_info -e" が使われます。もしインストールされていれば、
何も問題はなく、 pkgsrc からの構築でも pkg_add を使ったバイナリーパッケージの
インストールでも、インストール作業を続けます。
もし必要なバージョンがインストールされていなければ、構築システムは、
依存関係がすべて解決するまで、依存しているパッケージのインストールのため、
それ用のディレクトリーに移行します。
バイナリーパッケージのインストールの場合は、 pkg_add は foo-1.2.tgz
というバイナリーパッケージがあることを前提とし、それをインストールします。
2) ワイルドカード依存関係
このように必要な "foo" のバージョンを特定のものに固定すると、
保守が厄介になります。また、多くの場合、特定のバージョンが必要なのではなく、
いくつかのバージョンのうちのどれか (あるいは任意のバージョン) が
インストールされていればよかったりします。
そこで、次のような依存関係の設定ができました。
DEPENDS+= foo-*:../../somecat/foo
これは、 "foo" の "任意の" バージョンを表します。構築システムは、
"pkg_info -e 'foo-*'" を使って "foo" のいずれかのバージョンが
インストールされているか調べます。インストール済のパッケージをすべて調べ、も
し "foo" がインストールされていれば、どのバージョンであろうと受け入れるのです。
もしインストールされていなければ、構築システムは、 pkgsrc から
バージョン不問で探し出し、これのインストールに移行します。
バイナリーパッケージでは、この扱いはより複雑です。各バイナリーパッケージは、
"foo" パッケージの "任意の" バージョンに依存していることを知っており、
構築システムと同様に、それを見つけるためのチェックをします。
もし条件を満たすバージョンがインストール済ならば問題ありません。
そうでない場合、 "foo" パッケージの "任意の" バージョンのインストール
という要求を (自動的に) 満たすうえで、問題が起こります。
バイナリーパッケージの形態では移行すべきディレクトリーが与えられず、
また、ソースからの再構築というオプションがないためです。
そこで、 pkg_add では、すべての利用可能な (バイナリー) パッケージをスキャンし、
そのなかで (求められている条件 "foo-*" に合致するものから) 最新のものを
インストールします。このスキャンは、ワイルドカードの仕組みへの対応のために
必要なことです。依存しているバージョンに、 foo<1.0 のような制約
(``dewey depend'') がある場合は、 1.0 より前のバージョンで利用可能な
バイナリーパッケージのなかから最新のものを探してインストールします。
こうやって必要な依存関係を満たすのです。
バイナリーパッケージは、ローカルディスクからだけでなく FTP 経由でも
インストールできますが、上で説明した "ディレクトリースキャン" はこの場合も
行なわれます。この、遠隔ディレクトリーのスキャンは、
NetBSD パッケージシステムのワイルドカードを完全に有用なものにする上で、
最後まで欠けていた部分でした。
3) 処理についてのメモ
バイナリーパッケージ─ "kde" のように、 "a-1.0" というパッケージが
"b-1.*" に依存し、さらにそれが "c-*" を必要としているなどとします─
を FTP 経由でインストールする場合、
必要な (ネットワークの) 動作は、おおざっぱに言えば次のようになります:
- "a-1.0" の +CONTENTS を得る。
- "b" の利用可能なバージョンがわかる。
- "b-1.whateverisavailable" の +CONTENTS を得る。
- "c" の利用可能なバージョンがわかる。
- "c-something" の +CONTENTS を得る。
- "c-something" の残りの処理
- "b-1.whateverisavailable" の残りの処理
- "a-1.0" の残りの処理
"…の残りの処理" での操作では、同じコネクション (FTP その他何でも)
を再利用して行なうことができます。にもかかわらず、 pkg_add のプロセスが、
さらなるパッケージの追加のために、同じ FTP サイトに別のコネクションを
張ってしまうと、次のような結果を生みます。
- リモートサイトでコネクションが氾濫
- 余計なコネクション確立のための時間の無駄
これは、 3 個の pkg_add のプロセスすべてで同じ FTP セッションを使うことで
回避されます。 ftp(1) を走らせている共通プロセスは、 stdin と stdout 用に
ふたつのパイプをオープンし、これらをその後の pkg_add コマンド
(環境変数からファイル記述子を得ます) に渡します。
このコネクションの維持によって、複数のバイナリーパッケージの取得と
インストールに、通常はただひとつのコネクションが使われます。
4) さらに依存関係について
NetBSD パッケージシステムで使われるワイルドカードは、シェルのグラブの
スーパーセットになっています。現在、次のものに対応しています:
- fnmatch(3) に記述されているシェルのグラブ (*, ?, ...)
- csh 的な選択肢 {foo,bar}
- >=、 <=、 <、 > 演算子を使った、パッケージのバージョン番号のマッチング
たとえば、 "pkg_info -e 'foo>=1.3'" は "foo" パッケージの 1.3 以降の
バージョンが該当します。
これらのワイルドカードは、インストールされたパッケージの検出や、
依存するバイナリーパッケージの探索に使われるだけではありません。
ワイルドカードはまた、パッケージの衝突の検出にも使うことができます
(実際使われています) 。 これは、ファイル名や機能の重複などにより
同時にインストールすべきではない二つのパッケージを使う事態を回避するためです。
ワイルドカードの別の用途として、 pkg_info や pkg_delete に
バージョンなしのパッケージ名だけが与えられた場合、自動的に "-*" を
補完してインストール済みのパッケージを調べるというものがあります。
これにより、若干のキーストロークの節約ができ、さらに重要なことには、
どのバージョンがシステムにインストールされているかを知っておく必要が
なくなります。
5) その他、 NetBSD パッケージシステムでの変更点
1997 年中ごろに NetBSD に pkg_* が FreeBSD からとり入れられて以来、
ツールの拡張のためにいくつかの変更が加わりました。興味深いものを
いくつか掲げます:
- ftp のコードは二度書き直されました。一回目は、プロキシーの扱いや
バンド幅の制限などを追加するために、 ftpio ライブラリーが ftp(1)
プロセスの生成で置き換えられました。二回目はコネクションの保持のためで、
再帰的な pkg_add が ftp(1) プロセスを呼び出していたのを、
ひとつの同じ ftp プロセスを使うように書き換えられました。
- パッケージによってシステムに置かれたすべてのファイルの情報を記録する、
「パッケージデータベース」が追加されました。この情報によって、
バイナリーに対応するすべてのドキュメンテーション (マニュアルページ、
README など) や設定ファイルが簡単に見つかります。
- インストール済みのパッケージやバイナリーパッケージのバイト単位での
サイズを記録するようになりました。さらに、依存しているパッケージを含む
サイズも記録しています。これにより、パッケージのインストールの前後に、
必要なディスクスペースがわかります。
- パッケージの再帰的な削除、これにより、あるパッケージが必要としている
パッケージをすべて削除したり、あるパッケージを必要とするパッケージを
すべて削除したりすることができます。
- 新しいバージョンの bsd.pkg.mk の機能が必要な場合のため、
古い pkg_* ツールの検出機能が追加されました。この機能 (と
pkgsrc/pkgtools/pkg_install パッケージとの組み合わせ) により、
ユーザーは、システム上の pkg_* ツールのアップグレードの調整ができます。
- "zoularis" パッケージの助けにより、 NetBSD の若干の
コアコンポートネントが Solaris と Linux に移植され、
NetBSD パッケージシステムは、これらのシステム上でも使用できるように
なりました (現に使用されています!) 。このサブシステムのドキュメントは
それ専用のものが用意されるべきですが、しかし、この特徴からも、 NetBSD
が世界で最も移植性にすぐれたオペレーティングシステムであることがわかります。
下記は NetBSD パッケージシステムに関して名前を挙げるに値する人たちです。
彼らのおかげで今日のシステムがあるのです:
- pkg_* ツール: Jordan Hubbard、 John Kohl、その他影の主役たち
- パッケージ衝突のコード: Thorsten Frueauf
- ワイルドカードのマッチング: Alistair Crooks、 Hubert Feyrer
- ワイルドカード依存関係の処理: Hubert Feyrer
- NetBSD から Solaris や Linux への移植: Christos Zoulas、
Alistair Crooks、 Kimmo Suominen
- NetBSD pkgsrc の committer たちと、彼らを助け、手伝い、支援し、
ついてきたユーザーたち。
さらなる情報:
(c) Copyright 20000110 Hubert Feyrer <hubertf@NetBSD.org>
$NetBSD: pkg-wildcards.html,v 1.1 2007/06/09 11:34:49 dsieger Exp $