FreeBSDのベースシステム全体をソースコードから再構築することをmake worldと言います。
make world
ソースの同期
ソースを同期するために、cvsup*1というコマンドを使います。
csupの設定は、/etc/make.conf*2に、
SUP_UPDATE= yes SUP= /usr/bin/csup SUPFLAGS= -L 2 SUPHOST= cvsup.jp.FreeBSD.org SUPFILE= /usr/share/examples/cvsup/standard-supfile
のように書いておくと良い*3でしょう。こうすると、
# cd /usr/src/ # make update
を実行するだけで、/etc/make.conf内に記述した設定で、csupが実行されます。
/usr/src/UPDATINGに更新があった場合、注意深く読み、その指示に従う事がトラブルを未然に防ぐ最善の策です。
*1FreeBSD 6.2-RELEASE以降、従来のcvsupというコマンドに代わってベースシステムに取り入れられた。通常、標準で用意されています。もし、ない場合には、net/csupのportやpackageから導入できます。その場合は、インストールされる場所が違うので、上記SUPでのPATHの記述に注意して下さい。
*2もし、なければ、/usr/share/examples/etc/make.conf(4.xの場合は/etc/defaults/make.conf)を/etcにコピーする。
*3ただ、SUPHOSTを固定してしまうと、一時的にそのcvsupサーバが込んでいる場合などが原因で無駄に時間がかかることがあります。そういう場合、「fastest_cvsup」というコマンドがportsにあるので利用を検討してみるのも良いでしょう。これは数あるcvsupサーバの中から一番速いものを報告してくれるというものです。「make update」とも組み合わせて使用することが出来ます。詳しくはfastest_cvsupの利用例を参照。
コンパイル前の準備
必要があれば、/etcにあるファイルをバックアップしておきます。
# touch /var/tmp/backup-etc.tar.gz # chmod 600 /var/tmp/backup-etc.tar.gz # tar zcf /var/tmp/backup-etc.tar.gz /etc
次に、ビルドに必要な環境が整っているか確認するため、
# mergemaster -p
を実行し、master.passwdやgroupファイル、make.confの内容をチェックします*4。同期した/usr/srcに大幅な変更が加えられない限り、普通、問題ないと思いますが、もし問題があれば、ビルドやインストールに失敗する可能性があるので、適宜、修正しておいて下さい。
*4詳細は、mergemaster(8)参照。
コンパイル
コンパイルは、念のため、ログをとりながら*5行うことにします。
# cd /usr/src # ( date && make buildworld; date ) |& tee buildworld.log # ( date && make KERNCONF=MYKERNEL buildkernel; date ) |& tee buildkernel.log # ( date && make KERNCONF=MYKERNEL installkernel; date ) |& tee installkernel.log
ここで、KERNCONFに渡している引数MYKERNELは、/usr/src/sys/i386/conf/に置いた、カーネルのコンフィギュレーションファイルのファイル名です。毎回、コマンドラインから渡すのが面倒であれば、あらかじめ、/etc/make.confに
KERNCONF=MYKERNEL
などと記述しておくと良いでしょう。
次に、シングルユーザモードで起動して、installworldを行います。 いったん再起動しましょう。
# shutdown -r now
*5ここでは、cshを使用しているので、他のシェルではリダイレクトの扱いが異なる場合があります。
シングルユーザモードでの起動
FreeBSD 5.x以降の場合は、起動時のメニューから「4」を押せばシングルユーザーモードに入ります。
FreeBSD 4.xの場合、起動時、バトンがくるくる回りながら、kernelを10秒後にロードするという箇所が現れます。そこで、Enter以外のキーを押すと、ブロンプトが出てブート・オプションを選べます。 シングルユーザーモードで起動しますので、
boot -s
と入力します(後は、5.xと同じ)。
まず最初に、シェルを選択するのですが、ここでは、shを選択します。
シェルを選択した後、以下を呪文のように実行します*6。
# fsck -p # mount -u / # mount -a -t ufs # swapon -a # adjkerntz -i
続いて、ソースのあるディレクトリに入り、installworldを行うのですが、前回と同じ様にログを取りながら実行することにします。 ただし、今回はシェル*7が、shであるので、パイプの取扱いが違うことに注意しましょう。
# cd /usr/src # ( date && make installworld ; date 2>&1 ) | tee installworld.log
もし、キーボードの配列がおかしくなってる場合、kbdmapと入力することによって、 変更できます。
最後に、mergemasterを実行し、/etc内のファイルと/usr/src/etc内のファイルを比較して、更新箇所があれば、適宜、修正します。
# mergemaster
以上、問題が無いようであれば、再起動します。
FreeBSD 5.4→6.0移行メモ
以下は、既にFreeBSD 5.4をインストールしてある環境を、ソースコードから、FreeBSD 6.0にアップグレードした際のメモです。
# uname -r 5.4-RELEASE-p8
準備
ソースを同期した際、/usr/src内にあるCVSタグが打たれているファイルは、リモートのものより古いバージョンであれば、ファイルが上書きされます。/usr/src/sys/i386/conf/GENERIC等は、古いバージョンであっても、以前作成したカーネルのコンフィギュレーションファイルを使いまわそうとする場合、参照できた方が便利なので、必要に応じて、別の場所に退避させておきます。
# cp -p /sys/i386/conf/GENERIC /var/tmp/GENERIC-5
mergemaster(8)を実行しない限り、/etc内のファイル群には変更は加えられませんが、念のために、ここで、/etc内にあるものをバックアップしておきます。
# touch /var/tmp/backup-etc.tar.gz # chmod 600 /var/tmp/backup-etc.tar.gz # tar zcf /var/tmp/backup-etc.tar.gz /etc
さて、cvsupを使いソースツリーを同期させます。事前にSUPFILE内のtagの箇所を、RELENG_6_0に変更していることが前提です。
# cd /usr/src # make update |& tee update.log
次に、ビルド前の準備として、「mergemaster -p」を実行してユーザやグループに変更を加えます。
# mergemaster -p
通常、マージを選択し、既存のユーザやグループを新しいファイルの方に反映させてインストールし、データベースを更新します。ちなみに、マージの際、既存のファイルは画面の左、新しいものは画面の右側に表示されます。
この過程で、/etc/make.confと/usr/src/share/examples/etc/make.confの内容が比較されて終了します。現在使用しているmake.confを新しい様式にあわせる方法を採っても良いですが、ここでは、現在のmake.confをバックアップして、新しいものをソースからコピーして、それに修正を加えることにします*8。
# cd /etc # mv make.conf make.conf.bak # cp /usr/src/share/examples/etc/make.conf .
構築
ソースツリーに入り、ビルドを行います。新しいカーネルをビルドする環境を整えるため、最初に行うのは「buildworld」です。
# cd /usr/src # make buildworld |& tee buildworld.log # make buildkernel |& tee buildkernel.log # make installkernel |& tee installkernel.log
構築したカーネルで起動できるかテストするため、再起動します。
# shutdown -r now
シングルユーザモード
起動時のブートメニューで「4」を押し、シングルユーザモードに入ります。シェルに「/bin/sh」を選択し、
# fsck -p # mount -u / # mount -a -t ufs # swapon -a # adjkerntz -i
を実行。続いて、ソースツリーに入り、installworldを行います。
# cd /usr/src # make installworld 2>&1 | tee installworld.log
数が多いので大変ですが、/etcの内容を更新します。
# mergemaster
古いライブラリやそれに依存しているportsを削除
共有ライブラリのバージョンが変わっているので、既にインストールされているportsを全て削除します*9。
# cd /var/db/pkg # ls > /var/tmp/pkg.list # find . -type d | xargs pkg_delete
続いて、古いライブラリや、6.0ではインストールされなかったファイル等を削除して、掃除します。
# cd / && sh removal-6.0.sh
- removal-6.0.sh - とりあえず、古いのを列挙しただけ。参考までに。
ここまでで大体出来上がり。
# uname -r 6.0-RELEASE
再起動し、その後、新しい環境下で以前のバージョンのライブラリに依存しないportsを新しく構築し直します。
FreeBSD 6.0→6.1移行メモ
以下を参照して下さい。