FreeBSD pkg (pkgng)でのカスタマイズ環境アップグレード


FreeBSD 10から標準になったパッケージ管理システムのpkg(旧称pkgng)ですが、何しろ新しい機能でどのように使いこなせばいいのかわかりません。pkgだけで全て済むのであればいいのですが、カスタマイズしてportsをコンパイルした場合との共存はまだそれほどうまくいっていないように感じます。

とりあえず以前構築に関して紹介した本サーバのpkgをアップグレードしようと思ったのですが、次のような問題があります。

  • ja-wordpressはWordpress自体のアップグレード機能を使うので、pkgから管理する必要はない。
  • apache22は標準のprefork MPMではなくてworker MPMを使っているが、mod_php5のpkgの依存性はprefork MPMのpkgに向いている。そのためこれをpkgで更新しようとすると、新規にapache22のprefork MPMなpkgをインストールしようとしてしまい、衝突する。
  • worker MPMでmod_phpを利用するにはphpをZTSでスレッドセーフにビルドしなければならないが、標準のpkgはそうではない。
  • ja-wordpressのpkgの依存性は、上記の標準php5なpkgに向いている。
  • 以上のような事情で、php5およびphp5-extension系とja-wordpressはportsからインストールした。

なので、そのままpkg upgradeすると、悲惨なことになってしまうのです。もう少しpkgさんには頑張って欲しいところです。

とりあえず、次のような方針でこの状況に対処することにしました。

  • portsから入れたものはportsで、pkgから入れたものはpkgで面倒を見よう

色々試してみたところ、pkg lockの機能を使うことで、インストール済みのpkgをpkg upgradeの対象から除外することができるようです。そこで、portsから入れたもののアップグレードのために、従来のportupgradeをインストールします。

そして、portsのツリーを更新します。

インストール済みのpkgのうち、手動でインストールしたphp周りの色々とja-wordpressに対応するglobを探します。どうも「\*php\*」と「ja-wordpress」で良さそうです。

これらのpkgをlockしてupgrade対象から外します。面倒なら-yオプションをつけるといちいち[y/N]を聞いてきませんが、一応念を入れて確認します。

この状態でpkg upgradeすることで、mod_php5がapache22のprefork MPMをインストールしようとしてworker MPMと喧嘩したり、php5がZTSなしでインストールされたりすることを防ぐことが可能です。

ここまでくれば残りをportupgradeをするだけに思えるのですが、lockしたpkgはportupgradeすることができません。そのため、全てのpkgをunlockする必要があります。unlockなので-yをつけて一気にやってしまっても構わないでしょう。

あとは、ja-wordpressを除く、ports経由でインストールしたpkgをportupgradeで更新します(習慣で-Rなどを付けないようにしましょう)。

これでpkgのアップグレードは終了です。ja-wordpressは先述の通り、WordPress自体の機能で既に最新版に更新しているので、pkgが面倒を見る必要はありません。

(正確に言うとpkgのスナップショットとportsの最新状態とはバージョンが微妙に異なるので、その辺りで齟齬が起きる可能性はありますが、pkgによる更新→portupgradeによる更新の順に行えばそれほど大きな問題になることはないと思います)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です