Portsnap は FreeBSD port ツリーを安全に配布するシステムです。 約一時間毎に port ツリーの “スナップショット” が作成され、 圧縮され、電子署名されています。 作成されたファイルは HTTP 経由で配布されています。
CVSup 同様、 Portsnap は、更新に pull モデルを採用しています。 圧縮され、電子署名された ports ツリーは web サーバに置かれ、 サーバはクライアントからの更新の要求を受け身の状態で待ちます。 ユーザは、portsnap(8) を手動で実行して更新をおこなうか、cron(8) ジョブを設定して定期的に自動実行する必要があります。
技術的な理由から、Portsnap は “live” port ツリー (/usr/ports/) を直接更新しません。 そのかわり圧縮された port ツリーのコピーは、デフォルトで /var/db/portsnap/ に保存されます。 この圧縮されたコピーは live port ツリーの更新に使われます。
Note: Ports Collection からインストールした Portsnap では、 圧縮されたスナップショットは /var/db/portsnap/ ではなく /usr/local/portsnap/ に保存されます。
FreeBSD 6.0 以降では、 Portsnap は、FreeBSD のベースシステムにあります。 古いシステムを使っている場合には、 ports-mgmt/portsnap package をインストールしてください。
Portsnap の動作は、 /etc/portsnap.conf で設定できます。 ほとんどのユーザにとっては、デフォルトの設定で十分でしょう。 詳細は portsnap.conf(5) マニュアルページを参照してください。
Note: Ports Collection からインストールした Portsnap では、設定ファイルは /etc/portsnap.conf ではなく、 /usr/local/etc/portsnap.conf となります。 この設定ファイルは、port のインストール時には作成されません。 設定ファイルのサンプルが配布されていますので、 以下のコマンドでコピーしてください。
# cd /usr/local/etc && cp portsnap.conf.sample portsnap.conf
初めて portsnap(8) を使う時は、 まず、圧縮された全 ports ツリーのスナップショット (2006 年の初めの時点で約 41 MB) を /var/db/portsnap/ (Ports Collection から Portsnap をインストールした場合は、/usr/local/portsnap/) にダウンロードしてください。
# portsnap fetch
圧縮されたスナップショットをダウンロードしたら、 ports ツリーのコピーを /usr/ports/ に展開します。 もし、すでに他の方法 (例えば、CVSup など) によって ports ツリーがこのディレクトリに作成されていたとしても、 この作業を行なってください。 portsnap が ports ツリーをアップデートする際に、 どの部分をアップデートすべきかを判断できるようにするためです。
# portsnap extract
Note: デフォルトのインストール状態では、 /usr/ports は作成されていません。 FreeBSD 6.0-RELEASE を使っている場合は、 portsnap を実行する前に作成しておいてください。 最近の FreeBSD や Portsnap を使っている場合は、 初めて portsnap コマンドを使った時に自動的に作成されるでしょう。
圧縮された ports ツリーのスナップショットをダウンロードし、 /usr/ports/ に展開した後は、 二つの作業で ports ツリーをアップデートします。 まず、最新の圧縮されたスナップショットを ダウンロード します。 その後、ダウンロードしたスナップショットを用いて ports ツリーを アップデート します。 この二つの作業は、portsnap の一つのコマンドで実行できます。
# portsnap fetch update
Note: 古いバージョンの portsnap ではこの構文は使えません。 失敗した場合は、以下を試してください。
# portsnap fetch # portsnap update
Portsnap サーバにアクセスが集中する “flash crowds” を避けるため、 cron(8) ジョブで portsnap fetch は動かないでしょう。 その代わり、portsnap cron という特別なコマンドがあります。 このコマンドは、3600 秒の間のランダムな時間の後に スナップショットのダウンロードを開始します。
また、cron ジョブで portsnap update
を実行しないでください。 port の構築もしくはインストールと同時に実行してしまうと、
重大な問題を引き起こす原因となるからです。 しかし、-I
フラグをつけて portsnap を実行することで、 ports の INDEX ファイルを安全にアップデートできます。 (cron ジョブで portsnap -I update
を実行した場合は、 あとでツリーをアップデートするために、 portsnap
update を -I
フラグを外して実行する必要があるでしょう。)
以下の行を /etc/crontab に加えると、 portsnap は圧縮されたスナップショットや /usr/ports/ の INDEX ファイルをアップデートします。 もし、インストールした ports の中で古くなったものがあれば、 メールで知らせてくれます。
0 3 * * * root portsnap -I cron update && pkg_version -vIL=
Note: システムの時刻がローカル時間に設定されていない場合は、 Portsnap サーバへの負荷を分散させるため、 上の行の 3 を 0 から 23 の間のランダムな値に置きかえてください。
Note: 古い版の portsnap では、 (cron update のように) 二つのコマンドを並べて使うことはできません。 追加した行がうまくいかなければ、 portsnap -I cron update を portsnap cron && portsnap -I update に置きかえてください。