FreeBSD 9 ソフトウェア・パッケージ更新メモ

FreeBSD 9.2-RELEASE におけるソフトウェア・パッケージの管理備忘録。なにせ,しょっちゅうやっているのにいつも忘れて困るのである。以下,tcsh スーパーユーザの端末コマンドライン・オペレーションを示している。

パッケージ管理については,新しいソフトウェアを追加するよりも,脆弱性が発見された導入済みソフトウェアを更新しなければならない事態のほう多いように思われる。

FreeBSD 標準設定では,夜間にセキュリティチェックが自動で走り,そのチェック結果レポートが root 宛に電子メールされるようになっている。その “Checking for packages with security vulnerabilities:” のところには,脆弱性のあるインストール済みパッケージ名称がリストされる。たとえば,以下のようなものである。

Checking for packages with security vulnerabilities:
Database fetched: Thu Apr  2 23:29:53 JST 2015
mod_dav_svn-1.8.11
php5-5.4.38
subversion-1.8.11

ちなみに,脆弱性パッケージの一覧は,以下のように,“pkg audit -F” コマンド実行によっても得られる。

# pkg audit -F
pkg: vulnxml file up-to-date
mod_dav_svn-1.8.11 is vulnerable:
subversion -- DoS vulnerabilities
CVE: CVE-2015-0251
CVE: CVE-2015-0248
CVE: CVE-2015-0202
WWW: http://vuxml.FreeBSD.org/freebsd/8e887b71-d769-11e4-b1c2-20cf30e32f6d.html
 
php5-5.4.38 is vulnerable:
Several vulnerabilities found in PHP
CVE: CVE-2015-2311
CVE: CVE-2015-2305
CVE: CVE-2015-0231
WWW: http://vuxml.FreeBSD.org/freebsd/742563d4-d776-11e4-b595-4061861086c1.html
 
subversion-1.8.11 is vulnerable:
subversion -- DoS vulnerabilities
CVE: CVE-2015-0251
CVE: CVE-2015-0248
CVE: CVE-2015-0202
WWW: http://vuxml.FreeBSD.org/freebsd/8e887b71-d769-11e4-b1c2-20cf30e32f6d.html
 
3 problem(s) in the installed packages found.

パッケージメンテナンスは,主に,ここに上がったものを,脆弱性対策版に更新することである。FreeBSD におけるパッケージ更新の方法はいくつもあるが,私が利用しているのは,pkgportupgrade である。

pkg を使う

pkg ツールを入れるところから。ツールを組み込んで初期化する。引数なしの pkg コマンド実行は,環境の初期化であり,最初に一回だけ行う。

# cd /usr/ports/ports-mgmt/pkg && make install clean
# rehash
# pkg

pkg_ 系コマンドを用いた古い package データベースを使っていた場合は,pkg2ng コマンドでデータベースフォーマット変換しておく。(最初のみ)

# pkg2ng

そして,FreeBSD-10.x よりも古いバージョンの場合,/etc/make.conf に以下を書いておく。

WITH_PKGNG= yes

インストール済みパッケージを更新(アップグレード)する。

# pkg upgrade samba36

問い合わせが鬱陶しいなら -y オプションを付ける。

Child process pid=xxxxx terminated abnormally: Segmentation fault” のようなエラーメッセージが出るようなら,次のように,パッケージ・リポジトリ・カタログをクリーニングしてみる。

# pkg clean -a
# pkg update -f

portupgrade を使う

pkg のインストール処理はバイナリパッケージをダウンロードして展開するので高速ではあるが,パッケージによっては更新したいパッケージに依存するソフトウェアを纏めて更新したい場合がある。

たとえば,png パッケージ(libpng)のような画像ライブラリは,これを前提とする他の画像処理パッケージが多く,png だけを更新すると古いライブラリが削除されてしまい,“libpngXX.so.XX not found” のようなエラーで動かなくなるプログラムがたくさん出てしまう。

私は png とともにこれを前提とするパッケージを纏めて更新するのに portupgrade を用いている。この方法は ports を用いており,ソースのダウンロード,コンパイルから実行する関係で,依存関係の多いベーシックなパッケージの場合,ウンザリするくらい時間がかかる。

しかし,ports から組込みをするため,バイナリを入れておしまいの pkg install もしくは pkg upgrade とは異なり,ports で準備されたインストールスクリプトが実行されるので,たとえば apache 関連モジュールのインストールでは httpd.conf に当該モジュールのエントリ(LoadModule 文)が自動で追加されるなどのメリットもある。

# cd /usr/ports/ports-mgmt/portupgrade && make install clean

ports を最新にしてから portupgrade を実行する。

# portsnap fetch extract update
# portupgrade -rf --batch png

portupgrade -r オプションは,対象パッケージに依存しているパッケージを再帰的に(いもずる式に)更新する指定である。-f オプションは処理を強制的に進める指定で,途中でエラーが出てもおかまいなく突き進む。--batch を指定しておくと,ビルドオプションなどのユーザへの問い合わせなくシステムが標準設定で処理をする。いちいちインストールのオプションを聞かれてそのたびに応答しなければならない面倒をすっ飛ばす。

pkg, ports misc tips

portsclean: make clean をし忘れた ports を探索してクリーニングし(-C),/usr/ports/distfiles から古い ports のソースアーカイブを削除する(-D)。

# portsclean -C -D
Cleaning out /usr/ports/*/*/work...
Delete /usr/ports/editors/emacs/work
Delete /usr/ports/textproc/wv/work
Delete /usr/ports/graphics/ImageMagick/work
Delete /usr/ports/graphics/openjpeg/work
Delete /usr/ports/graphics/p5-GD/work
Delete /usr/ports/graphics/cairo/work
Delete /usr/ports/security/libgcrypt/work
Delete /usr/ports/databases/db46/work
done.
Detecting unreferenced distfiles...
Delete /usr/ports/distfiles/Archive-Zip-1.37.tar.gz
Delete /usr/ports/distfiles/BerkeleyDB-0.54.tar.gz
Delete /usr/ports/distfiles/ConsoleKit-0.4.3.tar.bz2
Delete /usr/ports/distfiles/Crypt-OpenSSL-Bignum-0.04.tar.gz
Delete /usr/ports/distfiles/Crypt-OpenSSL-Random-0.04.tar.gz
Delete /usr/ports/distfiles/DBD-SQLite-1.40.tar.gz
Delete /usr/ports/distfiles/DBD-SQLite-1.42.tar.gz
Delete /usr/ports/distfiles/DBD-mysql-4.023.tar.gz
Delete /usr/ports/distfiles/DBI-1.628.tar.gz
Delete /usr/ports/distfiles/DBI-1.631.tar.gz
...

pkg search: パッケージ・リポジトリ・カタログのパッケージを検索する。-o オプションでカテゴリ(ports のディレクトリ)を付けて表示する。

# pkg search -o apache22
www/apache22
www/apache22-event-mpm
www/apache22-itk-mpm
www/apache22-peruser-mpm
www/apache22-worker-mpm