ほっしーの技術ネタ備忘録

技術ネタの備忘録です。基本的に私が忘れないためのものです。他の人の役にも立つといいなぁ。

6.3-R から 7.2-R へのアップグレード with ezjail

  • freebsd-update を使うと major version をまたいでバージョンアップができるらしい!
  • ezjail なら ezjail-admin update でユーザランドを更新して ports を再コンパイルするだけでいいのかも!?

というわけでやってみました。


参照:
http://www.daemonology.net/blog/2007-11-11-freebsd-major-version-upgrade.html

[FreeBSD] ezjail ホストの freebsd-update


こちらは通常の作業通り。


まずは GENERIC カーネルに戻すために /etc/make.conf の KERNCONF をコメントアウト
そしていつも通りに

# make buildkernel
# make installkernel
# reboot


あと作業中邪魔にならないように /etc/rc.conf で各種デーモンを一時的に無効化。
ezjail も止めるために ezjail_enable="YES" をコメントアウトしておきます。


そのあとはおもむろに

# freebsd-update upgrade -r 7.2-RELEASE

と叩くとメタファイルやパッチを落として1時間ほどかかりました。
さらに自動でマージできないファイルをどうするか聞かれたり。
基本的に問題なかったので y にしておいて後から再編集しました。


最後は追加・削除・変更するファイルの一覧を出してそのまま終わります。
何かメッセージが出ると思ってやり直しちゃったよ...


さて、終わったらインストール。

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

カーネルだけインストールしましたよ。
再起動してから続きをやりましょう。

# freebsd-update install
Installing updates... done.
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 "freebsd-update.sh install"
again to finish installing updates. 

古いライブラリを削除したら完了です。その前に ports を更新してね!
ということで、*ruby などが正しく走らないため* 今回は portmaster を使います。

# portmaster -af

コンパイルが終わったら続きをやります。

# freebsd-update install
Installing updates... done.
# reboot

これでホストのアップグレードは完了。
作業ファイルが400MBくらいあるので消しておきます。

# rm -fr /var/db/freebsd-update/files


最後にカスタムカーネルに戻します。
supfile のタグを RELENG_7_2 にするのを忘れないように。

# vi standard-supfile
# csup standard-supfile
# make buildworld
# make buildkernel
# make installkernel
# make instalworld
# reboot

これでOK。

[FreeBSD] ezjail のバージョン追従


こっちも freebsd-update を使う方法があるそうですが、
さっきついでに buildworld したのでそれを利用します。


まずはホスト側で下準備。

# ezjail-admin update -i
# mergemaster -siva -D /usr/jails/JAILNAME -t /usr/jails/JAILNAME/var/tmp/temproot
# mergemaster -sivr -D /usr/jails/JAILNAME -t /usr/jails/JAILNAME/var/tmp/temproot

JAIL マシンの数だけ mergemaster を行います。

# vi /usr/jails/JAILNAME/etc/rc.conf    /* デーモンの無効化 */
# /usr/local/etc/rc.d/ezjail.sh forcestart JAILNAME
# jls
# jexec N su -
jail# portmaster -af
jail# exit
# /usr/local/etc/rc.d/ezjail.sh forcestop JAILNAME
# vi /usr/jails/JAILNAME/etc/rc.conf               /* デーモンを再び有効化 */
# /usr/local/etc/rc.d/ezjail.sh forcestart JAILNAME

マシンの数だけ portmaster -af を行います。


あとは、ホストの /etc/rc.conf で ezjail を有効にして再起動すれば作業完了。
ここまで丸二日かかった。。。(実際の作業時間は1日程度)