pkg_* ソフトウェア群の覚書

インストール

NetBSD であれば標準でインストールされている.

最新のpkg_* ソフトウェア群はpkgsrc の pkgtools/pkg_installmake install することでインストールできる.

pkg_add

pkg_add はパッケージのインストールに使われる.pkgsrc でmake install すると裏で自動的に実行されるが,たまにパッケージを手動でインストールすることがある.

# cd /usr/pkgsrc/packages/All
# pkg_add openssh-7.5.1.tgz

manページのEXAMPLESのように,環境変数 PKG_PATH にパッケージが格納されているURLを指定するとパッケージをそこからダウンロードしてインストールしてくれる.

In all cases, pkg_add will try to install binary packages listed in dependencies list.

You can specify a compiled binary package explicitly on the command line.

# pkg_add /usr/pkgsrc/packages/All/tcsh-6.14.00.tgz

If you omit the version number, pkg_add will install the latest version available. With -v, pkg_add emits more messages to terminal.

# pkg_add -v /usr/pkgsrc/packages/All/unzip

You can grab a compiled binary package from remote location by specifying a URL. The base URL can also be provided by the configuration variable, PKG_PATH.

# pkg_add -v ftp://ftp.NetBSD.org/pub/pkgsrc/packages/NetBSD/i386/3.1_2007Q2/All/firefox-2.0 .0.4.tgz

# export PKG_PATH=ftp://ftp.NetBSD.org/pub/pkgsrc/packages/NetBSD/i386/3.1_2007Q2/All # pkg_add -v firefox

/usr/pkg 以外のディレクトリへパッケージをインストールする場合,-P オプションと-p オプション,-K オプションにそれぞれdestdir, prefix, pkg_dbdirを指定する必要がある.

たとえば $HOME/tmp ディレクトリを作り,そこの下にパッケージを試しにインストールする場合

# mkdir $HOME/tmp
# cd $HOME/tmp
# cp /usr/pkgsrc/packages/All/openssh-7.5.1.tgz .
# pkg_add -P $PWD -K ./usr/pkg/db -p ./usr/pkg openssh-7.5.1.tgz

とすると, $HOME/tmp/usr/pkg へOpenSSH のパッケージがインストールされる.destdir とprefix の違いは紛らわしいが, destdir/prefix と覚えるとよい.この例ではdestdir にカレントディレクトリを,prefix に ./usr/pkg を指定したので,パッケージがインストールされたパスは $PWD/usr/pkg つまり $HOME/tmp/usr/pkg となる.また標準では /var/db/pkg データベースを参照してしまうため,-K オプションで独自のデータベースを指定する必要がある.

なお,システムへ変更を加えたくはないが pkg_add のテストだけはしたいという場合,-n オプションを付けると,実際にシステムにインストールはせず実行結果の報告だけをしてくれる.

pkg_admin

pkg_admin は主に脆弱性のあるパッケージを見つけて,更新すべきパッケージを知るために使う.root権限で以下のように実行すると,どのパッケージがどのような脆弱性を抱えているのかがわかる.

# pkg_admin fetch-pkg-vulnerabilities
# pkg_admin audit
Package libxslt-1.1.30 has a insufficiently-random-numbers vulnerability, see https://nvd.nist.gov/vuln/detai
l/CVE-2015-9019
Package git-base-2.14.1nb2 has a command-injection vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-20
17-14867
Package libxml2-2.9.5 has a denial-of-service vulnerability, see https://nvd.nist.gov/vuln/detail/CVE-2017-88
72

今回の場合,libxslt, git-base, libxmlを更新する.

pkg_delete

与えられたパッケージ名をデータベース(-K オプションで指定しなければ /var/db/pkg)から探し,あれば削除する.pkgsrcからインストールしたものの場合,削除したいパッケージまで移動し make deinstall を実行するとよい.

# cd /usr/pkgsrc/www/firefox
# make deinstall

pkg_create

pkg_create はその名の通りパッケージを作る. /usr/pkgsrc/packages/All にあるtarballは pkg_create によるものだ.

pkg_create はパッケージに関する情報を含んだファイルを必要とする.

ファイル名 説明
+BUILD_INFO ビルドした日時,コンパイラの種類とバージョン,コンパイラのフラグ,ライセンスなど様々なビルド環境の情報が記載されているファイル.
+BUILD_VERSION PLIST(パッケージされるソフトウェアの名前やパスの一覧)やパッチファイルなどのバージョンを記録したファイル.
+INSTALL pkg_add が,パッケージの展開前・展開後に実行するスクリプト.
+DEINSTALL pkg_delete が,パッケージの削除前・削除後に実行するスクリプト.
+SIZE_ALL pkg_info が,依存しているパッケージを含めた,パッケージされているファイルの大きさの総合計を調べるためのファイル.
+SIZE_PKG pkg_info が,パッケージされているファイルの大きさの総合計を調べるためのファイル.
+COMMENT パッケージのコメントが書かれたファイル.
+DESC パッケージについての詳しい説明が書かれたファイル.
+CONTENTS パッケージされるファイルの名前とパスの一覧が書かれたファイル.

最低限 +BUILD_INFO, +COMMENT, +DESC, +CONTENTSがあればよい.

NetBSDカーネルをパッケージングする

build.sh でGENERIC カーネルを作り, pkg_create を使ってパッケージにする.環境はNetBSD-7.1/amd64とする.pkgsrc から pkgtools/pkg_install パッケージをインストールする.

はじめにカーネルをビルドする.

# cd /usr/src
# ./build.sh -u -O ../obj -T ../tools -j 2 tools
# ./build.sh -u -O ../obj -T ../tools -j 2 kernel=GENERIC

/usr/obj/sys/arch/amd64/compile/GENERICnetbsd という名のファイル(カーネル)ができている.

次に+BUILD_INFO, +COMMENT, +DESC, +CONTENTS を用意する.

$ mkdir kernel_pack
$ cd kernel_pack
$ cat > ./+BUILD_INFO << EOF
>> OPSYS=NetBSD
>> OS_VERSION=7.1
>> OBJECT_FMT=ELF
>> MACHINE_ARCH=x86_64
>> PKGTOOLS_VERSION=20170419
>> EOF
$ echo "NetBSD kernel package" > ./+COMMENT
$ echo "NetBSD kernel package" > ./+DESC
$ cat > ./+CONTENTS << EOF
>> @name base-netbsd-kernel-7.1
>> @comment Packaged at 2017-09-09 21:00 by uki@localhost
>> @cwd /
>> netbsd
EOF

pkg_create を実行し"base-netbsd-kernel"パッケージを作る.

# pkg_create -v -l -U -B ./+BUILD_INFO -I "/" -c ./+COMMENT -d ./+DESC -f ./+CONTENTS -p /usr/obj/sys/arch/amd64/compile/GENERIC base-netbsd-kernel

これでカレントディレクトリに"base-netbsd-kernel.tgz"が作られた.