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 におけるパッケージ更新の方法はいくつもあるが,私が利用しているのは,pkg と portupgrade である。
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/
# 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