rpmpkg のコマンド対応▼

FreeBSD 10.x 以降では バイナリパッケージの導入用に pkg(8) (旧 pkgng) が 標準装備されましたが、 Handbook ではまだ記載が淡泊だったりで、イマイチ使い方がわかんなかったりします。 (2014.11)

$Id$


pkgの使い始め

pkgは、OS導入直後は初期化用のスタブだけで、 インストールはされていません。

# pkg -N
pkg: pkg is not installed
# pkg info
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]: n

# _

普通は /etc/pkg/FreeBSD.conf に書かれている pkg+http://pkg.FreeBSD.org/ からダウンロード・初期化するんでしょうけど、 DVD メディア上に pkg-1.2.4_1.txz がすでにあるので、 そっちを使って初期化したい。

とりあえず /media/cdrom あたりにマウントして、やってみる。

# mkdir /media/cdrom
# mount -t cd9660 -o ro,nosuid /dev/cd0 /media/cdrom

# pkg add /media/cdrom/packages/freebsd:10:x86:64/All/pkg-1.2.4_1.txz
Signature for pkg not available.
# _

うーん。
DVDの /packages/repos/FreeBSD_install_cdrom.confには

FreeBSD_install_cdrom: {
  url: "file:///dist/packages/${ABI}",
  mirror_type: "none",
  enabled: yes
}
とあるので、/dist からアクセスできないと使ってくれないっぽい。

このへんの、メディアから pkg(8) を初期化する方法は Release notes なんかには書いてなくて、 FreeBSD 10.1-BETA1のアナウンス に こそっと書き足されていたりします。

趣味ですが、なんとなく /dist に実マウントしたくないので、 シンボリックリンクにします。

# ls -l /dist
lrwxr-xr-x  1 root  wheel  14 Nov 28 16:09 /dist -> media/cdrom

# env REPOS_DIR=/dist/packages/repos \
	pkg add /dist/packages/freebsd:10:x86:64/All/pkg-1.2.4_1.txz
Installing pkg-1.2.4_1... done
If you are upgrading from the old package format, first run:

  # pkg2ng

# _

あ、うまくいった。
















rpm と pkg のコマンド対応
rpm pkg
導入済パッケージの一覧 rpm -q -a pkg query -a %n-%v
導入済パッケージの一覧
(一行説明つき)
rpm -q -a --qf '%{N}-%{V}\t%{SUMMARY}\n' pkg info -a
導入済パッケージの ファイル一覧 rpm -q -l package pkg info -l package
pkg query '%Fp' package
現存するファイルが どのパッケージに属しているか rpm -q -f file pkg which file
導入済パッケージの 諸情報 rpm -q -i package pkg info -f package
パッケージファイルの中の ファイル一覧 rpm -q -l -p package.rpm pkg info -l -F package.txz
pkg query -F package.txz %Fp
DVDメディア上の パッケージ一覧 yum --disablerepo='*' --enablerepo=c6-media list available pkg -R /dist/packages/repos update; pkg -R /dist/packages/repos search .
DVDメディア上の パッケージの導入 yum --disablerepo='*' --enablerepo=c6-media install package pkg -R /dist/packages/repos install package
導入時のスクリプトを見る rpm -q --scripts package
rpm -q --triggerscripts package
正規の方法なし
pkg info -R package の YAML出力の "scripts": を見る。
設定ファイル扱いの ファイル一覧 rpm -q --configfiles package 方法なし
そのパッケージファイルの作成時のオプション表示 方法なし pkg info -R -F package.txz の "options":
データベースの場所 /var/lib/rpm/
/var/cache/yum/
/var/db/pkg/
隔離環境でのビルド mock poudriere

RPMは、使う側の rpm, yumコマンドと、 作る側の rpmbuild, createrepo コマンドが分離していますが、 pkg は /usr/ports/ から派生しているせいか、 使う側と作る側のコマンドが入り混じっています。 作る側のコマンドを意図的に無視していかないと混乱します。

rpm -q --scripts に対応する情報は、pkg では MANIFEST に格納されているのですが、 pkg info -R package で YAMLで取り出すところまではいけるのに、 YAMLを食って属性を1つだけ表示する、ためのツールが標準では用意されてない。 pkg(8)は libyaml は自分で抱え込んでいる (libpkg.soに潜り込んでいる) 模様。 pkg shellから sqliteで掘り出す、という手もありそうですが。


RPMとportsの作業工程の違い

RPMは、

コンパイル→*.rpm パッケージ作成→パッケージをインストールしてみる→動作テスト
という工程を想定していますが、 /usr/ports
コンパイル→インストール→動作テスト→*.txz パッケージ作成
という順番になります。ので、いったんインストールしないとパッケージ作成ができない。 元々、自機にインストールするまでを前提としたビルドシステムで、 パッケージ作成は後付のオマケ、だった経緯もあるでしょう。


アップデートに対する考え方の違い

RPM (というか Red Hat Enterprise Linux) では、 アップデート・アップグレードでの変化は最小限になるよう、 リリース時からのバージョン番号固定して、 バグ類はバックポートで対応しています。 設定ファイルの変更は極力避ける。 データベース類のアップグレード時は、--scripts でいったん退避してから再注入、 などが あらかじめ SPEC ファイルに仕込まれていたりします。 どうしても手動変更が必要な場合は、 *.rpmnew ファイルを生成して、後で手動マージ、になります。 このマージ作業について知らないと、「Linuxのほうがアップグレードは楽だ」と 勘違いします。

FreeBSDのアップグレードはベースシステムと ports に分かれています。

ベースシステムは freebsd-update(8) が、 設定ファイルのマージ作業も面倒見てくれるので、RHELと同等か、 むしろ楽なくらいでしょう。

ports は、/usr/ports/ が単一ツリーしかない (9.x用、10.x用、11.x用と分かれていない)ので、 Makefileで吸収できない互換性はわりとあっさり見捨てられたりします。 アプリケーションのアップグレード時に必要な移行操作についても、 「/usr/ports/UPDATING を見れ」で済ませているので、 portsの追っかけは実は結構大変だったりもします。
この辺の投げっぱなし加減は、バイナリパッケージの pkg(8) 利用者が 増えてくれば 少しづつ変わっていくかもしれませんが。


kabe.sra-tohoku.co.jp