sysutils/portsnap
久しぶりの FreeBSD ネタです。
前からちょっと気になっていたのですが、[FreeBSD-Announce] FreeBSD Status Report Jan-Mar 2005 にも登場したのでFreeBSD Portsnap を使ってみました。
最初はこんな感じ。
# cd /usr/ports/sysutils/portsnap # make install clean # cd /usr/local/etc/ # cp portsnap.conf.sample portsnap.conf # rehash # portsnap fetch && portsnap extract
以降はこんな感じ。これだけで ports の CVS ツリーを最新に保つことができるようです。
# portsnap fetch && portsnap update
FreeBSD Portsnap の説明が簡潔すぎて良く分からないのですが、特徴としては以下のように書いてあります(超意訳)。
- CVSup は安全じゃない。プロトコルで暗号化も電子署名も使っていないし、通信を邪魔できる攻撃者であれば更新しているツリーに任意のデータを挿入できてしまう。
- CVSup は エンド−エンド じゃない。上記に関連して、これは CVSup ミラーを汚染できれば、そのミラーを利用しているユーザに任意のデータ供給が可能であることを意味する。
- CVSup は小さな更新を頻繁にするようには設計されていない。CVSup は CVS ツリーの配布には非常に良く、大きな変更がなされたツリー(例えば 1ヶ月以上の間があいた際のツリー)を更新するには非常に効率的である一方、わずかなファイルしか変更されていない場合でもツリーの全てのファイルのリストを送信するため、極めて非効率である。
- CVSup は独自のプロトコルを使用している。これはファイアウォールの背後に居るユーザには問題(外部の 5999/tcp への接続許可が必要)であるし、非常に重いサーバ(cvsupd)が必要となる。
3, 4 に関しては確かにそう思います。時間が掛かるし、ipfw/ipfilter/pf のルールで CVSup のためだけに別途ルールを記述しなければならず、ちょっと後ろめたい*1気がしていました。
portsnap はこれらの問題に対して以下のアプローチで解を提供するそうです(超意訳)。
- プロトコルには HTTP を使用する
- スナップショットには OpenSSL を用いて電子書名を行う
- スナップショットの配布のために、より洗練されたデルタ圧縮(Binary diff)を使用する
そうそう、[FreeBSD-Announce] FreeBSD Status Report Jan-Mar 2005 によると INDEX/INDEX-5/INDEX-6 も提供するそうですので、CVSup 後の portsdb -Fu 相当の作業も不要なのは嬉しいですね。
ただ、現時点では以下の点が気になっています。
- Colin Percival 氏の個人的なプロジェクトみたいなので、安定的にデータが供給されるのか
- CVSup のようなローカルミラーを作れるのだろうか
1. に関しては [FreeBSD-Announce] FreeBSD Status Report Jan-Mar 2005 によると以下のような記述があります(超意訳付 helped by Excite ^^;)。
In early February hardware problems caused both FreeBSD Update and Portsnap to stop functioning for a few days, but those were resolved thanks to a server donated by layeredtech.com. 2月初頭に、FreeBSD Update*2、Portsnap 共に ハードウェア障害のため数日間、 機能を停止しましたが、layeredtech.com によって寄贈されたサーバのおかげで 解決されました。 I intend bring Portsnap into the FreeBSD base system before the end of the month, followed by FreeBSD Update a few months later. 月末までに Portsnap を、その二、三ヶ月後に FreeBSD Update を FreeBSD の ベースシステムに取り込むように試みます。
FreeBSD のベースシステムに取り込まれてくれると安定してデータ供給がなされることになるでしょうから、実運用環境にあるサーバでも CVSup から Portsnap に切り替えてもよいかな、と思います。できればローカルミラーも作れるようにして欲しいですね。
追記:05/04/24
man portsnap すると以下の記述があります。参考までに抜粋 & 意訳です。
TIPS o マシンの時計がローカルタイムなら、次の行を /etc/crontab に登録する ことで ports ツリーの最新のスナップショットを取得し、それを /usr/ports に展開する事ができる良い方法です。 0 3 * * * root /usr/local/sbin/portsnap cron もし時計を UTC にしているのなら、snapshots を提供しているサーバの 負荷が集中しないように、午前 3時以外のランダムな時間を選択して下さい。 o 多数のマシンを最新の状態に保つために portsnap を使用したければ、 キャッシュ用 HTTP プロキシをセットアップすると良いでしょう。portsnap は 更新データのダウンロードに fetch(1) を使用していますので、HTTP_PROXY 環境変数を設定することで指定されたプロキシから更新データを取得する ように指示することができます。大部分のファイルは大半のクライアントに とっては不要なので、この方法は portsnap サーバのファイルをミラーリング するよりも非常に効率的です。
これが前述の『CVSup のようなローカルミラーを作れるのだろうか』に対する回答なんですね、きっと。
ただ、キャッシュ用の HTTP プロキシを公開ネット上に置くのはどうかなぁ、と思います。いつものように pf でパケットフィルタした上で ACL をきっちり設定した squid を構築すれば良いのでしょうが...