FreeBSD 7.3 をリモートから 8.3に上げる

最近パッケージメンテナンスに支障が出始めた (私が管理しているうちの一台である)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

手順

  1. dump コマンドで、システムディスクのバックアップを取る。
    私の場合は、/, /usr をバックアップして、別のホストにコピーを取りました。
    # dump -0uaLC 32 -f root.dump /
    # dump -0uaLC 32 -f usr.dump /usr
  2. カーネルを GENERIC カーネルに戻す
  3. リブート
  4. OSを8.3に上げた後、各種オプションサービスが自動起動しないように、rc.conf を書き換えておきます。
  5. freebsd-update -r 8.3-RELEASE upgrade で、必要ファイルをフェッチ
  6. freebsd-update install で、更新を適用
  7. リブート
  8. freebsd-update install で、古いファイルを消去
  9. portmaster -af で、インストール済み ports を再構築(省略可能)
  10. 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 以外からパッケージをインストールしている場合はトラブルの原因になりそうです。まとめて行うので、あとで問題を見つけた場合、どのパッケージが原因なのか切り分けられないかもしれません。

コメントを残す