自宅サーバのシステムを FreeBSD 9.3 から FreeBSD 10.3 へシステム・アップグレードを行いました。
経緯
昨年末から FreeBSD 10 系へのアップグレードを考えていましたが、なかなか着手することができず、ずるずると本日まで引き伸ばしてきました。しかし FreeBSD 9.3 のサポート期限の 2016 年 12 月 31 日まで、あと半年と迫ってきたことから、流石に重い腰を上げてアップグレード作業を行いました。
また先日、ハードディスクを交換したばかりなので、その内容に大きな変化のないうちに、アップグレードを行っておくと、万が一アップグレードに失敗したときには、古いハードディスクに戻すことによってとりあえず機能を復旧させることも可能なため、早いうちにアップグレードを行いたいと考えていました。
FreeBSD 10 系では、DNS サーバの named (Bind9) がシステムの中から ports へ移管されることから、アップグレードにより DNS サーバ がすぐに動作しないことを考慮して、OpenWrt をインストールした無線 LAN ルータの中に、予備の DNS サーバを用意して、今回のアップグレードに備えていました。
なお ports の中の bind9 のインストールの記事は、別の記事として記述しています。
FreeBSD Bind9 (named) のインストール
http://near-unix.blogspot.jp/2016/05/freebsd-bind9-named.html
準備作業
アップグレードの前に事前にいくつかの準備作業を行っておきました。
- DNS サーバ(Bind9) -
最終的なデータを OpenWrt をインストールした無線 LAN ルータへコピーをして、動作確認を行いました。すでに先日の自宅サーバのハードディスク交換のときにも、この OpenWrt をインストールした無線 LAN ルータの DNS サーバを使っており、検証も終わっていました。
- DHCP サーバ(isc-dhcpd) -
自宅サーバの DNS サーバが停止しても問題ないように以前より第二 DNS サーバにOpenWrt をインストールした無線 LAN ルータの DNS サーバを設定していました。更に念の為、第一 DNS サーバに OpenWrt をインストールした無線 LAN ルータの DNS サーバを指定しておき、万全を期しておきました。作業を開始する前に、稼働中のパソコン類の LAN 接続を一度切断して、再度接続し直して、新しい LAN 設定に変更させておきました。
# vi /user/local/etc/dhcpd.conf
# /usr/local/etc/rc.d/isc-dhcpd restart
- resolv.conf の編集 -
どこの DNS サーバを参照するか決める設定ファイル(/etc/resolv.conf)を編集して、自分自身を指していた 127.0.0.1 を OpenWrt をインストールした無線 LAN ルータの DNS サーバの IP アドレスへ変更しました。
# vi /etc/resolv.conf
- /etc 設定ファイルのバックアップ -
システム内の各種設定ファイルが保管されている /etc ディレクトリをバックアップしておきました。アップグレードの最終段階で行う mergemaster の処理のとき、万が一、誤った処理をしたときに元のファイルに戻せるように配慮しました。
# cp -Rp /etc /etc.old
ソースツリーの更新
アップグレードのまず最初の作業として FreeBSD 10.3 のソースコードを取得しました。古い FreeBSD 9.3 のソースツリーを消去した後、subversion コマンドで取得しました。
- ソースツリーのあるディレクトリを削除 -
# rm -Rf /usr/src
- 新しくソースツリーを作成 -
# mkdir /usr/src
# cd /usr/src
# svn checkout https://svn0.us-west.FreeBSD.org/base/releng/10.3 /usr/src
カーネルのビルドオプションの設定
カーネルのビルドプションを設定しました。設定ファイル名は、FreeBSD のマニュアルに出てくる MYKERNEL の名称をそのまま使用しました。
- GENERIC から MYKERNEL へ複写 -
# cp /usr/src/sys/i386/conf/GENERIC /usr/src/sys/i386/conf/MYKERNEL
そしてこの MYKERNEL を編集しました。を私は、ブートコード部分を i486、i586 を排除して i686 一本に設定した後、PC カード関連のモジュールを組み込まないようにしました。
- MYKERNEL を編集 -
# vi /usr/src/sys/i386/conf/MYKERNEL
カーネルのデバックを行うことがないため、カーネルの巨大化を防ぐためにシンボル類のビルドも中止させました。" # " 記号でコメント化しました。
- MYKERNEL 編集部分の一部 -
#makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols
#makeoptions WITH_CTF=1 # Run ctfconvert(1) for DTrace support
カーネルとユーザランドのビルド
カーネルとユーザランドをビルドしました。途中にある二つのアンパサンド(&&)は、連続して二つの make 処理を行う連結記号です。
# cd /usr/src
# make buildworld && make buildkernel KERNCONF=MYKERNEL
カーネルのインストール
FreeBSD 9.3 から 10.3 へのメジャー・アップグレードとなるため、従来のようにカーネルとユーザランドを一気にインストールすることはしませんでした。とりあえずカーネルだけをインストールして様子をみました。
# make installkernel
カーネルのインストールが終わったところで、再起動させました。
# reboot
ユーザランドのインストールでトラブル
無事 FreeBSD 10.3 のカーネルで起動することができました。早速、ユーザランドをインストールしようとしたところ、インストールエラーとなってしまいました。これは
"unbound" というユーザが登録されていないことが原因でした。
ERROR : Required unbound user is missing. see /usr/src/UPDATING.
解決するには unbound ユーザを追加します。ユーザの追加は、手動で設定するのではなく、システムアップグレードで追加されるユーザを追加する
"mergemaster -p" コマンドで解決するのが一般的のようです。
# mergemaster -p
"mergemaster -p" では /etc/group と /etc/master.passwd の二つのファイルを、新規インストール時に設定されるファイルと順次比較して表示してくれます。
作業としては、
インストール(i)や
消去(d)を選択せず、
合併(m)を選択します。右側部分に
"unbound" の項目が表示されたところで、[
R] キー(右側の選択)をして、
"unbound" のユーザを追加しました。その他の部分では、従来からある左側の部分を選択 [
L] キーを選択しました。
最終行まで選択が終わったところで、[
Q] キーを押して編集モードを抜けた後、インストールの [
i] キーを押して編集内容を反映させました。
ユーザランドのインストール
以上でユーザランドのインストールができる準備ができましたので、インストールを開始しました。
# cd /usr/src
# make installworld
ユーザランドのインストールが終わったところで、システムの設定ファイル(/etc 以下のファイル)の合併作業(mergemaster)を行いました。ここでは、編集を行っている設定ファイルをどのように処理するのか問い合わせを行うオプションの
"Ui" で行いました。未編集の設定ファイルは、自動的に FreeBSD10.3 のものに置き換えられてしまいます。
# mergemaster -Ui
ここでの mergemaster の操作は、基本的に旧来からのものをそのまま使用するときには [d] の削除を選択しました。後で手動で再編集をする設定ファイルなどは、[i] を選択して FreeBSD 10.3 の初期設定ファイルをインストールしました。もちろん新旧の設定ファイルを合併させたいときには [m] を選択して、編集モードへ移行して、旧来からの設定の場合は左側の [L] キーを選択して、新しい設定の場合には右側の [R] キーを選択して設定ファイルを合併させてください。
mergemaster の最終部分では、各種設定を反映させるスクリプトを動作させるかどうかの問い合わせがありました。すべて [Y] で応えて、反映させました。
再起動
mergemaster による操作が終了したところで、マシンを再起動させました。
# reboot
動作確認
マシンが再起動したところで各種の動作確認を行いました。
sendmail の設定データの再インストールも念の為に行っておきました。なお mergemaster での操作ときには、sendmail***.cf ファイルなどは全て [d] を選択して、従来から設定していたデータをそのまま流用しました。
# cd /etc/mail
# make
# make install
# make restart
その他、いろいろと問題が発生していましたが、順次解決させました。