pkg_comp(8)による安全なpkgsrc(7)パッケージの更新


NetBSDではThird-partyソフトウェアのインストールにpkgsrc(7)を使います。しかし'このシステムを使うにあたっては、ソフトウェアをインストールするよりもむしろインストールされたソフトウェアをどう更新していくかが大きな問題となります。なぜなら、ひとつのパッケージには複数のパッケージが依存しているのが普通であり、ソフトウェアをインストールすればするほどビルドが複雑になるからです。ユーザからすれば使いたいソフトウェアに依存したパッケージについて意識を向ける機会はほとんどありません。

一般にpkgsrc(7)のパッケージを更新するにはmake updateを使うとよく言われます。しかしこのやり方は危険な面があります。make updateは一旦インストールされているパッケージをアンインストールしてからパッケージをビルドしインストールします。もしパッケージのビルドに失敗してしまうと、本来動いていたソフトウェアが削除され環境の現状復帰が難しくなります。

そこでchroot(8)を基にしたサンドボックス(sandbox)環境を利用するパッケージの更新方法を紹介します。本文書の内容はJulio Merino『Keeping NetBSD up-to-date with pkg_comp 2.0』とほぼ同一ですが一部追加している箇所もあります。

目標

更新したいすべてのパッケージをpkg_comp(8)を使いビルドし、pkgin(1)からパッケージをアップデートできるようにします。

必要なパッケージのインストール

以下のパッケージをpkgsrc(7)からインストールします。

準備

サンドボックス用のNetBSDバイナリをダウンロードする

はじめに必要なディレクトリを作成します。

# mkdir -p /home/sysbuild/release/$(uname -m)/binary/sets

NetBSDのFTPサーバあるいはFTPミラーからNetBSDのリリースバイナリbase.tgz・comp.tgz・etc.tgz3つすべてを/home/sysbuild/release/amd64/binary/setsディレクトリにダウンロードします。バージョンは自身が動かしているNetBSDのバージョンと合わせてください。

# cd /home/sysbuild/release/$(uname -m)/binary/sets
# ftp ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-8.0/$(uname -m)/binary/sets/base.tgz
# ftp ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-8.0/$(uname -m)/binary/sets/comp.tgz
# ftp ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-8.0/$(uname -m)/binary/sets/etc.tgz

pkg_compの設定ファイルを編集する

pkg_comp(8)の設定ファイル/var/pkg_comp/pkg_comp.confを編集します。たとえば以下のようになるでしょう。

# $NetBSD: pkg_comp.conf,v 1.1 2017/02/17 21:27:38 jmmv Exp $

# pkg_comp.conf(5) configuration file for unattended pkgsrc builds.

# Remote VCS configuration.
FETCH_VCS=cvs
CVS_ROOT=:ext:anoncvs@anoncvs.NetBSD.org:/cvsroot
CVS_TAG=pkgsrc-2018Q4
#GIT_URL=https://github.com/jsonn/pkgsrc.git
#GIT_BRANCH=trunk

# Host file layout.
PKGSRCDIR="/usr/pkgsrc"
DISTDIR="/var/pkg_comp/distfiles"
PACKAGES="/var/pkg_comp/packages"
PBULK_PACKAGES="/var/pkg_comp/pbulk-packages"
EXTRA_MKCONF="/var/pkg_comp/extra.mk.conf"
SANDBOX_CONFFILE="/var/pkg_comp/sandbox.conf"

# Target file layout.
LOCALBASE="/usr/pkg"
PKG_DBDIR="/var/db/pkg"
SYSCONFDIR="${LOCALBASE}/etc"
VARBASE="/var"

# List of packages to build during automatic execution.  We source these
# from a separate file for simplicity, as maintaining a long list of
# package names in a shell variable can be cumbersome.
AUTO_PACKAGES="$(grep -v '^#' '/var/pkg_comp/list.txt')"

インストールされているパッケージを確認する

pkg_chk(8)-gオプションを使い、インストールされているパッケージの一覧を/usr/pkgsrc/pkgchk.confに書き出します。

# pkg_chk -g

pkgchk.confを/var/pkg_comp/list.txtにコピーします。

# cp /usr/pkgsrc/pkgchk.conf /var/pkg_comp/list.txt

pkg_comp(8)でパッケージをビルドする

pkg_comp(8)autoコマンドで/var/pkg_comp/list.txtに書かれているパッケージすべてをビルドします。このコマンドは以下の5つのコマンドを自動的に実行します。

  1. pkg_comp -c /var/pkg_comp/pkg_comp.conf fetch
  2. pkg_comp -c /var/pkg_comp/pkg_comp.conf sandbox-create
  3. pkg_comp -c /var/pkg_comp/pkg_comp.conf bootstrap
  4. pkg_comp -c /var/pkg_comp/pkg_comp.conf build $AUTO_PACKAGES
  5. pkg_comp -c /var/pkg_comp/pkg_comp.conf sandbox-destroy

pkgin(1)リポジトリに登録する

ビルドされたパッケージは/var/pkg_comp/packages/Allに配置されます。このパスを/usr/pkg/etc/pkgin/repositories.confに書きます。

# echo 'file:///var/pkg_comp/packages/All' >> /etc/pkgin/repositories.conf
# pkgin update

pkgin(1)でパッケージをアップデートする

pkgin(1)upgradeコマンドを実行します。

# pkgin upgrade -y

おわりに

pkg_comp(8)を使ったパッケージの更新を紹介しました。pkgsrc(7)の最新リリースから少し時間が経ってから新しいバイナリパッケージがFTPサーバにアップロードされるので、リリースからすぐパッケージを更新したければ手元のマシンでビルドするのがもっとも速いでしょう。任意のビルドオプションを付けてビルドを実行できるのも利点のひとつです。