rpm
と pkg
のコマンド対応▼FreeBSD 10.x 以降では
バイナリパッケージの導入用に pkg(8)
(旧 pkgng) が
標準装備されましたが、
Handbook
ではまだ記載が淡泊だったりで、イマイチ使い方がわかんなかったりします。
(2014.11)
$Id$
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 -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は、
コンパイル→*.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) 利用者が
増えてくれば 少しづつ変わっていくかもしれませんが。