NetBSD 4.0.1 を NetBSD 5 stable にソースから上げる

NetBSD 5.0 をリリース直後に VMware Player に入れたんだけど,これから常用アプリをいろいろと入れるのがめんどうだなあ,そのあいだ VMware Player をふたつ(NetBSD 5.0 と常用している NetBSD 4.0.1 と)動かすのは重いなあ,と放置していた。で,4.0.1 を 5 の stable ブランチにソースからアップデートすることにした。いままではシステムをインストールしたらそのままずっと使っていたけど,いずれ stable ブランチを追いかけるつもりだった。いい機会なので今そうしてしまおう。

しかし新規にインストールするのとはちがって,ソースからアップデートするのはシステムのすべてが更新されるわけではないから,stable や current を追いかけてソースからアップデートしつづけるのは,変更点をきちんと追いかけられるとか問題解決のスキルが高いとかいうひとだけがすべきなのかもしれない。security/critical ブランチ(リリース後,セキュリティーホールや重大なバグの修正だけがほどこされるブランチ)は追いかけるべきだと思うけど。ソースからアップデートしているひとの日記をいろいろと見ると,たとえば /dev のデバイスノードの数が(ふるいシステムのままだから)少なくて問題が起きたとかいうのを見かける。あとたとえばデフォルトのファイルシステムがよりよいものに変更されたりしたら,アップデートしても当然ファイルシステムは古いままで,手動でつくりなおさないと恩恵にあずかれなかったりするだろう。

作業手順:
Chapter 32. Updating an existing system from sources
http://www.netbsd.org/docs/guide/en/chap-updating.html

ソースの取得

29.4. Fetching by CVS
http://www.netbsd.org/docs/guide/en/chap-fetch.html#chap-fetch-cvs

ソース(src/ と xsrc/)は標準的には /usr に置くが,~/tmp/netbsd に置くことにする。

src/doc/BRANCHES を見ると NetBSD 5 stable のブランチタグは「netbsd-5」。
$ cd ~/tmp/netbsd
$ cvs -qz3 -d anoncvs@anoncvs.NetBSD.org:/cvsroot co -r netbsd-5 -P src xsrc
8 時間 43 分かかった。du すると src が 1.2 GB,xsrc が 796 MB。ちなみに du に 12 分かかった。

いったん checkout すれば,今後は次のようにしてソースを最新の状態に更新できる:
$ cd ~/tmp/netbsd/src
$ cvs -qz3 update -dP
$ cd ../xsrc
$ cvs -qz3 update -dP

ビルド

ビルドしたりインストールしたりは,src のトップにある build.sh を叩くことでおこなう。build.sh の使いかたを見るには,簡潔には -h,詳細には src/BUILDING の「The "build.sh" script」。

で,ユーザーランドとカーネルのビルド。設定できる項目は mk.conf に書いておくこともできるけど,とりあえず設定したいものは少なかったのでコマンドラインに直接書く。カーネルの設定はとりあえず GENERIC で:
$ cd src
$ mkdir ../{obj,tools}
$ ./build.sh -O ../obj -T ../tools -U -u distribution
$ ./build.sh -O ../obj -T ../tools -U -u kernel=GENERIC
インストールされるものは obj/destdir.i386 に配置される。

なるほど,ビルドに使うツールをまずつくって ../tools に入れておくんだな。いまのシステムのツールを使っては問題が起きるときもあるのではと思っていたんだが。

今回は X ははずした。いずれアップデートしよう。

ユーザーランドのビルドは 12 時間,カーネルのビルドは 53 分。du すると obj が 1.2 GB,tools が 43 MB。

インストール

まずカーネルを入れてリブート:
# mv -i /netbsd /netbsd.old
# cp -p ../obj/sys/arch/i386/compile/GENERIC/netbsd /
# chown root:wheel /netbsd
# shutdown -r now
とりあえず問題なくリブートした。uname -a してニンマリしたあとユーザーランドを入れる:
# cd ~ta/tmp/netbsd/src
# ./build.sh -O ../obj -T ../tools -U install=/
所要時間 11 分。

/etc の設定ファイルを更新する:
# /usr/sbin/etcupdate -s ~ta/tmp/netbsd/src
内容がくいちがうファイルひとつひとつについて,差分を表示して,そのままにするか置きかえるかマージするかインタラクティブにたずねてくる。たくさんあってつかれた。手動でいじった記憶のある /etc/master.passwd,/etc/passwd(たずねられた記録が残っていないけどたずねられたはず),/etc/rc.conf,/etc/shells は差分を見て置きかえたりマージしたりした。あとはすべてあたらしいもので置きかえた。途中で ^C してもういちど etcupdate を叩いたら,中断したところから再開できた。

で,リブート:
# shutdown -r now
リブートしたらキーボードの配置が US と誤解されている。そうか,手動で書きかえた設定ファイル以外にも,前回システムを入れたときにインストーラーでおこなった設定によって書きかえられていたファイルもあったんだな。とりあえず手動でキーボードの配置を変える:
# wsconsctl -w encoding=jp
次に起動したときのために /etc/wscons.confを書きかえる:
-#encoding sv
+encoding jp
/etc をチェックすると passwd と master.passwd がマージしたつもりがなぜか古いまま。obj/destdir.i386/etc にあるものを手動でマージして pwd_mkdb /etc/master.passwd した。

ログインしたら「このシステムは stable ブランチのスナップショットだよ,リリース品質になってないかもよ」なんてメッセージ(内容は /etc/motd)が出るようになった。stable ブランチってそんなことを言わなくちゃいけないようなものなのか。最新リリースの security/critical ブランチを追いかけたほうがいいのかも。参考:
http://www.netbsd.org/releases/release-map.html

いまのところ,あたらしいコマンドも古いコマンドも問題なく動いている。/lib などを見ると古い共有ライブラリーも残されている。なるほど,だから古いコマンドも動くんだな。しかし共有ライブラリーのメジャーバージョンがおなじなら古いものを削除してくれてもいいのにとは思う。実行ファイルは上書きしてしまって古いのは残っていないから,共有ライブラリーだけ取っておいたって,古いシステムに戻すこともできないんだし。

::2009-06-07

update : 2009/06/08 (Mon) 06:19:07