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