最近パッケージメンテナンスに支障が出始めた (私が管理しているうちの一台である)FreeBSD 7.3サーバーを 意を決して 8.3 にリモートアップデートすることにしました。
FreeBSD リモートアップデートの恐いところは、万が一リモートアクセス用サービスが正常起動する前にエラーが発生してしまったら現場に行くか、サーバーを送ってもらうかしないと手の出しようが無いこと。これさえ発生しなければ、OSアップグレードは何度も作業しているので、時間が掛かることを除けば、それほど難しい作業ではありません。
実は、既に一年前に FreeBSD 7.3 → 8.2 へのリモートアップデートテストは終了していて、手順書は出来ていたものの、OS更新後に再構築しなくてはならないパッケージが多数あることと、freebsd-update コマンドを実行する前にカスタマイズカーネルをGENERICカーネルに戻さなくてはならない(リモートからカーネルコンフィグレーションを掛けてリブートしなくてはならない)ためためらっていました。昨日、FreeBSD 8.4 リリースを発見したことから、せめて8.3までには上げておきたいと重い腰を上げることにしました。
サーバー仕様
- HP Vectra VEi7 DT(のマザーボード)
- CPU: Celeron 466MHz
- Memory: 256MB
- HDD: IDE接続(DMA66) x2、Master & Slave
手順
- dump コマンドで、システムディスクのバックアップを取る。
私の場合は、/, /usr をバックアップして、別のホストにコピーを取りました。
# dump -0uaLC 32 -f root.dump /
# dump -0uaLC 32 -f usr.dump /usr - カーネルを GENERIC カーネルに戻す
- リブート
- OSを8.3に上げた後、各種オプションサービスが自動起動しないように、rc.conf を書き換えておきます。
- freebsd-update -r 8.3-RELEASE upgrade で、必要ファイルをフェッチ
- freebsd-update install で、更新を適用
- リブート
- freebsd-update install で、古いファイルを消去
- portmaster -af で、インストール済み ports を再構築(省略可能)
- freebsd-update install で、古いファイルを消去(省略可能)
作業記録
具体的な作業記録は次の通り。
# uname -a FreeBSD 7.3-RELEASE-p7 FreeBSD 7.3-RELEASE-p7 #0: Tue Sep 27 13:03:16 UTC 2011 root@i386-b uilder.daemonology.net:/usr/obj/usr/src/sys/GENERIC i386 # cd # freebsd-update -r 8.3-RELEASE upgrade Looking up update.FreeBSD.org mirrors... 4 mirrors found. Fetching metadata signature for 7.3-RELEASE from update2.freebsd.org... done. Fetching metadata index... done. Fetching 1 metadata files... done. Inspecting system... done. The following components of FreeBSD seem to be installed: kernel/generic src/base src/sys world/base world/dict world/doc world/info world/manpages world/proflibs The following components of FreeBSD do not seem to be installed: src/bin src/cddl src/contrib src/crypto src/etc src/games src/gnu src/include src/krb5 src/lib src/libexec src/release src/rescue src/sbin src/secure src/share src/tools src/ubin src/usbin world/catpages world/games Does this look reasonable (y/n)? y Fetching metadata signature for 8.3-RELEASE from update2.freebsd.org... done. Fetching metadata index... done. Fetching 1 metadata patches. done. Applying metadata patches... done. Fetching 1 metadata files... done. Inspecting system... done. Fetching files from 7.3-RELEASE for merging... done. Preparing to download files... Fetching
ここで、えらく長い時間待たされるのでネットワークコネクションが切れてしまわないように注意が必要。
16041 patches .....10....20....30....40....50....60....70....80....90....100....110....120....130....140....150....160....170....180....190....200....210....220....230....240....250....260....270....280....290....300....310....320....330....340....350....360....370....380....390....400....410....420....430....440....450....460....470....480....490....500....510....520....530....540....550....560....
16000パッチ分、延々と待たされます。ここまで Celeron 466MHz PCで2時間くらい。
15860....15870....15880....15890....15900....15910....15920....15930....15940....15950....15960....15970....15980....15990....16000....16010....16020....16030....16040 done. Applying patches...
また、これが長い。done. が出るまで1時間くらい掛かりました。
Applying patches... done. Fetching 3489 files...
まだ3500ファイルくらいあるのか~。ここまで既に3時間以上掛かっています。
Attempting to automatically merge changes in files... done. The following file could not be merged automatically: /etc/amd.map Press Enter to edit this file in vi and resolve the conflicts manually...
ここで /etc 以下のたくさんのファイルを手動で編集する必要が出てきます。特に編集を加えていなければ、行を置き換えるだけで済みますが、sendmail.cf やパスワードファイルなどが編集画面に出てくると気を遣います。それに数も多い。めげずに全部編集して最後までゆくと、
Does this look reasonable (y/n)?
と出て確認待ちになりますが、すべて y で答える必要があります。n を入れると最初からやり直し。
最後まで y を入れ続けると、
The following files will be removed as part of updating to 8.3-RELEASE-p8: /boot/GENERIC/digi.ko /boot/GENERIC/digi.ko.symbols /boot/GENERIC/digi_CX.ko /boot/GENERIC/digi_CX.ko.symbols
と出てきて、削除されるファイル名がこれまた延々と表示されます。最初はちゃんと確認していましたが、/usr/src の下なんか見ていられないので、もうスペースキーを押しっぱなしにしておきます。最後に # プロンプトが出てきて再びコマンド待ちになりますので、スペースキー押しっぱなしで大丈夫。
/usr/src/sys/xdr/xdr.c /usr/src/sys/xdr/xdr_array.c /usr/src/sys/xdr/xdr_mbuf.c /usr/src/sys/xdr/xdr_mem.c /usr/src/sys/xdr/xdr_reference.c /usr/src/sys/xdr/xdr_sizeof.c /var/db/mergemaster.mtree /var/named/etc/namedb/master/empty.db /var/named/etc/namedb/master/localhost-forward.db /var/named/etc/namedb/master/localhost-reverse.db /var/named/etc/namedb/named.conf /var/named/etc/namedb/named.root /var/yp/Makefile.dist #
作業時間は4時間を越えました。これまでは、アップグレードの前作業です。
そして、いよいよ、
# freebsd-update install
とコマンドを打ち込んで、次のステップ(OSの更新)に進みます。
Installing updates... Kernel updates have been installed. Please reboot and run "/usr/sbin/freebsd-update install" again to finish installing updates.
5時間以上経過したところでリブートを求めるメッセージが出てきました。
緊張しながら、 「shutdown -r now」と発行。
このあとしばらく緊張の時間が続きます。ただのリブートなら、つながるはずの時間を待って traceroute で接続を確認しても応答無し!かなりびびりました。
その後2分程度待って、再び確認してみたところ、応答あり!ここまでくれば、後は何とかなるでしょう。リモート接続して、メッセージを確認します。
# uname -a FreeBSD 8.3-RELEASE-p3 FreeBSD 8.3-RELEASE-p3 #0: Mon Jun 11 23:52:38 UTC 2012 root@i386-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC i386
uname コマンドで確認したところ、無事にFreeBSD 8.3になっていました。p3ということでパッチも入っています。続いて、後処理。
# cd # freebsd-update install Installing updates...rmdir: ///usr/share/doc/zh_CN.GB2312/books/porters-handbook: Directory not empty rmdir: ///usr/share/doc/zh_CN.GB2312/books: Directory not empty rmdir: ///usr/share/doc/zh_CN.GB2312: Directory not empty rmdir: ///usr/share/doc/nl_NL.ISO8859-1/articles/solid-state: Directory not empty rmdir: ///usr/share/doc/nl_NL.ISO8859-1/articles: Directory not empty rmdir: ///usr/share/doc/nl_NL.ISO8859-1: Directory not empty rmdir: ///usr/share/doc/ja_JP.eucJP/books/handbook: Directory not empty rmdir: ///usr/share/doc/ja_JP.eucJP/books: Directory not empty rmdir: ///usr/share/doc/ja_JP.eucJP: Directory not empty rmdir: ///usr/share/doc/hu_HU.ISO8859-2/books/handbook: Directory not empty rmdir: ///usr/share/doc/hu_HU.ISO8859-2/books: Directory not empty rmdir: ///usr/share/doc/hu_HU.ISO8859-2: Directory not empty rmdir: ///usr/share/doc/en_US.ISO8859-1/books/porters-handbook: Directory not empty rmdir: ///usr/share/doc/en_US.ISO8859-1/books: Directory not empty rmdir: ///usr/share/doc/en_US.ISO8859-1/articles/solid-state: Directory not empty rmdir: ///usr/share/doc/en_US.ISO8859-1/articles/building-products: Directory not empty rmdir: ///usr/share/doc/en_US.ISO8859-1/articles: Directory not empty rmdir: ///usr/share/doc/en_US.ISO8859-1: Directory not empty rmdir: ///usr/share/doc/el_GR.ISO8859-7/books/handbook: Directory not empty rmdir: ///usr/share/doc/el_GR.ISO8859-7/books: Directory not empty rmdir: ///usr/share/doc/el_GR.ISO8859-7/articles/new-users: Directory not empty rmdir: ///usr/share/doc/el_GR.ISO8859-7/articles/explaining-bsd: Directory not empty rmdir: ///usr/share/doc/el_GR.ISO8859-7/articles: Directory not empty rmdir: ///usr/share/doc/el_GR.ISO8859-7: Directory not empty rmdir: ///usr/share/doc/de_DE.ISO8859-1/books/handbook: Directory not empty rmdir: ///usr/share/doc/de_DE.ISO8859-1/books: Directory not empty rmdir: ///usr/share/doc/de_DE.ISO8859-1: Directory not empty 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.
ということで、freebsd-update コマンドによるOSアップデート作業は、これで完了です。
しかし、portsからインストールしたプログラムは、このあとでリビルドが必要で、再度 freebsd-update install を行えと書かれています。
FreeBSDハンドブックによると、このあとで portmaster -af コマンドをする必要があるようです。
指示通り、
# portmaster -af
を実行。途中、xz コマンドのところで、portmaster コマンドが途中停止してしまいます。理由は xz がOSに組み込まれたため、ports は不要になったと推測できるため、pkg_delete で xz を消去。このあと、 portmaster を再発行して作業を継続しました。最後に、再インストールかインストールの確認を求めるメッセージが出てくるので、y を押して作業を継続させます。
===>>> The following actions will be taken if you choose to proceed: Re-install bigreqsproto-1.1.2 Re-install pkgconf-0.9.2_1 Re-install xorg-macros-1.17 Re-install dialog4ports-0.1.4 Re-install inputproto-2.3 Re-install ja-FreeWnn-lib-1.1.1.a021_9 Re-install autoconf-2.69 Re-install autoconf-wrapper-20101119 Re-install portupgrade-2.4.10.5_1,2 Install devel/ruby-date2 Re-install subversion-1.7.10 Re-install webalizer-2.23.5_4 Re-install wget-1.14_2 Re-install xload-1.1.1 ===>>> Proceed? y/n [y]
200以上のファイルの再構築なので、一晩、放置しておくことにしましたが、朝画面をチェックしてみると、入力待ちで処理停止中。
古いファイルを消去するかどうかの確認メッセージで停止していたわけですが、この後も時々キーボード入力を求められました。また、運悪くエラーが出てしまうパッケージもあり、この場合は portmaster コマンドが abort, Terminaled となり終了してしまいます。幸い、続きをするためのコマンドを表示してくれるので、そのコマンドをコピー&ペーストして、エラーが出るパッケージを修正して、再実行すればいいので振り出しに戻る必要はありません。
2度、portmaster コマンドが中断されてしまい、手動でコマンド入力を繰り返すこと2回。ようやく、再構築が終了。
===>>> The following actions were performed: Upgrade of mysql-client-5.5.31 to mysql-client-5.5.32 Upgrade of mysql-server-5.5.31 to mysql-server-5.5.32 Upgrade of perl-5.12.4_5 to perl-5.12.5 Re-installation of p5-Digest-SHA-5.84 Re-installation of p5-Digest-SHA1-2.13 Re-installation of p5-ExtUtils-Command-1.17 Re-installation of p5-ExtUtils-Install-1.54_2 Re-installation of p5-ExtUtils-MakeMaker-6.66 Re-installation of p5-Math-BigInt-1.997 Re-installation of p5-Net-Dropbox-API-1.9 Re-installation of p5-Net-IP-1.26 Re-installation of p5-PathTools-3.4000 Re-installation of php5-extensions-1.7 Installation of devel/ruby-date2 (ruby19-date2-4.0.19) Re-installation of portupgrade-2.4.10.5_1,2 Re-installation of subversion-1.7.10 Re-installation of webalizer-2.23.5_4 Re-installation of wget-1.14_2 Re-installation of xload-1.1.1 ===>>> Exiting
48時間近く掛かって、ようやくパッケージ再構築が終了。
この後で、再度
freebsd-update install
を実行すれば、OSアップデート作業は終了。あとは、テンポラリー領域 /var/db/freebsd-update/ を空にして終了することにします。
作業を終えての感想
OSのメージャーバージョンアップデート作業は、できることなら手元で作業したい内容でしたが、freebsd-update はOSが準備してくれているリモートから可能なアップデート機能。一度は使っておかないといけないと感じてチャレンジしました。作業手順はとても簡単ですが、リブート中のサーバーの状態を直接知ることが出来ないため最後まで不安でした。
freebsd-update は OSのアップデートだけなら、半日あれば終わる作業です。最近のマルチコアマシンなら、遅いマシンでも1時間半程度で終了します。
初回だったため、パッケージの再構築まで行いましたが、カーネルに下位バイナリー互換オプション(COMPAT_FREEBSD7)が入っているため、二日も掛けて再構築を行う必要はなかったと感じています。特にports 以外からパッケージをインストールしている場合はトラブルの原因になりそうです。まとめて行うので、あとで問題を見つけた場合、どのパッケージが原因なのか切り分けられないかもしれません。