freebsd-updateを使ったら楽すぎて吹いた。

自宅サーバはほぼ10年前のノートPCだ。
ここにFreeBSDを入れてApache, Samba, mt-daapdを動かしている。バッテリーはさすがに死んでいるが動作には全くといっていいほど問題ない。
とはいえ、通常運用時はともかくとして、セキュリティフィックスなどでOSやportsの更新が発生したときの手間がさすがにつらくなってきた。

portsはもうかなり前から別マシンでコンパイルするようにしていて、これはもう解決。
OSは別マシンでbuildした/usr/objからインストールしたり、snapshotsのISOイメージを使うようにしていたが、とうとうこれもあきらめてfreebsd-updateに移行することにした。
そしたら予想以上に楽で驚いた。


ただ、RELEASEなど安定版バージョン(とそのBETA版、RC版)でなければ使えない。
FreeBSDにはRELEASEブランチのほかに開発版であるSTABLE, CURRENTというのもある。人柱用のCURRENTはともかく、CURRENTで実験済みのソースがバンバン突っ込まれるSTABLEで使えないのはちょっと寂しく、これが今まで俺がfreebsd-updateを使わなかった理由なんだが、まあSTABLEでのバイナリアップデートはきつかろう。

あともう一つ、カーネルもカスタマイズしている場合には注意が必要。

そういった訳で、7-STABLEからわざわざ7.2-RELEASEに戻してやってみた。
実際にやったのは1ヶ月ほど前なので、以下の例では7.2-p3までのアップデートです。11/5時点では7.2-p4が最新。


freebsd-update fetchで必要なファイルをダウンロード。

# uname -r
7.2-RELEASE
# freebsd-update fetch
Looking up update.FreeBSD.org mirrors... none found.
Fetching metadata signature for 7.2-RELEASE from update.FreeBSD.org... done.
Fetching metadata index... done.
Fetching 2 metadata files... done.
Inspecting system... done.
Preparing to download files... done.
Fetching 35 patches.....10....20....30.. done.
Applying patches... done.

The following files will be updated as part of updating to 7.2-RELEASE-p3:
/boot/kernel/if_bce.ko
/boot/kernel/if_bce.ko.symbols
/boot/kernel/if_fxp.ko
/boot/kernel/if_fxp.ko.symbols
/boot/kernel/kernel
/boot/kernel/kernel.symbols
/lib/libc.so.7
(中略)
/usr/src/sys/conf/newvers.sh
/usr/src/sys/dev/bce/if_bce.c
/usr/src/sys/dev/fxp/if_fxp.c
/usr/src/sys/kern/sys_pipe.c
/usr/src/sys/netinet6/in6.c
#

その後、installして再起動。
uname -rとすればパッチレベルの上がっている事が確認できる…はずだが、unameの応答はp2になっていてp3ではない。

# freebsd-update install
# reboot
(略)
$ uname -r
7.2-RELEASE-p2
$

これはなぜかというと、p2からp3で修正されたのはbindだけで、kernelは修正されておらず、p2の時のままだから。
unameに対してkernelが返す値は、/usr/src/sys/conf/newvers.shが元になっているが、こちらを確認すればしっかりp3になっていることが確認できる。

繰り返しになるが、p2からp3になったときに、freebsd-updateはbindを更新し、kernelは更新しないからunameの応答はp2になるというわけ。

ただ、freebsd-updateはパッチレベルが上がった時には必ずnewvers.shを更新しているので、kernelに更新がなくとも、kernelを再作成すればパッチレベルは上がる。
真面目なサーバの場合は、kernelを再作成しておいた方がよいと思う。


ロールバックも試しにやってみた。

# uname -r
7.2-RELEASE
$ uname -r
7.2-RELEASE-p2
# freebsd-update rollback
Uninstalling updates... done.

$ uname -r
7.2-RELEASE