FreeBSD7から9RC3への長い道のり

もともとこの日記の目的は備忘録であった。たまにこういうネタを書いていけばリハビリになるだろうなあ。
我が家のWebとメールとDNSのサーバはもうかれこれ7年ほどFreeBSDで、2004年から2008年のゴールデンウィークあたりまではFreeBSD5.X時代、2008年からつい最近までがFreeBSD7時代が半分くらいという感じで、ずっとメインバージョンを固定して必要最小限のマイナーバージョンのアップデートを繰り返してきたのであるが、ぼちぼちFreeBSD7時代もおしまい(正式な保守期限は今のところ2013年2月いっぱいまで)のようなので、一期に移行作業を行うことにして新時代を生きていこうと思ったわけである。今回はディスクのマウントに不安があるので、多少手の込んだ手順での移行となる。

事前環境の保存

FreeBSD7までのライブラリが失われると厳しいので、いったん保存。あとでldconfigで検索パスに追加する。

%cp -a /lib /usr/local/FBSD7rootlib
%cp -a /usr/lib /usr/local/FBSD7usrlib

ソースの取り寄せ

最近はCVSup前提なのか、どんどん旧来のCVSサーバが失われているように思うことと、Ports運用はしていないのでCVSupといわれても困る。そんなわけでSVNに乗り換え。SVNの場合はこんな感じで持ってこれる。いったんFreeBSD7.4からFreeBSD8.2に切り替えるため、

%svn checkout svn://svn.freebsd.org/base/stable/8 /usr/src-8
%ln -s /usr/src-8 /usr/src

こんな感じで。後にFreeBSD9RCxを追いかけるときは

%svn checkout svn://svn.freebsd.org/base/releng/9.0 /usr/src-9
%rm /usr/src
%ln -s /usr/src-9 /usr/src

などをして切り替え。(Subversionの使い方ようしらんでなあ・・・)
システムの構築(前半戦)

いったん make clean とかしてから、FreeBSDハンドブック: ワールドの再構築を参考にしながら作業する。

/usr/objのお掃除

%cd /usr/obj
%chflags -R noschg *
%rm -rf *

Worldとkernelの再構築をした後に実行しておいた方が良さそう。(末尾の後片付けに書き足した。)

KernelとWorldの再構築

ハンドブック通りに進める。シングルユーザーモードに落としてからやった方が数段速いのでシングルユーザーモードに手作業する。あとFrees9以降はbuildworldを先に実行しないといけないようだ。(8でも先にやった方が良さそうだな。) makeの分散処理は適当に。うちはいつも-j4としている。

%cd /usr/src
%script /var/tmp/mw8.2.out
%make -j4 buildworld
%make -j4 buildkernel

7.4→8.2の移行チェック(Filesystem関係)

FreeBSD7系から8系への移行で苦労した話をちらほら聞いたので、いったんちゃんとマウントできるかどうかをチェック。いけそうだったらFreeBSD8に切り替え。うまくいかなかったら本格的にインストールし直しとなるのだが・・・うちの環境ではうまくいった。(ネストしたGEOM周りではまったという話なのだが、うちは割と素直な設定だったようだ。) まず、念のため現行カーネルのバックアップ。

%cd /boot
%cp -a kernel kernel.hoge7

カーネルの仮インストール

基本的にメジャーバージョンアップするときだけ念のためにやっておくべきだろう。いったんkernelを仮にインストールする。もしうまくいかなかったときもリブートすれば元のカーネルで起動できる。インストール先は適当に読み替えること。

%make installkernel INSTKERNNAME=kernel.8

動作確認

リブートしてローダメニューで Loader Prompt を選んで、

%unload kernel
%boot kernel.8 -s

シングルユーザーモードで起動後シェルを/bin/shとして、

%mount -a

ここで、必要なファイルシステムが全部マウントできてたらOK。終了時にはアンマウント。その後再起動。手順としてはこんな感じ。

%sync (適当に何回か)
%umount -A
%reboot

ちなみにうちではそもそもkernel.8が見つからないというトラブルが発生した。どうもgmirrorしているボリュームのうち1台目のHDDが同期されておらず、ずっと片肺運用となっていた。ミラーし直したら見えるようになった。この手の作業を始める前には注意しておこう。
システムの構築(後半戦)

カーネルのインストール

ハンドブック通りにカーネルをインストールして、再起動。

%make installkernel
%sync (適当に)
%reboot

ワールドのインストール

一連の作業が終わるまで、シングルユーザーモードにて作業をする。先の手順でシングルユーザーモードで起動後シェルを/bin/shとして…

%mount -u /
%mount -a

1行目は/を読み書き出来るようにマウントし直す。これをやらないと何も書けない。

/etcをバックアップ・書き換え

/etcはいったんバックアップを取る。なおルートファイルシステムに作る必要はないので読み替えること。

%cp -a /etc /etc.orig

まず/etcの最低限の最低限のアップデートを行う。

%mergemaster -p

一応メジャーバージョンアップなので最低限のチェックを行ったほうが良さそう。ただし/etc/passwd(master.passwd)と/ets/group周りは手で修正しましょう。(ほとんど修正項目はないけれど。)

ワールドのインストール・/etcのアップデート

ハンドブック通りの手順で進めていく。

%make installworld
%mergemaster -UPiF

いつもなやむmergemasterのオプションであるが、-UPiFでよさそう。で、下記のファイルは書き換えないように。

  • /etc/passwd
  • /etc/group
  • /etc/master.passwd
  • /etc/ssh/*
  • /etc/shells
  • /etc/mail/mail.conf

リブート

%sync
%reboot

で基本はおしまい。問題なく再起動して正常稼働していればOK。
後片付け

/usr/objのお掃除

%cd /usr/obj
%chflags -R noschg *
%rm -rf *

ここでやっておけば、毎度作業前にしなくて済む。

いらないファイルのチェック・削除

新しいバージョンでいらなくなったファイルとライブラリをお掃除してくれる。ライブラリは消しちゃうといろいろひどい目に遭うので注意しましょう。まずは、古いファイルやディレクトリ、ライブラリの確認。

%cd /usr/src
%make check-old

内容を確認して消して良さそうであれば、削除を行う。

%make delete-old
%make delete-old-libs

やってみると分かるが、膨大な回数の削除の可否を問うてくるので、きっとうんざりすることに。ええいっ、全部一気にという向きの人は…

%yes | make delete-old
%yes | make delete-old-libs

という恐ろしい滅びの呪文を使うのはアリ。(こうしても良いように古いライブラリを別のディレクトリにコピーしておいたわけだ。)
最後に

これと同じ作業をFreeBSD 8.2→FreeBSD 9.0RC2→FreeBSD 9.0RC3と行った。(RC2→RC3はだいぶん手順はしょったが。)そんなわけでうちはFreeBSD8をスキップすることになった。FreeBSD9のビルドはLLVM/Clangのビルドが異様に長いので気長にやりましょう。
あと自分のサーバに自分のサーバのワールド再構築のメモとか書いても、肝心なときに読めない・・・いったい誰が得する文章なのだろう。(同じ文章を他にも書いているというべきか、他からこっちにコピーしたので大丈夫ではあるけれど。) 深刻な間違いなどがあったら、コメントにください。