FreeBSD: ports メンテナンスに pkgng を使う

8月後半頃から、portupgrade コマンドによるメンテナンスが不調で ports ディレクトリのメンテナンス(深夜にcronで実施)は出来るものの、アップデート対象になっているパッケージを一覧表示しようと、「portversion -vL=」コマンドを発行すると対象が無表示だったり、portupgrade コマンドがエラーが表示されたりでメンテナンスできなくなっていました。

恐らく ports サーバーの仕様変更によるものだろうと思っていましたが、ここ1ヶ月くらい忙しくしていたり、サーバーが高負荷だったりで、インストール済みパッケージのメンテナンスを行う余裕がない状況が続き現象確認と問題解決ができず問題を抱えたまま放置状態でした。ようやくサーバー負荷が下がったため、本日、時間を設けて ports とパッケージのメンテナンスを行う事にしました。

# portversion -vL=
[Reading data from pkg(8) ... - 3 packages found - done]
[Updating the portsdb <format:bdb_btree> in /usr/ports ... - 24092 port entries found .........1000.........2000.........3000.........4000.........5000.........6000.........7000.........8000.........9000.........10000.........11000.........12000.........13000.........14000.........15000.........16000.........17000.........18000.........19000.........20000.........21000.........22000.........23000.........24000 ..... done]
# pkg_version -v
adns-1.4_1                          =   up-to-date with port
apache22-2.2.27_6                   <   needs updating (port has 2.2.29)
apr-1.5.1.1.5.3_4                   =   up-to-date with port
autoconf-2.69                       =   up-to-date with port
autoconf-wrapper-20131203           =   up-to-date with port
autoconf213-2.13.000227_6           =   up-to-date with port
automake-1.14                       =   up-to-date with port
automake-wrapper-20131203           =   up-to-date with port
automake14-1.4.6_6                  =   up-to-date with port

対象パッケージはたくさんあるものの、 portversion コマンドでは表示されないばかりか、portupgrade コマンドで自動アップデートを掛けようとしても、パッケージを検出できないためか反応無し。

# portupgrade -a
[Reading data from pkg(8) ... - 3 packages found - done]
#

個別に行おうとすると、今度はエラーになって結局パッケージ更新が出来ません。

# portupgrade wget-1.15_1
/usr/local/sbin/pkg-static: not found
/usr/local/sbin/pkg-static: not found
--->  Upgrading 'wget-1.15_1' to 'wget-1.15_2' (ftp/wget)
--->  Building '/usr/ports/ftp/wget'
/usr/local/sbin/pkg-static: not found
/usr/local/sbin/pkg-static: not found
/usr/local/sbin/pkg-static: not found
===>  Cleaning for wget-1.15_2
/usr/local/sbin/pkg-static: not found
/usr/local/sbin/pkg-static: not found
===>  License GPLv3 accepted by the user
===>   wget-1.15_2 depends on file: /usr/local/sbin/pkg - not found
===>    Verifying install for /usr/local/sbin/pkg in /usr/ports/ports-mgmt/pkg
You are about to convert your system to pkg while you have ports/packages
installed with the old pkg_install tools.

To switch to pkg:
    1) Install ports-mgmt/pkg
    2) Convert your package database by running pkg2ng

*** [pre-everything] Error code 1

Stop in /usr/ports/ports-mgmt/pkg.
*** [pkg-depends] Error code 1

Stop in /usr/ports/ftp/wget.
** Command failed [exit code 1]: /usr/bin/script -qa /tmp/portupgrade20140924-1361-tuotua env UPGRADE_TOOL=portupgrade UPGRADE_PORT=wget-1.15_1 UPGRADE_PORT_VER=1.15_1 make
** Fix the problem and try again.
** Listing the failed packages (-:ignored / *:skipped / !:failed)
        ! ftp/wget (wget-1.15_1)        (unknown build error)

これが、以前から予告されていた ports メンテナンスの仕組み変更によるもの?

過去、パッケージメンテナンス中に毎回表示されていたメンテナンス方針変更ワーニングメッセージを表示させる方法が分からないため、今、確認する事が出来ませんが、パッケージ管理を pkgng に移行しなければならない時期に来ているのかな~と検索してみると次のURLを発見しました。確かこんな感じのURLだったような~。

http://www.freebsd.org/doc/ja_JP.eucJP/books/handbook/ports.html

これを読む限り、無理に pkgng に変更しなくても良いような気がするのですが、FreeBSDハンドブックはすでに pkgng によるメンテナンスしか紹介していないため、管理している FreeBSD の一台を pkg で管理するようにコンバートして動作確認した後のこりのサーバーにも展開したいと思います。

http://www.freebsd.org/doc/ja_JP.eucJP/books/handbook/pkgng-intro.html

まず、 pkg2ng コマンドで管理データベースを変換する。(一度変換してしまうと、戻せない。)

# pkg2ng
Converting packages from /var/db/pkg
Converting libiconv-1.14_3...
Converting libpaper-1.1.24.3...
Converting xcb-util-renderutil-0.3.9...
Converting mime-support-3.56...
Converting ruby-1.9.3.547_1,1...
pkg: lstat(/usr/local/share/ri/1.9/site/): No such file or directory
pkg: lstat(/usr/local/lib/ruby/vendor_ruby/1.9/i386-freebsd8/): No such file or directory
pkg: lstat(/usr/local/lib/ruby/vendor_ruby/1.9/): No such file or directory
pkg: lstat(/usr/local/lib/ruby/vendor_ruby/): No such file or directory
略
Converting php5-pdo_mysql-5.4.32...
Converting libXfont-1.4.8,2...
Converting p5-Package-Stash-0.36...
Converting ja-nkf-2.1.3,1...
Converting boehm-gc-7.4.2_1...
Converting openldap-client-2.4.39_1...
Converting libatomic_ops-7.4.0_1...
Converting phpMyAdmin-4.2.7.1...
Checking all packages: 100% this will take a while... Checking all packages: 0%
done
#

1GHzのマシンで約20分掛かって変換が終了。

このあとで、 /etc/make.conf に一行追加。

WITH_PKGNG=yes

ハンドブックの説明に従って(特に行う必要はないけれども)インストールされている package に既知の脆弱性が含まれていないか確認するためのコマンドを発行。

# pkg audit -F
Fetching vuln.xml.bz2: 100% 449 kB 230.2k/s 00:02
apache22-2.2.27_6 is vulnerable:
apache22 -- several vulnerabilities
CVE: CVE-2013-5704
CVE: CVE-2014-0226
CVE: CVE-2014-0231
CVE: CVE-2014-0118
WWW: http://portaudit.FreeBSD.org/f927e06c-1109-11e4-b090-20cf30e32f6d.html
dbus-1.8.6 is vulnerable:
dbus -- multiple vulnabilities
CVE: CVE-2014-3639
CVE: CVE-2014-3638
CVE: CVE-2014-3637
CVE: CVE-2014-3636
CVE: CVE-2014-3635
WWW: http://portaudit.FreeBSD.org/38242d51-3e58-11e4-ac2f-bcaec565249c.html
phpMyAdmin-4.2.7.1 is vulnerable:
phpMyAdmin -- XSRF/CSRF due to DOM based XSS in the micro history feature
CVE: CVE-2014-6300
WWW: http://portaudit.FreeBSD.org/cc627e6c-3b89-11e4-b629-6805ca0b3d42.html
3 problem(s) in the installed packages found.

おっと、何個か脆弱性を持つパッケージが報告されました。こいつはなかなかおもしろい。

さらにいいのが、パッケージをメンテナンスするに連れ、不要になったり、別のものに置き換えられたりで、どんどん増えてくる依存関係が無くなったまま放置されている不要パッケージのメンテナンスコマンド。不要なパッケージをリストアップして、削除できます。

# pkg autoremove
Updating database digests format: 100%
Checking integrity... done (0 conflicting)
Deinstallation has been requested for the following 7 packages:

Installed packages to be REMOVED:
        py27-Babel-1.3_2
        py27-Jinja2-2.7.3
        py27-sphinx-1.2.3
        py27-MarkupSafe-0.23
        py27-docutils-0.12
        py27-pygments-1.6_2
        py27-pytz-2014.4,1

The operation will free 28 MB.

Proceed with deinstalling packages? [y/N]: y
[1/7] Deleting py27-sphinx-1.2.3: 100%
[2/7] Deleting py27-Jinja2-2.7.3: 100%
[3/7] Deleting py27-Babel-1.3_2: 100%
[4/7] Deleting py27-MarkupSafe-0.23: 100%
[5/7] Deleting py27-docutils-0.12: 100%
[6/7] Deleting py27-pygments-1.6_2: 100%
[7/7] Deleting py27-pytz-2014.4,1: 100%

これは更新が激しいパッケージメンテナンスには便利。
ハンドブックには、portsディレクトリメンテナンスコマンドや、パッケージの単発メンテナンスなどいろいろ書いてありましたが、私が知りたいのは更新が必要なパッケージをまとめてアップデートインストールする方法。
今までは、 portversion -vL= コマンドを使っていましたが、今後は、

# pkg_version -l "<"

となるようです。

(訂正:引き続き「pkg_version」コマンドを使うというドキュメントはどうも怪しい気がします。pkg2ng を使用した後は pkg_* ツールを使うべきではないと記述してあるわけですから、ここは pkg version -options でしょう。
実際、初回 pkg_version コマンドを使用したところ、更新前は更新対象を表示できたものの、一部パッケージを更新して再び pkg_version -l “<” を発行しても更新したパッケージが再び更新対象として表れてました。)

オンラインマニュアルをあれこれチェックしてみました。

# pkg version -vL=

上記コマンドで、更新対象パッケージ一覧を表示できます。

パッケージの一括更新コマンド自体は従来通りで、portmaster や portupgrade コマンドで行うとのことです。私の場合は、 portupgrade コマンドを使う事になります。

# portupgrade -a
や
# portupgrade pkgname1 pkgname2........

これで更新が必要なパッケージをソースからビルドして旧バージョンとリプレーする事が出来るようです。

さて、pkg コマンドは、ソースからビルドする他に、サーバーからビルド済みパッケージをダウンロードして展開するコマンドも持っています。私はこの方法があまり好きではありませんが、公式サーバーからのインストールなので、 config 設定を変更する必要がないパッケージの場合はこちらを利用すると作業は楽そうです。OSインストール直後は重宝しそうです。
問題点は、パッケージバイナリーにセキュリティーホールが見つかってしまうと、バイナリーからインストールしたサーバーは、全て同じ被害を被る可能性が高いという事。ローカルにビルドする場合は、少しバイナリーが異なる可能性もあるためバイナリ用侵入コードが有効に働かない可能性があります。(デフォルトコンフィグを使っていれば同じ)

それでもビルドの手間が掛からない分は楽で、毎日自動で ports を更新してアップデートを掛けるならバイナリーインストールの方が常に最新に出来そうです。

バイナリインストールを試してみようと、次のように実行してみると、、、、

# pkg upgrade
No valid repository found.
#

反応無し。エラーメッセージから刷ると、レポジトリの設定がないということなので、設定不足のようです。
ドキュメントをいろいろチェックすればどこかに書いてあるのでしょうけど、今は時間がないのでここまで。

コメントを残す