FreeBSDメモ
FreeBSD4.4RELEASEから4.7STABLEにアップグレードする
2003.1.12
2003/1/7にFreeBSDのカーネルにセキュリティホールがあるという勧告が出されたため、最新のSTABLEに入れ替えてみました。
1.事前作業
- バックアップ
最低限/etcのバックアップを取ります。
cp -Rp /etc /etc-old
- /etc/make.confの確認
/etc/make.confが無いようなら、/etc/defaults/make.confを/etcにコピーして編集します。通常は、CPUTYPEとCFLAGSの前のコメントを外し、CPUTYPEには適切なCPUを書いておけばOKです。
CPUTYPE=i686
CFLAGS= -O -pipe
- 現状のシステムでちゃんと起動することを確認する。
長期間再起動していない場合は、後々問題が起きたときに切り分けられるよう、リブートしておきます。
reboot
再起動後、ログ確認および各種サービスに問題がないことを確認する。
2.ソースを取ってくる
- cvsupがインストールされていない場合は下記のようにしてインストールする。
cd /usr/ports/net/cvsup-without-gui
make install
- /usr/src以下のソースを最新のSTABLEに同期させる。
FreeBSDのサイトからstable-supfile を取ってきて適当な場所に置く。(今回は/etc/supfile とした)
ホストの場所を変更( CVSupサーバの負荷状況 を見て適当なところを選択します。)
*default host=CHANGE_THIS.FreeBSD.org
↓
*default host=cvsup6.jp.FreeBSD.org
下記の項目でどのソースを取ってくるか指定している。今回は最新のSTABLEにするので、そのままにする。(例えば、4.4STABLEにしたい場合は、RELENG_4_4とする。)
*default release=cvs tag=RELENG_4
次のコマンドでダウンロードする。
cvsup -g -L 2 -z -P - /etc/supfile
3./etc/groupの更新
- 新しくダウンロードした/usr/src/etc/groupと今まで使っていた/etc/groupを比較し、/usr/src/etc/groupにのみ含まれるグループを/etc/groupに書き足す。
逆に言うと、デフォルトのグループは削除したり変更しない方が、後々面倒が少なそうです。
4./usr/objの削除
- 過去にもmake worldをしている場合、その時構築したファイルが残っている為、依存問題が起こらないよう削除する。
cd /usr/obj
chflags -R noschg *
rm -rf *
5.ソースを再構築する
- /usr/src以下のソースをコンパイルします。ログを取っておき、終了後に問題ないか確認します。
cd /usr/src
script /var/tmp/buildworld.log
make -j4 buildworld
exit
-j4 は、同時実行プロセス数です。遅いシステムの場合は、数字を減らしたり、オプションそのものを付けるのを止めましょう。
6.カーネルの構築とインストール
- 続いて4.7STABLEのGENERICカーネルを作成・インストールします。
現在のカーネルは/kernel.oldとして保存されますが、一世代前のものを取っておきたい場合は忘れずに保存しておきます。
script /var/tmp/buildkernel.log
make buildkernel
make installkernel
exit
7.新しいカーネルの動作確認
- シングルユーザモードで再起動します。
当然のことながらtelnetでの制御は出来なくなります。
shutdown -r now
ブート中、下記の表示が出たらリターンキー以外を押し、okプロンプトに対し「boot -s」と入力する。
Hit [Enter] to boot immediataly, or any other key for command prompt.
Booting [Kernel] in 10 second ...
シングルユーザモードで立ち上がったら、下記のように入力し、ファイルシステムをマウントする。
fsck -p
mount -u /
mount -a -t ufs
swapon -a
8.新しいシステムバイナリのインストール
- 今度はカーネル以外のバイナリをインストールします。
cd /usr/src
make installworld
9./etcの更新
- STABLE化作業の終盤にして一番頭を悩ませる部分です。
まず、下記のコマンドで、新たに用意された、旧の/etcには存在しないファイルを/etcにコピーします。
mergemaster -siva
次に下記のコマンドを打ち、差分のあるファイルについて、慎重に確認していきます。
mergemaster -sivr
差分のあるファイルのdiffが表示されるので下にスクロールしながら、修正点を確認します。
一番下までスクロールすると、どうするかを聞いてきます。
d:古いファイルをそのまま残す(新しいファイルは削除)
i:古いファイルに新しいファイルを上書きする
m:画面が左右に分割され、古いファイルが左、新しいファイルが右に表示されるので、一行ずつマージしていく。
m:マージは逆にわかりにくいので、空リターンで元のファイルを残しておいて、後で手で修正した方が良さそうです。
mergemaster終了後、各種設定ファイルを反映させるか聞いてくるので、yを入力し、更新する。
10.最後に
- 再起動して最終確認する
reboot
uname -a
dmesg -a | more
ps aux
などとして、各種サービスが動いていることを確認します。
- 不要なファイルの削除
/usr/obj 配下のファイルは不要なため、削除します。
cd /usr/obj
chflags -R noschg *
rm -rf *
- カーネルの再構築
stable化が終わった状態では、GENERICカーネルになっているため、以前のカスタムカーネルをざっと見直して、再構築します。
make時にこんなエラーが出ました。
linux_proto.h:517: syntax error before `)'
linux_proto.h:517: `linux_stack_t' undeclared here (not in a function)
linux_proto.h:517: syntax error before `)'
*** Error code 1
Stop in /usr/src/sys/modules/linux.
*** Error code 1
Stop in /usr/src/sys/modules.
*** Error code 1
次のようにして対処した後、通常通りmakeしたら通りました。あと、/usr/src/sys/compile/KERNEL の中は、あらかじめ空にしておいた方が良さそうです。
cd /usr/src/sys
make cleandir
cd /usr/src/sys/modules/linux/
make clean
- モジュールなどの依存関係の問題から、各種サービスが不安定になる場合があるので、しばらく目を離さないようにします。
私の場合は、apacheとqpopperが調子悪くなったため、最新バージョンを上書きインストールして現在は問題なくなっています。
- since January, 2003. webmaster@infobb.com
InfoBB Web Site ブログ