ports管理

FreeBSDでportsを利用するときによく使用するコマンド。

portsツリーの更新

# portsnap fetch && portsnap update && portsdb -uU
または
# portsnap fetch update && portsdb -uU
なお、初めてportsnapを使うときはportsツリーの展開が必要なのでfetchとupdateの間にextractを挟む。
# portsnap fetch && portsnap extract && portsnap update && portsdb -F
または
# portsnap fetch extract update && portsdb -F

理由はよく知らないが、portsの更新時にパッチファイルの全てがSkippingになることがある。その大量Skipの後にfetchされないなら良いことではない筈なので対処する。基本的にはportsツリーとportsnapのデータを消して再作成。
通常は実行せず、大量のSkippingが出てその後にfetchされないようになったときだけ実行。

# rm -fr /usr/ports
# rm -fr /var/db/portsnap
# mkdir /usr/ports
# mkdir /var/db/portsnap
# portsnap fetch extract

インストール済みportsの更新必要性確認

# portversion -vf | grep "<"

portupgradeでワイルドカードを使う場合

# portupgrade php5-\*   (php5-から始まる名前のportsを更新)
前は普通にワイルドカード使えた気がするけど今は"\" (日本語環境なら"¥")をアスタリスクの前に入れないとダメみたい。

portupgradeでインストール済portsのメジャーバージョンを上げる(下げる)場合

例えばApacheの2.2系を使っていて2.4系に上げたいと思っても普通にオプション無しでportupgradeをかけると当然2.2系の最新版にしかならない。そこで-oオプションで変更後/変更前の両オリジンを指定。(またはバージョンではなく置き場所が変わった、例えばdevel/exampleだったのがwww/exampleに変わったとか。)
更新したportsが他のportsに依存されるものであればそれらも再作成が必要なので強制アップデートを行う。
# portupgrade -o www/apache24 -r www/apache22  (切り替えたいバージョンのオリジンが先、現行バージョンが後)
# portupgrade -fr apache24  (-fで強制アップデート, -rでapache24に依存するportsを指定)

オリジン指定の際は新が先、旧が後、間違いやすいので注意。
2行目はApache2.4に依存するパッケージを再構築。

たとえばMySQL Serverを5.5から5.6に変更したいという場合

# portupgrade -o databases/mysql56-client -r databases/mysql55-client
# portupgrade -o databases/mysql56-server -r databases/mysql55-server

依存の関係でmysql55-clientを先に更新しなければmysql55-serverは更新できない。普通に考えると逆かと思うけどこの順序。

Portsツリー側で何か調整した結果、旧オリジンが消えた、ports名が変わった、移動になった、オリジン自体は変わってない筈なのにバージョンの付け方が変わったなどでオリジン変り同様の状態などの場合は、旧側はインストール済みのports名を直指定する。

# portupgrade -o devel/libevent -r libevent2-2.1.6

(先のApacheの時と同様に)オリジン変更の更新後はそのportsに依存するportsを(念のために)作り直す。
上のMySQLやlibeventの例だとこんなの。

# portupgrade -fr mysql56-client mysql56-server
# portupgrade -fr libevent

pkgを使う場合

FreeBSD10だと標準で使えるようになったpkg(新)ですが、簡単なのが良いですね。

pkg update最新リポジトリカタログを取得。
pkg search ○○目的のパッケージを探す
pkg install ○○パッケージをインストール
pkg versionインストール済パッケージの更新必要性確認付き一覧表示
pkg upgrade ○○パッケージを更新
pkg auditセキュリティ上の問題が指摘されているパッケージを表示

portsでのインストールとの共存でもそれほど問題を起こさないみたい。
portsでインストールした後にpkg versionで見るとportsでインストールしたものがパッケージリストに入っている。
パッチを当てたいとか依存関係の問題でパッケージでは入れたくない場合はportsでインストールすることになるが、そのportsでインストールしたものをpkgで更新されてしまわないようにする場合は
pkg lock ○○

portsで入れたものと同じ名前のパッケージの依存関係がその後のパッケージ更新で適用される場合があるので注意。
サーバ用のアプリケーションだと、パッケージが古いバージョンのアプリケーションに依存するようになってたりするのでデタラメに何でもOKしてインストールすると新旧入り混じって収拾がつかなくなるので自分でportsからコンパイルする方が良い場合もあるかも。

pkgでインストール済パッケージのメジャーバージョンを上げる(下げる)場合

例えばApacheの2.2系を使っていて2.4系に上げたいみたいな場合。または、バージョンではなく置き場所が変わった、例えばdevel/exampleだったのがwww/exampleに変わったとか。

# pkg set -o www/apache22:www/apache24 (旧オリジンが先、新オリジンが後 portsの場合とは逆)
# pkg install -Rf www/apache24

旧オリジンと新オリジンの間にコロン : を挟むというのも忘れやすいので気をつける。
2行目は依存関係を直すためにApache2.4に依存するパッケージを再インストールしている。(Apache 2.4に依存したパッケージはそんなにないかもしれないが)

その他

portsdbコマンドでエラーが起きる場合。portupgradeが使用するrubyパッケージが複数バージョン混在することが原因の可能性。不要なバージョンのrubyパッケージを削除。

portsのインデックスを盛大にぶっ壊した場合。
/usr/ports/にあるINDEX-*を削除してmake indexを実行。または最初の方で紹介したportsツリーとportsnapのデータを削除して再作成。(後者がオススメ)