February 22, 2005

CVSupでFreeBSDのOSバージョンアップ

なんとなく自宅サーバのFreeBSDをバージョンアップしてみました。初めて挑戦するのにかなりいい加減です。
重要なアプリケーションはインストールされていないとは思うのですがよく覚えていないのでわからず。動かなくなるとちょっと困るのですが、以前から興味があったので思い切ってやってみました。

さて、現在のバージョンは一昔前の4.6.2。取り合えず4-STABLE(安定版)にしてみることにします。いきなり5.x系にするのはちょっと怖いし面倒なので。

作業前
# uname -a
FreeBSD home.teachat.org 4.6.2-RELEASE FreeBSD 4.6.2-RELEASE #0: Wed Aug 14 21:23:26 GMT 2002 murray@builder.freebsdmall.com:/usr/src/sys/compile/GENERIC i386


作業後 ( ̄ー ̄)
# uname -a
FreeBSD home.teachat.org 4.11-STABLE FreeBSD 4.11-STABLE #1: Tue Feb 22 09:52:51 JST 2005 root@:/usr/obj/usr/src/sys/GENERIC i386



作業にあたっては、FreeBSD ハンドブック Chapter 20. 開発の最前線がとても参考になりました。わかりやすいドキュメントです。
cvsサーバに接続してソースツリーを最新に更新にするために、まずCVSupをインストールします。

CVSup のインストール


# cd /usr/ports/net/cvsup
# make install


バージョンの確認。SNAP_16_1eよりも新しくないとダメらしい。
# cvsup -v
CVSup client, non-GUI version
Copyright 1996-2003 John D. Polstra
Software version: SNAP_16_1h
Protocol version: 17.0
Operating system: FreeBSD4
http://www.cvsup.org/
Report problems to cvsup-bugs@polstra.com
CVSup is a registered trademark of John D. Polstra


既存のソースをバックアップ
# mv /usr/src /usr/src.old
# mkdir -p /usr/src


CVSup の実行


オプションでソースを取ってくるホストを指定して、CVSupを実行します。MMX200/64MB/USEN100MB環境で13分ほどかかりました。
# /usr/bin/time /usr/local/bin/cvsup -g -L 2 -h cvsup.jp.freebsd.org -z /usr/share/examples/cvsup/stable-supfile
(中略)
Shutting down connection to server
Finished successfully
796.91 real 362.06 user 80.75 sys


各オプションの意味は下記です。こちらを参考にさせていただきました。

  • -g : GUI を使わない

  • -L 2 : 詳細情報をプリントアウト

  • -z : compression を有効に

  • -h : ソースを持ってくるサーバ名を指定。この中から適当に選択。



ソースを取得したら、まず/usr/src/UPDATINGを読まなくてはいけないそうです。
# less /usr/src/UPDATING


ふむふむふむふむふむふむふむふむ。( ´_ゝ`)
全部英語なので取り合えず読んでみてもよくわかりませんが、なんとなくわかったような気になって次に進むとします。(爆)


※カスタムカーネルにする場合はこの辺で設定するみたいですが、今回はGENERICでいいのでパス。


/etc/make.confの設定


次に/etc/make.confを設定します。無かったのでコピーしました。
# cp /etc/defaults/make.conf /etc/make.conf


※qmailの処置についてコメントを頂きました。
/etc/make.confに
NO_SENDMAIL= true

と記述することでsendmailが入るのを防げるようです。

/etc/groupの確認


新しいバージョンで必要とするgroupがあれば追加するため。
# diff /etc/group /usr/src/etc/group


シングルユーザモードに移行


「# shutdown now」でシングルユーザモードになるそうなのですがうまくいかなかったので、再起動してから起動中の
Hit [Enter] to boot immediately, or any other key for command prompt.
Booting [/boot/kernel/kernel] in 7 seconds...

というような表示の際にスペースバーを叩いて autoboot を停止させ、コマンドプロンプトから `boot -s' とタイプしてシングルユーザで立ち上げました。不要なプロセスを落とせばマルチユーザモードでもいいみたいですが、ここは作法に従って。

「ファイルシステムをチェックした後、 / を読み書き可能にして再マウント、 /etc/fstab に指定されている、 それ以外の UFS ファイルシステムをすべてマウントしてから スワップを有効にします。」
(ハンドブックより。)
# fsck -p
# mount -u /
# mount -a -t ufs
# swapon -a


/usr/objを削除


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


buildworld


更新されたソースツリーを使ってbuildworld。ソースを再構築します。4時間近くかかりました・・・( ´Д`)
# cd /usr/src
# make cleandir; make cleandir
# script /var/tmp/mw.out
# /usr/bin/time make -DNOPROFILE=true buildworld
(中略)
13018.96 real 10965.98 user 1640.16 sys
# exit

Script done, output file is /var/tmp/mw.out

※script〜の実行により、「exit」までのログが /var/tmp/mw.out に記録されます。
※「make -j4 buildworld」とかすると同時実行プロセス数を指定できるらしいですが、このマシンはスペックが低すぎるので指定しませんでした。

カーネルのコンパイルとインストール


# cd /usr/src
# /usr/bin/time make buildkernel
(中略)
--------------------------------------------------------------
>>> Kernel build for GENERIC completed on Tue Feb 22 10:12:36 JST 2005
--------------------------------------------------------------
2692.77 real 2379.69 user 246.08 sys
# /usr/bin/time make installkernel
(中略)
54.47 real 23.65 user 8.63 sys


シングルユーザモードで再起動。
# shutdown -r now


installworld


# fsck -p
# mount -u /
# mount -a -t ufs
# swapon -a
# cd /usr/src
# /usr/bin/time make -DNOPROFILE=true installworld
(中略)
--------------------------------------------------------------
>>> Rebuilding man page indices
--------------------------------------------------------------
cd /usr/src/share/man; make makedb
makewhatis /usr/share/man
makewhatis /usr/share/openssl/man
makewhatis /usr/share/perl/man
rm -rf /tmp/install.34
548.24 real 219.93 user 102.85 sys


キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
# uname -a
FreeBSD home.teachat.org 4.11-STABLE FreeBSD 4.11-STABLE #1: Tue Feb 22 09:52:51 JST 2005 root@:/usr/obj/usr/src/sys/GENERIC i386


make world で更新されないファイルの更新


mergemasterを実行して、/etc、/devの更新を行います。
mergemasterの実行により /etc、/dev のファイルが新しいファイルに入れ替わってしまうので
/etcをバックアップします。
# cp -Rp /etc /etc.org
# /usr/sbin/mergemaster -a -i


最後の再起動。これにてバージョンアップは終了。
# shutdown -r now


qmailの処置


qmailを使っている場合、/usr/sbin/sendmailが元のsendmailに戻っているので処置する必要があります。
# chmod 0 /usr/sbin/sendmail
# mv /usr/sbin/sendmail /usr/sbin/sendmail.bak
# ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail

※/etc/make.confでNO_SENDMAIL= true設定している場合には必要ないようです。

※2005/9/24 追記
/etc/make.confの設定がない場合、
/etc/mail/mailer.confが

sendmail /usr/libexec/sendmail/sendmail
send-mail /usr/libexec/sendmail/sendmail
mailq /usr/libexec/sendmail/sendmail
newaliases /usr/libexec/sendmail/sendmail
hoststat /usr/libexec/sendmail/sendmail
purgestat /usr/libexec/sendmail/sendmail

このようになってしまっていて、/var/log/maillogでこのように怒られます。
gethostbyaddr(IPv6:::1) failed: 1


このため、/etc/mail/mailer.confも下記のように修正する必要があります。/etc/make.confにNO_SENDMAIL= true設定してある場合にはおそらくこのようなことにはならないと思われます。(未検証)
sendmail /var/qmail/bin/sendmail
send-mail /var/qmail/bin/sendmail
mailq /var/qmail/bin/qmail-qread
newaliases /var/qmail/bin/newaliases
hoststat /var/qmail/bin/sendmail
purgestat /var/qmail/bin/sendmail




csvupを実行するとアプリケーションが動かなくなることがあるらしいですが、ざっと確認したところ特に問題はありませんでした。
これでOSも最新の状態に。すっきり♪。


参考サイト
http://www.freebsd.org/doc/ja_JP.eucJP/books/handbook/makeworld.html
http://yang.amp.i.kyoto-u.ac.jp/~yyama/FreeBSD/makeworld/cvsup-j.html
http://cady.moon.st/freebsd/cvsup.html
http://www.f-bell.net/FreeBSD/make_world.html
http://www.infobb.com/pc/bsd-stable.html
http://www.mvs.co.jp/tech/cvsup.html
http://telecom0.eng.niigata-u.ac.jp/index.php?FreeBSD#content_1_1

この記事へのトラックバックURL

http://app.blog.livedoor.jp/cpiblog00035/tb.cgi/14827318
この記事へのコメント
>qmailの処置
ですが/etc/make.confに
NO_SENDMAIL= true
を指定することによって、sendmailをビルド・インストールしないようにできます。
Posted by otsune at February 28, 2005 07:40
ご指摘ありがとうございます。
qmailの処置はちょっと格好悪いと思っていたのですが指定できるのですね。勉強になりました。m(_ _)m
Posted by Monologue at February 28, 2005 10:02