portmaster (1)

portsのアップデートツールで、/var/db/pkgに納められた既存のportsの基盤を使っているので外部データベースに依存しない。これは、自分でportmasterを使わず、直接 /usr/ports で作業しても外部データベースの修正が必要ないことを意味する。

パッケージをインストールするには、-pオプションを付けて /usr/ports 以下のディレクトリ名を指定する。たとえば GNU Screen の場合には

 portmaster -p sysutils/screen

とすればOK。

インストールされている ports の一覧と、それぞれの ports の新しいバージョンを表示させるには -L オプションを使う

fbsd# portmaster -L
===>>> Root ports (No dependencies, not depended on)
===>>> drac-1.12_8
===>>> ja-jvim-3.0.j2.1a_4
===>>> ja-less+iso-382.262
===>>> libtool-1.5.26
===>>> portconf-1.4
===>>> portmaster-2.6
        ===>>> New version available: portmaster-2.7

デフォルトでは、指定したportsのアップグレードを行う。デフォルトでは、ビルドの前後に'make clean'を行うので、コンパイル済みかどうかに関わらずコンパイルする。そのためゴミが残ることがない*1。裏を返すと -C オプション*2と -K オプション*3をつけるとコンパイル済みで up to dateなら実質的には、何も行われない。

ちなみに -r オプションは、-p オプションで指定した ports 依存している ports もアップデートする。-p オプションで指定した ports 依存している ports ではないので注意。つまり、-r オプションはDRAC のような *.a ライブラリを提供する ports脆弱性が見つかったので upgrade したい、という場合に使う。gettextの場合でも同様。他にも courier-authlib-base のような依存ツリーの上部にあるようなパッケージのupdateにも使えるはず。

こいつのミソは、アップグレード時に自動的にバックアップパッケージを作ってくれること。つまり新しいバージョンを入れたら壊れたから古いバージョンに戻したい、という状況にも対応できる。このバックアップパッケージは、/usr/ports/packages/portmaster-backup/ に作られる。いざというときに使える...はず。

手元のサイトの設定ファイルは以下の通り。

# -b
BACKUP=yes
# --force-config
FORCE_CONFIG=yes
# don't delete dist-files
DONT_SCRUB_DISTFILES=yes

ちなみに、オプション -u (UNATTENDED) はマニュアルによれば、付けない方がよい。これは make config したときの設定においてデフォルトのものをそのまま使うよう指示を出すオプションになる。大抵の環境ではこのオプションは必要ではなく、意図せぬ結果をもたらすことがある。もし portmaster で問題があったら、まずこのオプションを外せ、となってるほど。

参考: man portmaster(8)

*1:ディスク容量とi-nodeのちょっとばかしの節約?

*2:ビルド前の'make clean'を抑止

*3:ビルド後の'make clean'を抑止