NetBSD pkgsrc を使う

5 min read読了の目安(約4900字

pkgsrc とはなんぞや

pkgsrc

pkgsrc is a framework for managing third-party software on UNIX-like systems, currently containing over 17,800 packages. It is the default package manager of NetBSD and SmartOS, and can be used to enable freely available software to be built easily on a large number of other UNIX-like platforms.

pkgsrc は NetBSD で標準で使われているパッケージマネージャーです。

なお NetBSD 以外の OS でも使えます。 20 年近く前ですが Plamo Linux で使ったり、 Mac OS X で使ったことはあります。 ここでは NetBSD で使うことを前提とします。

pkgsrc は四半期ごとにリリースされていて 2020Q4 や 2021Q1 といったタイミングでリリースされます。 安定を求める場合はこれらのリリースを使えばよいかと。

もちろん current もあります。人柱になりたい場合は current を使います。

pkgsrc でパッケージをインストールする

pkgsrc - install source packages の手順に従います。

current と stable へのリンクが書かれてますが、ここでは stable を使うことにします。 stable は四半期ごとにリリースされた最新のものと同じです。 現在であれば 2021Q1 と同じです。

ダウンロードして展開します。

% curl -O https://cdn.netbsd.org/pub/pkgsrc/stable/pkgsrc.tar.xz
% tar xJf pkgsrc.tar.xz -C /usr

たとえば vim をインストールする場合はこのようにします。 make するだけです。

% cd /usr/pkgsrc/editors/vim
% make install clean clean-depends

パッケージを全部アップグレードする

たとえば 2021Q2 がリリースされたのでアップデートしたいという場合は 2021Q2 の stable をダウンロードして /usr/pkgsrc に展開して pkg_rolling-replace を実行します。 既存の /usr/pkgsrc は rm するなり mv するなりしておくこと。

% rm -rf /usr/pkgsrc

# ダウンロードして展開する。作業は省略。

% cd /usr/pkgsrc
% pkg_rolling-replace -rsuv

参考

how to upgrade packages

obache

@miwarin pkg_admin rebuild=YES pkg1 pkg2... したのち、pkgtools/pkg_rolling-replace 入れて、pkg_rolling-replace すれば放置可能。

よく使うオプション

pkgsrc のオプションは /etc/mk.conf に書きます。 たとえば手元で使っている NetBSD の /etc/mk.conf はこんな感じです。

ACCEPTABLE_LICENSES+=postfix-license
ACCEPTABLE_LICENSES+=vim-license
ACCEPTABLE_LICENSES+=gnu-agpl-v3
X11_TYPE=modular           # システムのX11(/usr/X11R6, /usr/openwin, ...)を使わない場合。/usr/pkgsrc/x11/modular-xorg-server が使われるようになる。らしい
PKG_OPTIONS.ImageMagick=-x11 -jasper
PKG_OPTIONS.scmgit=-scmgit-gui
ALLOW_VULNERABLE_PACKAGES=1
PKG_OPTIONS.emacs=-dbus -gtk -svg -x11 -xft2 -xaw -motif -nextstep

デバッグ的な何か

pkgsrc の中身を見れば分かりますが pkgsrc は Makefile の塊です。 ただし、 GNU make ではなく BSD make です。 なので、 オプションなどは BSD make の作法に従います。

pkgsrc で作業しているときに変数の値を表示する場合などは以下のようにします。

変数の値を確認する

% make -V WRKSRC
${WRKDIR}/${DISTNAME}

すべての変数の値を確認する

% make show-all

変数にはこういうものがある ( pkgsrc/mk/misc/show.mk より )

# show-all:
#	Prints a list of (hopefully) all pkgsrc variables that are visible
#	to the user or the package developer. It is intended to give
#	interested parties a better insight into the inner workings of
#	pkgsrc. Each variable name is prefixed with a "category":
#
#		* "usr" for user-settable variables,
#		* "pkg" for package-settable variables,
#		* "sys" for system-defined variables.

SSL ルート証明書をインストールする

パッケージの中には SSL ルート証明書がインストールされていることを前提としたものがあります。 SSL ルート証明書は NetBSD に用意されていないのでパッケージでインストールします(※)。

mozilla-rootcerts の SSL ルート証明書をインストールします。

% cd /usr/pkgsrc/security/mozilla-rootcerts
% make install clean clean-depends
% mozilla-rootcerts install

ここに入ります。

/etc/ssl/certs/ca-certificates.crt

※ NetBSD として SSL ルート証明書を準備しておけばよかろう、というツッコミがあると思いますが、歴史的経緯により決定されていないようです。 ref. system default root certificates?

作業中のエラー

pkg_rolling-replace -rsuv でエラーになった場合

データベースの不整合が起きるとエラーが発生します。 たとえばこう

===> Updating using binary package of vim-share-8.2.1709
/usr/bin/env  /usr/sbin/pkg_add -K /var/db/pkg -U -D /usr/pkgsrc/editors/vim-share/work/.packages/vim-share-8.2.1709.tgz
pkg_add: Can't open +CONTENTS of depending package vim-8.0.1379
pkg_add: 1 package addition failed
*** Error code 1

/usr/pkgsrc で pkg_admin rebuild したり

% pkg_admin rebuild=YES vim-share-8.2.1709

pkg_admin rebuild-tree などして地道に解決していきます。

% pkg_admin rebuild-tree

git で SSL エラーになる場合

pkgsrc というか git の使い方です。

たとえばこんなエラーが起きるとします。

% git clone https://github.com/motemen/go-cli 
Cloning into 'go-cli'...
fatal: unable to access 'https://github.com/motemen/go-cli/': SSL certificate problem: unable to get local issuer certificate

SSL ルート証明書をインストールして ~/.gitconfig に書きます。

[http]
sslCAinfo = /etc/ssl/certs/ca-certificates.crt

暫定回避する場合はこのようにします。

% git config --global http.sslVerify false

different version xxxx already installed と言われる場合

なにかのパッケージを make install している途中で

different version xxxx already installed

などと言われたら pkg_tarup をインストールして、

% cd /usr/pkgsrc/pkgtools/pkg_tarup/
% make install clean clean-depends

怒られたパッケージのディレクトリへ移動し make replace を実行します。

% cd /usr/pkgsrc/どこかの/パッケージ
% make replace

その後 元々インストールしようとしていたパッケージへ戻り make install します。