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)
からインストールします。
はじめに必要なディレクトリを作成します。
# mkdir -p /home/sysbuild/release/$(uname -m)/binary/sets
NetBSDのFTPサーバあるいはFTPミラーからNetBSDのリリースバイナリbase.tgz・comp.tgz・etc.tgz・xcomp.tgzの4つすべてを/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/xcomp.tgz
# ftp ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-8.0/$(uname -m)/binary/sets/etc.tgz
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)
のauto
コマンドで/var/pkg_comp/list.txtに書かれているパッケージすべてをビルドします。このコマンドは以下の5つのコマンドを自動的に実行します。
pkg_comp -c /var/pkg_comp/pkg_comp.conf fetch
pkg_comp -c /var/pkg_comp/pkg_comp.conf sandbox-create
pkg_comp -c /var/pkg_comp/pkg_comp.conf bootstrap
pkg_comp -c /var/pkg_comp/pkg_comp.conf build $AUTO_PACKAGES
pkg_comp -c /var/pkg_comp/pkg_comp.conf sandbox-destroy
ビルドされたパッケージは/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)
のupgrade
コマンドを実行します。
# pkgin upgrade -y
pkg_comp(8)
を使ったパッケージの更新を紹介しました。pkgsrc(7)
の最新リリースから少し時間が経ってから新しいバイナリパッケージがFTPサーバにアップロードされるので、リリースからすぐパッケージを更新したければ手元のマシンでビルドするのがもっとも速いでしょう。任意のビルドオプションを付けてビルドを実行できるのも利点のひとつです。