2006年1月25日水曜日

(FreeBSD) portsnapでportsを最新に

portsというのは、FreeBSDのソフトウェア・パッケージ管理システムのことです。事前にコンパイルされたバイナリパッケージをインストールすることもできますが、基本的には、ソースファイルをコンパイルして、インストールするようになっています。ちなみに、ソースからコンパイルするほうが、共有ライブラリのバージョン不一致とかの問題がなくて、個人的には好きです。



日々バージョンアップされてていく多くのソフトウェアにあわせて、portsも、常に更新されつづけています。そのため、portsを利用するならば、常にportsを最新の状態に更新しなければなりません。



portsを更新する方法として、これまではcvsupというツールが使われていました。しかし、cvsupは、プロキシーサーバを使ってくれないため、ファイアウォールを超えるのが容易ではありません。SOCKS5か、もしくはsshのポートフォワーディングが使えれば、cvsupを使うこともできるのですが、SOCKSやSSHが使えなくなっているネットワークでは、cvsupの利用の道は閉ざされます。FTPサイトにtar+gzでアーカイブされたports全部のファイルがあるので、それをダウンロードして展開すればいい・・・んですが、portsってファイルの個数がものすごく多くて、全ファイルの削除&展開だけで、けっこう時間がかかるんですよね。



そんな中、最近推奨されているのが、portsnapというツールです。これ、ちゃんとHTTP/FTPプロキシーサーバを使ってくれます。というのも、実際にファイルをダウンロードするのは、fetchというコマンドを使っているからのようです。



■ portsnapをインストールする



FreeBSD 6.0-RELEASEと、最近の5-STABLEでは、すでに/usr/sbin/portsnapとして最初からインストールされています。



それ以前のFreeBSD(5.4-RELEASEを含む)の場合は、portsnapをバイナリパッケージか、portsの/usr/ports/sysutils/portsnap/からインストールすればOKです。



■ portsnapの設定



portsnapの設定ファイルが、/etc/portsnap.confにあります。たぶん、何も書き換える必要はないんじゃないかと思います。



パッケージやportsでインストールしたportsnapの場合は、/usr/local/etc/portsnap.confになります。たしか最初は、portsnap.conf.sampleというファイルしかないので、portsnap.confという名前でコピーすればOKだと思います。



portsはやたらとファイルの個数が多く、ぜったいにインストールしそうもないものも多数あります。portsnapで、自分にとって不要なものをダウンロードしないように設定することができます。これは、portsnap.confでREFUSEというキーワードで指定します。たとえば、こんな感じです。

REFUSE arabic chinese french german hebrew hungarian
REFUSE korean polish portuguese russian ukrainian vietnamese

これで、/usr/ports/arabic、/usr/ports/chineseなどのファイルが展開されなくなります。



デフォルトでは、/usr/portsにportsファイルが展開されます。portsnap.confで変更することもできますが、個人的には、わかりづらい(というか忘れてしまうので)、別ディレクトリに展開したい場合は、/usr/portsからシンボリックリンクをはるようにしています。

freebsd# ln -s /disk1/ports /usr/ports

あと、portsnapが使う作業ディレクトリが必要です。portsnap.confにWORKDIRという名前で定義されているので、そのディレクトリを事前に作成しておきます。

freebsd# mkdir /var/db/portsnap



■ プロキシーサーバの指定



fetchコマンドでファイルをダウンロードするので、fetchコマンド用の設定をすればよいのですが、ちょっと独特です(昔にくらべたらましになったんですけど)。こんな感じです。

freebsd# setenv HTTP_PROXY http://192.168.0.21:3128

環境変数HTTP_PROXYに、「http://プロキシーサーバ名:ポート番号」という書式で指定します。



詳しく情報は、「man 3 fetch」を実行してマニュアルを見ることができますが・・・わかりづらいです。最後の方の、使用例を見るだけで十分かも知れませんが。





■ portsnapを実行する



まずは、「portsnap fetch」を実行します。

freebsd# portsnap fetch
Looking up portsnap.FreeBSD.org mirrors... using portsnap1.FreeBSD.org.
Fetching public key... done.
Fetching snapshot tag... done.
Fetching snapshot metadata... done.
Fetching snapshot generated at Tue Jan 24 09:08:50 JST 2006:
5ff69d98845e7080524eea545565dee007a139eb55be1e  0% of   38 MB  140 kBps
(以下略)

次ですが、はじめてportsnapを実行した場合は、「portsnap extract」を実行します。

freebsd# portsnap extract

2回目以降は、portsnap fetchを実行したあと、「portsnap update」を実行します

freebsd# portsnap fetch
freebsd# portsnap update



と以上のようなかんじです。ほかに、cronからportsnapを実行するための「portsnap update」というのがあります。



portsnapのマニュアルやヘルプメッセージでは表示されないみたいですが「--debug」というオプション引数を指定することもできます(その名のとおりの機能ですが、1度、役に立ちました)。





1 件のコメント:

  1. 訂正というか補足
    portsnapは、fetchを使いますが、多くのファイルは/usr/libexec/phttpgetでダウンロードしてきます。
    portsnap自体はシェルスクリプトで、phttpgetはC言語のプログラムです。
    fetchコマンドは、libfetchという共通のライブラリでネットワークアクセスしますが、phttpgetは、独自です。環境変数HTTP_PROXYは、fetchとphttpgetで共通ですが、fetchは、phttpgetよりも、いろいろとカスタマイズできるようになっています。
    なんで、phttpgetなんてものを新たに加えちゃったんでしょうね。いま、portsnapがうまく動かないトラブルがあるんですが、原因は、あきらかに、phttpgetのできの悪いところにあります。

    返信削除