FreeBSD 7.0 へようこそ

第3回freebsd-updateで楽々リリースサーフィン

すでにFreeBSDを導入している読者にとっては、インストールCD-ROMを用いたアップグレードや、ソースからコンパイルしてアップグレードするやり方は釈迦に説法であろう。一方最近のFreeBSDには、ちょうどWindows Updateのように、バイナリで簡単にアップデートできるfreebsd-updateという仕組みが整備されている。

この仕組みは本来、同じリリース内でセキュリティパッチレベルを上げるため(たとえば08年3月4日にFreeBSD 6.2-RELEASEでupdateを使ったところ、パッチレベル11にまで自動で上げてくれた)に用いられるものだが、6.3-RELEASEからは、upgradeオプションで異なるリリースに上がることが可能になった。6.3-RELEASEから7.0-RELEASEは、この新機能が本領を発揮するはじめての例、しかもメジャー番号の更新ということなので、⁠うまくいった」報告を出しておくことは有益なので報告する。

freebsd-updateによる7.0-RELEASEへのアップグレード

すでにFreeBSDをインストールしている読者ならば、FreeBSDの更新は頻繁に行っていることであろう。ただ、筆者も時間がないといった言い訳で、しばしば次のような手抜きアップグレードを行っていた。

  1. /etc, /boot/loader.conf、/root など、/(ルートパーティション)内で自分が手を加えたファイルを退避
  2. 古いFreeBSDの上に、CD-ROMから新しいFreeBSDを上書きインストール。その際disklabelのときに全てのパーティションを「M」⁠Mount point set)キーでもって単にマウントすることにする。
  3. とはいっても若干気持悪いので、disklabelのときに「T」⁠toggle newfs)でもって / だけはnewfsしてまっさらにする
  4. インストールが終わったら、退避しておいた/etcなどの設定ファイルを元に戻す。
  5. 戻すファイルの代表的なものは/etc/rc.conf、/etc/group(viを立ち上げてマージ⁠⁠、/etc/master.passwd ⁠vipw中で手動でマージ⁠⁠、/etc/ssh/*key* ⁠host keyがかわると面倒⁠⁠、/etc/printcap、/etc/resolv.conf、/boot/loader.confなど
  6. パッケージは、暇があるときは全部自分で作り直す(俺的パッケージを作るための、RUN_DEPENDSをやたら指定した「Mitapkgs」というportsを個人的に持ってメンテナンスしている)が、暇が無いときはそのまま。
  7. 古いCライブラリ(たとえばFreeBSD 6なのに/lib/libc.so.5 =FreeBSD 5のlibc)も、そのまま。

以上のやり方は、簡便に実行できる点が魅力だが、たとえばライブラリにセキュリティの問題があるのに、それと知らずに古いパッケージとライブラリを使い続ける、といった類の脆弱性の危険がある。したがって、アップグレードのあるべき姿は、以下のような要求を満たすものであろう。

  • 更新が必要なファイルは更新してくれ
  • 自分で設定したファイルはそのまま、うまいことマージしてくれ
  • 古いライブラリは消してくれること

FreeBSD 6.3-RELEASEでのfreebsd-updateは、上記3要求をすべてかなえてくれる便利なツールである。以下のようなアップグレードの手順を踏む場合

  1. 必要な差分を入手
  2. カーネルを入れ替え
  3. ライブラリ等新ファイルを追加
  4. (手動)パッケージの入れかえ
  5. 旧ライブラリファイルの削除

このうち1、2、3、5をfreebsd-updateが担当してくれる。

[手順0]6.3-RELEASEを用意する

今回記事を執筆するにあたり、FreeBSD 6.3-RELEASEが入っていたディスクと、6.2-RELEASEが入っていたディスクの2種類で試してみた。6.2-RELEASE版のfreebsd-updateには「upgrade」コマンドがなく、実行してもパッチレベルが上がるだけで、アップグレードはできなかった。そこで(いささか乱暴だが)先ほど紹介した「手抜きアップグレード」で6.3-RELEASEを上書きインストールするとfreebsd-updateで7.0-RELEASEにアップグレードできるようになった。

[手順1]差分の入手

まずrootとなり、以下を入力。

# freebsd-update -r 7.0-RELEASE upgrade

すると、自動的に近場のアップグレードサーバを探し、必要な差分を取得してくれる。

Looking up update.FreeBSD.org mirrors... 1 mirrors found.
Fetching metadata signature for 6.3-RELEASE from update1.FreeBSD.org... done.
Fetching metadata index... done.
Fetching 1 metadata patches. done.
Applying metadata patches... done.
Fetching 2 metadata files... done.
Inspecting system... done.

カーネルのコンフィグが違ったり、ソースが一部展開されていなかったりすると、⁠それでもいいですか」と親切にも尋ねてくれる。基本的には「y」と答えておいてよいだろう。

WARNING: This system is running a "smp" kernel, which is not a
kernel configuration distributed as part of FreeBSD 7.0-RELEASE.
As part of upgrading to FreeBSD 7.0-RELEASE, this kernel will be
replaced with a "generic" kernel.
Does this look reasonable (y/n)? y
Inspecting system... done.

Fetching files from 6.3-RELEASE for merging... done.
Preparing to download files... done.
Fetching 16721 patches.....10....20....30....40....50....60....70....80....90....100....110..

《途中略》

16710....16720 done.
Applying patches... done.
Fetching 6288 files... done.
Attempting to automatically merge changes in files... done.

次に、6.3-RELEASEから7.0-RELEASEの間に行われた設定ファイル(/etc/)の変更を反映してよいか聞いてくる。

The following changes, which occurred between FreeBSD 6.3-RELEASE and
FreeBSD 7.0-RELEASE have been merged into /etc/group:
--- current version
+++ new version
@@ -1,6 +1,6 @@
-# $FreeBSD: src/etc/group,v 1.32.2.1 2006/03/06 22:23:10 rwatson Exp $
+# $FreeBSD: src/etc/group,v 1.35 2007/06/11 18:36:39 ceri Exp $
 #
 wheel:*:0:root,mita,work00,jeux,work01,work02,work03,work04,work05,work06,work07
 daemon:*:1:
 kmem:*:2:
 sys:*:3:
@@ -9,10 +9,11 @@
 mail:*:6:
 bin:*:7:
 news:*:8:
 man:*:9:
 games:*:13:
+ftp:*:14:
 staff:*:20:
 sshd:*:22:
 smmsp:*:25:
 mailnull:*:26:
 guest:*:31:
Does this look reasonable (y/n)? y
The following changes, which occurred between FreeBSD 6.3-RELEASE and
FreeBSD 7.0-RELEASE have been merged into /etc/nsswitch.conf:
--- current version
+++ new version
@@ -1,7 +1,15 @@
+#
+# nsswitch.conf(5) - name service switch configuration file
+# $FreeBSD: src/etc/nsswitch.conf,v 1.1 2006/05/03 15:14:47 ume Exp $
+#
 group: compat
 group_compat: nis
 hosts: files dns
 networks: files
 passwd: compat
 passwd_compat: nis
 shells: files
+services: compat
+services_compat: nis
+protocols: files
+rpc: files
Does this look reasonable (y/n)? y

アップデートに際して削除される予定のファイル一覧が表示され、終了する。引き続き実際のインストールを行おう。

The following files will be removed as part of updating to 7.0-RELEASE-p0:
/boot/kernel/bridge.ko
/boot/kernel/g_md.ko

《途中略》

/var/named/etc/namedb/named.root
/var/yp/Makefile.dist

[手順2]カーネルの入れ替え

今度は以下を入力

# freebsd-update -r 7.0-RELEASE install

で実際にカーネルの入れ換えが行われる。

Installing updates...
Kernel updates have been installed.  Please reboot and run
"/usr/sbin/freebsd-update install" again to finish installing updates.

と言われるとおり、OSを再起動する。

[手順3]ユーザランドのインストール

再起動で立ち上がった後、再びrootで

# freebsd-update install

としてライブラリ等のインストールを行う。

Installing updates...

Completing this upgrade requires removing old shared object files.
Please rebuild all installed 3rd party software (e.g., programs
installed from the ports tree) and then run "/usr/sbin/freebsd-update install"
again to finish installing updates.

一連の作業中、ここで出てきたメッセージは最も重要で、次回installを行った瞬間に古いライブラリは消えてしまい、古いライブラリに依存しているすべてのパッケージが動かなくなってしまう。実際、最初筆者はこのメッセージを無視したせいで、パッケージを新しくするための「portupgrade」コマンドまで動かなくなってしまい、復活に苦労した。言われることには素直に従うものだと反省。

[手順4]パッケージの入れ替え(手動)

反省して2回目の7.0-RELEASEへの移行を試すにあたって、正直にパッケージのアップグレードを行った(ちなみに、このように簡単に何度も繰り返してトライできるというのも、前回紹介した「完全バックアップ」で完全なバックアップを取っているからである⁠⁠。ここで、ネット上では

  1. portsnapを使って今日の最新portsを用意した上で
  2. ネット上に7.0-RELEASE用のパッケージがあれば、それを使ってアップグレードする

方法が推奨されているようだが、筆者はそのやり方はそのままではお勧めしない。というのも、portsnapを使って今日の最新portsを用意すると、インストールしようとしているパッケージのバージョンは同じでも、それが依存しているライブラリのバージョンが最新portsの方で新しくなっていて、依存関係が微妙に狂う「バージョン依存の頭痛」に悩まされるからである。経験的にはバージョンの微妙な違いは実害は少なく、悩むのであれば完全にportsだけを使って入れてしまえばよい(実はこの頭痛が嫌なので、筆者は俺的Mitaportsでフルビルドを定期的に行っている)のだが、とくに時間がないときや、地球環境のためにはパッケージは魅力的である。

筆者がお勧めする入れ替え法は、次の手順である。

  1. FreeBSDのインストールCDから7.0-RELEASEのportsを展開した上で
  2. CD-ROMやネット上に7.0-RELEASE用のパッケージがあれば、それを使ってアップグレードする(その際ネットから取得したパッケージは/usr/ports/packages/All/に保存される)
  3. また、portsを使ってインストールするときにはついでにpackageも作る

以下、淡々とコマンドを紹介する。

  • /etc/make.confの整備

    /etc/make.confに以下の3行を追加する。

    BATCH="YES"
    DEPENDS_TARGET="package"
    PACKAGE_BUILDING="YES"
  • 古いportsディレクトリの退避
    # mv /usr/ports /usr/ports.6.3-RELEASE
  • FreeBSD 7.0-RELEASEのdisc1をCD-ROMドライブに挿入
    # mount /cdrom
  • 7.0-RELEASEのportsを展開
    # cd /usr; tar --unlink -xvzf /cdrom/7.0-RELEASE/ports/ports.tgz
  • portupgradeを実行
    # env PACKAGEROOT=ftp://ftp.jp.FreeBSD.org PKG_PATH=/cdrom/packages/All portupgrade -afP --results-file /tmp/ports.results.txt

上記手順で、135個のパッケージに対して更新作業を夜12時に実行したところ、途中でデータベースファイル(/var/db/pkg/pkgdb.db)が壊れてしまったらしく、朝7時に起きたところエラーでportの更新がなされていなかった。/var/db/pkg/pkgdb.dbを削除してもう一度portupgradeを行ったところ、7時半に開始して8時半に無事終了することができた。※注

この状態で、よく使うアプリケーションを起動してみて、最低限それらは困らずに動作することを確かめておいた方がよい。


※注

本稿を作成するために、3度freebsd-upgradeを試したのだが、/var/db/pkg/pkgdb.dbが途中で壊れる不具合は毎回再現した。

/var/db/pkg/pkgdb.db: unexpected file type or format -- Invalid argument

というエラーである。エラーのログを読むとruby18-bdb-0.6.2パッケージを更新した直後からデータベースが更新できなくなっているようだ。そういえば、標記パッケージはpkgdb.dbを作るために使っているのだから実はあたり前だとも言える。

回避方法としては、まず、

  • portupgrade-2.3.1,2
  • ruby-1.8.6.111_1,1
  • ruby18-bdb-0.6.2

だけを手動でインストールしなおした後、

# mv /var/db/pkg/portupgrade-2.3.1,2 /root/
# mv /var/db/pkg/ruby-1.8.6.111_1,1 /root/
# mv /var/db/pkg/ruby18-bdb-0.6.2 /root/
# pkgdb -u

として、上記パッケージがインストールされている証拠を隠滅した上で、portupgrade -afP を実行する。全てのパッケージ入れ換えが終了した後に、

# mv /root/portupgrade-2.3.1,2 /root/ruby-1.8.6.111_1,1 /root/ruby18-bdb-0.6.2 /var/db/pkg/
# pkgdb -u

としてportupgradeの証拠を復活させることができる。いかにも姑息なやり方であるが背に腹は替えられない。

また、メインマシンのLet's Note CF-W4でパッケージを総入れ替えすると、再起動するたびにマシンが固まってしまうという不具合もあったのだが、これについては筆者が使っているパッケージの組み合わせの問題ではないか? と想像している。実は6.2-R→6.3-Rのときにも同じ問題を経験していて、そのたびに「手抜きインストール」法で同じバージョンを上書きすることで問題なく動作しているので、深く原因を追求することなく今日に至っている。

[手順5]旧ライブラリファイルの削除

パッケージのアップデートが終了したら、旧いライブラリファイルを削除して差し支えない。

# freebsd-update install

これでめでたく移行は終了である。

おわりに

筆者もfreebsd-updateによるバージョンアップ機能を初めて使ってみたが、パッケージの更新の手間さえ厭わなければ、⁠これまでのmake worldの苦労は何だったんだ」というくらいあっけなくアップグレードが完成する。今後はfreebsd-updateによるOSの更新がますます本流になりそうな予感である。このようにしてアップグレードした7.0-RELEASEを使い、いよいよ次回からOSの性能に迫っていくことにしたい。SMP、ファイルシステム、など期待の新機能や如何に。

おすすめ記事

記事・ニュース一覧