FreeBSD 8.4 から 9.3 へ更新
私が管理しているFreeBSDサーバーのうち一台を 8.4 から 9.3 にアップデートしました。
昨日テストのために、FreeBSD 9.2 の仮想マシンを同様に 9.3 にアップデートして成功したため、実マシンに対しても更新をかけることにしました。
そして本日、万が一失敗しても影響度が最も低いマシンから freebsd-update コマンドでアップデートを掛けることにしました。
このマシン、CPUが Pentium III 1GHz の旧型マシンですが、[hh:mm]
- freebsd-update -r 9.3-RELEASE upgrade [21:50]
- /etc 下のファイルを編集 [23:05]
- freebsd-update install (1回目) [23:22]
- リブート [23:31]
- freebsd-update install (2回目) [23:45]
という手順で実施。約2時間で完了しました。[ ] 内は、大まかな開始時刻。
アップデート後、エラー発生
さすがに遠隔地にあるサーバーをリブートするのはびびりますが、無事に 9.3 に上がりました。
FreeBSD hostname 9.3-RELEASE-p21 FreeBSD 9.3-RELEASE-p21 #0: Tue Jul 28 08:57:41 UTC 2015 root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC i386
この後で、8.4用にビルドされているアプリケーションバイナリーを アプリケーションを 9.3 用に更新するために、pkg コマンドを使おうとしたところ、
# pkg version -vL= Shared object "libutil.so.8" not found, required by "pkg"
# pkg info Shared object "libutil.so.8" not found, required by "pkg"
と、エラーが発生。昨日のテストでは問題なかったのに・・・・・
でもまあ、OSのメジャーアップデート作業はこんなものでしょう。
ライブラリーがないとメッセージが出ているので、ライブラリを調べてみると、確かに libutil.so.8 が無い。9 になっていました。/usr/lib の下にも無くて、/usr/lib から /lib へのシンボリックリンクが張られているということで単純に libutil.so.9 を libutil.so.8 としてシンボリックリンクしてみました。
# ll /lib/libutil.so.9 -r--r--r-- 1 root wheel 71984 8月 27 23:36 /lib/libutil.so.9 # ll /usr/lib/libutil* -r--r--r-- 1 root wheel 97326 8月 27 23:38 /usr/lib/libutil.a lrwxr-xr-x 1 root wheel 17 8月 27 23:38 /usr/lib/libutil.so -> /lib/libutil.so.9 -r--r--r-- 1 root wheel 98050 8月 27 23:38 /usr/lib/libutil_p.a # ln -s /lib/libutil.so.9 /lib/libutil.so.8 # pkg info pkg Shared object "libz.so.5" not found, required by "pkg"
libutil.so.8 が無いというメッセージは表示されなくなりましたが、今度は libz.so.5 が無いとのこと。恐らくこれもシンボリックリンクで解決できそうですが、エンドレス作業になりそうな雰囲気。
テストマシンは、FreeBSD 8.4 → 9.2 → 9.3 と更新したため、pkg コマンドとランタイムライブラリのバージョンが近くてエラーが出なかったのかも。本当なら、pkg コマンドを freebsd.org のサーバーから直接バイナリーインストールして一気に解決したいところですが、バイナリーインストールのための pkg コマンドが使えないので、/usr/ports の下で pkg コマンドを再構築することにしました。
pkg コマンドを再インストールしたところ、pkg コマンドが無事に復活。
余談ですが、FreeBSD 8.4 で動いていた Apache 2.4 も動かなくなってしまいました。
[Thu Aug 27 23:31:58.660473 2015] [core:notice] [pid 1044] AH00094: Command line: '/usr/local/sbin/httpd' [Thu Aug 27 23:34:06.339529 2015] [mpm_prefork:notice] [pid 1044] AH00169: caught SIGTERM, shutting down
その他のコマンドも。
# jdresolve /tmp/ip.txt Shared object "libutil.so.8" not found, required by "perl"
対策・更新後の処理
これは、ports から追加導入した全パッケージを入れ直す方が簡単だと推測できます。ということで、「pkg upgrade」コマンドでとりあえず全部バイナリーアップデートして、その後で不都合がある部分を個別対応することにしました。
pkg upgrade も予想通り、conflict を起こすパッケージが出ましたけど、対象パッケージを手動で再インストールして約450個のパッケージを更新終了。なぜか ruby と mysql-server が消えていました。パッケージの依存関係が原因だと思いますが、消えていたパッケージを再インストールして戻しました。今のところ気づいたのはこれらのパッケージだけですが、Apache 2.4 を起動するとエラーなく起動できました。
次のサーバーの作業に移る前にしばらくモニターする必要がありそうですが、とりあえず遠隔からの 8.4 → 9.3 への更新も何とかなりそうです。