FreeBSD は、フリーの OS であるため、ソースが簡単に入手できます。そのソースを
コンパイルして簡単にバイナリを作成できます。FreeBSD では、簡単にソースを
入手してコンパイルし、OS をアップグレードする仕組みが用意されています。
CVSup
FreeBSD では、CVS(Concurrent Versions System)を用いてソースファイルを
管理しています。CVS上では、計算機上にリポジトリ(貯蔵所)を作り、管理したい
ファイルの全情報を格納しています。ユーザは、このリポジトリから必要なファイルを
取り出し(check out)、変更後、リポジトリへ戻します(check in)。
CVSリポジトリ自体を手元に持って来るのに、CVSup というツールを使用します。
CVSサーバには、cvsupd というプログラムが動作しています。
CVSup は FreeBSD の標準配布物には含まれていないので、別途インストールします。
CVSup は Module-3 によって書かれているため、CVSup を make するには、同時に
Module-3 もインストールする必要があります。これらは非常に面倒なので、
ここでは、ports/packages を用いてインストールを行います。
ports/packages により CVSup をインストールしたら、次は設定を行います。
設定は /usr/local/etc/supfile で行います。FreeBSD では
/usr/share/examples/cvsup ディレクトリにサンプルファイルがあるので、
これを利用します。ここでは standard-supfile を用います。同ファイルを
/usr/local/etc/supfile としてコピーし、編集します。
# cp /usr/share/examples/cvsup/standard-supfile /usr/local/etc/supfile
# vi /usr/local/etc/supfile
このファイルで必要な部分だけを抜き出すと、以下のようになります。
*default host=CHANGE_THIS.FreeBSD.org
*default base=/usr
*default prefix=/usr
*default release=cvs tag=.
*default delete use-rel-suffix
*default compress
src-all
#src-base
#src-bin
#src-contrib
#src-etc
#src-games
...
- host
CVSupサーバのホスト名を指定します。日本では
cvsup.jp.FreeBSD.org
cvsup2.jp.FreeBSD.org
cvsup3.jp.FreeBSD.org
cvsup4.jp.FreeBSD.org
cvsup5.jp.FreeBSD.org
が用意されているので、このうちネットワーク的に近いものを指定します。
- base
ステータス情報の記録用のディレクトリを指定します。
ステータス情報とは、効率化のために cvsup 自身が用いるログです。
ここでは /usr/local/etc/cvsup とします。あらかじめ、このディレクトリを
作成しておきます。
- prefix
クライアント側のリポジトリの置き場所を指定します。ここでは、
/usr/mirror とします。このように指定すると、リポジトリは /usr/mirror/src
以下のディレクトリに置かれます。
- release
FreeBSDのリリース名を指定します。これは CVSupサーバの
設定ファイルで定義されています。CVSupサーバ毎に異なりますが、FreeBSD では
"cvs"と指定します。
- tag
CVSupには、CVSモード(リポジトリをそのまま取得)と
CHECKOUTモード(指定したタグだけを取得)の 2つのモードがあります。
"tag"で、CHECKOUTモードのタグを指定します。指定の方法には、例えば
以下のようなものがあります。
tag=. -current の最新の状態
tag=RELENG_3 -stable の最新の状態 (FreeBSD3.x-Release)
tag=RELENG_3_4_0_RELEASE FreeBSD3.4-Release
アップグレードする FreeBSD のリリースに合わせて指定します。
- delete
CVSupサーバ側で削除されたファイルをクライアント側でも自動的に削除する場合に
指定します。
- use-rel-suffix
ステータス情報中でのファイル名の付け方を指定します。
- compress
データ圧縮に関する設定です。ネットワークが遅い場合には指定した方が効果が
あります。
- コレクション
コレクションとは、リポジトリの全部または一部を表します。
"src-all" は、CVSupサーバの CVSリポジトリの src ディレクトリ以下の全てを
表しています。同様に、"src-bin"は CVSリポジトリの src/bin ディレクトリを
表しています。また"cvs-all"は FreeBSD全体のリポジトリ全体を表します。
必要なCVSリポジトリに合わせて指定します。
- デフォルト設定
*default ディレクティブで、デフォルトの設定を行います。
以上を踏まえて、目的に応じて supfile を編集します。
supfile が完成したら、cvsup を起動します。起動は、以下のように
引数に supfile のパスを与えます。
# cvsup /usr/local/etc/supfile
X上で起動すると、ウィンドウが現れるので、左下にある緑の三角ボタンを押して
cvsup を開始します。無事終了すると、最下段のメッセージ領域に
"Finished successfully"と表示されます。
CVSup を CHECKOUT モードで実行した場合は、ソースファイルはすでに展開されて
いますが、CVSモードで実行した場合には、目的のソースを取り出します。
以下のように行います。
# cd /usr
# mv src src.bak
# cvs -d リポジトリ checkout src
以上により、-current の最新版のソースが /usr/src ディレクトリ以下に展開
されます。-d オプションでリポジトリが置かれているディレクトリ
(/usr/local/etc/supfile の prefix で指定したディレクトリ)を指定します。
また、-current ではなく、例えば 3.4-Release のソースを展開したい場合には、
cvs -d リポジトリ -r RELENG_3_4_0_RELEASE checkout src
というように -r オプションでタグを指定します。
make world
目的のソースが取り出せたら、make の準備をします。失敗して大事なファイルが
消えたりすると大変なので、必ずバックアップをとっておきます。
バックアップには、いろいろな方法があります。rdist,rsync によるバックアッップは
ここを、磁気テープ(DAT)による dump,rdump による
バックアップはここを御覧下さい。
バックアップ終了後、/usr/src/etc/make.conf を /etc ディレクトリにコピーし、
編集します。
# cp /usr/src/etc/make.conf /etc/
# vi /etc/make.conf
このファイルは、FreeBSD をコンパイル/リンクする際の一般設定用のファイルです。
デフォルトでは、全ての行がコメントアウトされていますので、適宣、"#"を外して
有効にしていきます。
ここでは、以下の項目を有効にします。
- CFLAGS= -O -pipe
コンパイル時のオプションを指定します。
- NOPROFILE= true
profileライブラリの作成の有無を設定します。同ライブラリはプログラムの
デバッグなどに用いるものです。ここでは作成しないようにします。
- INSTALL=install -C
インストールプログラムを指定します。install に -C を指定すると、
同じファイルがある場合には上書きしなくなります。
- NOPERL= true
perl を新しく作成するかどうかを指定します。
ここでは作成しないようにします。
- NOSUIDPERL= true
suidperl を新しく作成するかどうかを指定します。
ここでは作成しないようにします。
- NO_SENDMAIL= true
sendmail を新しく作成するかどうかを指定します。
ここでは作成しないようにします。
- PRINTERDEVICE= ascii
システムドキュメントのフォーマットを指定します。ここでは ASCII としています。
/etc/make.conf の編集が終わったら、/etc/group と /usr/src/etc/group を
比較し、後者に新しいエントリがある場合は、前者に反映しておきます。
make をする場合は、オブジェクトファイルは、/usr/obj 以下に置かれます。
同じディレクトリが存在し、残骸が残っている場合は、別の名前に変更するか、
バッサリと消去してしまいます。消去する際、schg フラグが立っていて、
root権限でも削除できない場合は、以下のようにして schg フラグを解除します。
# chflags -R noschg /usr/obj
# rm -rf /usr/obj
以上で準備が出来たので、make を行います。make のターゲットには、
以下のようなものがあります。
buildworld すべてを構築します
installworld buildworld で構築されたものをインストールします
world buildworld + installworld
update 最新のソースに更新します
most ユーザコマンドのみ作成します
installmost ユーザコマンドのみインストールします
make を実行する時には、ログを残しておくようにします。
例えば、以下のように実行します。
# make -j 4 buildworld > world.log 2>&1 &
# make installworld > install.log 2>&1 &
ここで「make -j 数値」は、複数のタスクを同時に行う指定です。
以上で make は終了です。
make後の作業
make が終了したら、その他の仕上げを行います。
「make installworld」では、
/bin、/sbin、/usr/bin、/usr/sbin、/usr/lib、/usr/share 以下のファイルが
更新されますが、/etc 以下は更新されません。同ディレクトリは各システムごとに
カスタマイズされていることが多いためです。
まずは、/etc ディレクトリのバックアップを取っておきます。
# cp -pR /etc /etc.bak
次に、適当なディレクトリを用意し、そこへ /usr/src/etc のインストールを
行います。ここでは、/tmp/root というディレクトリをルートディレクトリに
見立てて、そこへインストールします。
# mkdir /tmp/root
# cd /usr/src/etc
# make DESTDIR=/tmp/root distrib-dirs distribution
あとは、現在 /etc にあるファイルと、/tmp/root/etc にあるファイルを比較しながら
更新作業を行います。
次に、デバイスファイルも更新します。前述の /etc の更新時に /tmp/root を
ルートディレクトリに見立てましたが、このとき /tmp/root/dev ディレクトリの
中にデバイスファイルが作成されています。このデバイスファイルを /dev 以下に
コピーします。
# mv /dev /dev.bak
# cp -pR /tmp/root/dev /dev
または、/tmp/root/dev/MAKEDEV を /dev にコピーし、そこでデバイスファイルを
作成します。
# cp /tmp/root/dev/MAKEDEV /dev
# cd /dev
# ./MAKEDEV all
次に、/stand ディレクトリの更新を行います。各設定を /stand/sysinstall
によって行う場合には、必ず /stand ディレクトリを更新しておきます。
更新は以下のようにして行います。
# cd /usr/src/release/sysinstall
# make all install
最後に、カーネルを再構築してから、リブートをします。
カーネルの再構築に関しては、ここを御覧ください。
リブート後のメッセージが新しいバージョンに変わっていることを確認します。