EN JA
DEVELOPMENT(7)
DEVELOPMENT(7) FreeBSD Miscellaneous Information Manual DEVELOPMENT(7)

名称

developmentFreeBSD コードベースでの開発入門

解説

このマニュアルページは、通常のシステムオペレータ、 UNIX 管理者、または開発者が、利用者のネットワークの他のマシンにエクスポートすることができるマスタ構造を保守する方法と同様に特別の許可なしで、 FreeBSD コードベースを取得し、保守し、修正する方法を記述しています。このマニュアルページは、システムオペレータ、プログラマと開発者を対象としています。

ここに記述されているものは、 FreeBSD カーネルのみならず完全な FreeBSD 環境に基づいていることに注意してください。ここに記述された方法は、開発環境が適用可能であるのと同じようにインストール物の生成も適用可能です。

マスタサーバの環境をセットアップする

利用者のマスタサーバは、常に FreeBSD オペレーティングシステムの安定したプロダクションバージョンを実行するべきです。これは、利用者が -CURRENT の構築または開発を行うことを妨げません。利用者は、環境を失い、および/または、誤りから復旧することができない状況に導くかもしれない、マスタサーバの不安定な環境で実行したくないでしょう。

/FreeBSD と呼ばれるパーティションを作成します。だいたい 20GB が推奨されます。このパーティションは、サブバージョンのツリー、取り出したソースと場合によってオブジェクトファイルを含む、ほとんどすべての開発環境を含みます。このパーティションを読み込み専用の NFS エクスポートによって他のマシンにエクスポートしようとするので、他のよりセキュリティに敏感なパーティションと混ぜてはいけません。

利用者は、 /usr/obj に関して選択を行なわなければなりません。利用者は、 /FreeBSD/usr/obj を置くことができるか、または /usr/obj それ自体のパーティションを作ることができます。いくつかの理由で、それを個別のパーティションにすることを推奨します。最初に、安全対策として、このパーティションは、大量に書き込まれるためです。 2 番目に、利用者は、一般的に、それをバックアップする必要がないためです。 3 番目に、この文書の後に記述されている開発環境をうまく組み合わせることをはるかに簡単にするためです。少なくとも 12GB の /usr/obj パーティションを推奨します。

マスタサーバでは、 FreeBSD のソースをダウンロードして維持するために svn(1) を使用します。最初の取り出しは、数ギガバイトで、長い時間かかりますが、いったんそれを取得すれば、更新は、かなり小さくなります。“ root”としてすべての svn(1) 操作を実行します。

取り出したソースと ports を /FreeBSD に保存することによって、読み込み専用の NFS を通して他のマシンにエクスポートすることができます。これはまた、1 つの場所でファイルを編集して保守する必要のみがあり、すべてのクライアントが自動的に変更を取り出すことを意味します。

mkdir /FreeBSD 
cd /FreeBSD 
svn co https://svn.freebsd.org/ports/head ports 
svn co https://svn.freebsd.org/doc/head doc 
svn co https://svn.freebsd.org/base/head src 
cd /usr 
rm -rf src 
ln -s /FreeBSD/src src

読み込み専用の NFS を通して /usr/obj を他のボックスにエクスポートすることによって、利用者は、メインサーバで構築することができ、他のボックスからインストールすることができることに注意してください。また、クライアントの一部またはすべてで構築を行いたいなら、利用者は、単に /usr/obj を、それらのクライアントのローカルディレクトリにすることができます。決して /usr/obj を読み込み書き込みモードでエクスポートするべきではありません、それは、すべての種類の問題と全面的な問題を導き、同様にセキュリティ問題をあらわにします。それは、マスタサーバで構築することと、次に、クライアントでインストールだけを行うことをさらに簡単にします。

通常 svn または portsnap によって ports ツリーを維持します。ある特別のシンボリックリンクで、マスタサーバと他のマシンのすべての両方で ports ツリーを利用可能にすることができます。次が、利用者が行うことです:

(マスタサーバとすべてのクライアントのコマンド) 
cd /usr 
rm -rf ports 
ln -s /FreeBSD/ports ports 
 
cd /usr/ports      (シンボリックリンクに入る) 
rm -rf distfiles   (マスタサーバでのみ) 
ln -s /usr/ports.distfiles distfiles (マスタサーバでのみ) 
 
mkdir /usr/ports.distfiles 
mkdir /usr/ports.workdir

/usr/ports は、すべてのクライアントで読み込み専用となるものにシンボリックリンクされるので、 ports の構築を保持する異なる作業ディレクトリを使用するように ports システムに伝えなければなりません。マスタサーバとすべてのクライアントの make.conf(5) ファイルに次の行を追加しなければなりません:

WRKDIRPREFIX=/usr/ports.workdir

すべてのマシンに渡って一貫した distfiles を保持するために使用されるディレクトリと同様に、ports 作業ディレクトリのために使用するディレクトリを作成するべきです。 /usr/ports.distfiles/usr/ports.workdir に十分な空間がないなら、通常、distfiles と作業空間が実際にある場所に (これは、マシンごとにある /usr であるので) それらのシンボリックリンクを作成します。

マスタサーバから NFS を介してエクスポートする

マスタサーバは、NFS を介して /FreeBSD/usr/obj をエクスポートする必要があるので、残りのすべてのマシンは、それらを取得することができます。セキュリティと安全性の両方のために読み込み専用のエクスポートを使用することを強く推奨します。このマニュアルページに記述している環境は、読み込み専用の NFS のエクスポートについて主として設計されています。マスタサーバの exports ファイルは、次の行を含んでいるべきです:

/FreeBSD -ro -alldirs -maproot=root: -network YOURLAN -mask YOURLANMASK 
/usr/obj -ro -alldirs -maproot=root: -network YOURLAN -mask YOURLANMASK

もちろん、NFS サーバの運用も、そのマシンで設定されなければなりません。これは、一般的に /etc/rc.conf によって行われます:

nfs_server_enable="YES" 
nfs_server_flags="-u -t -n 4"

クライアント環境

すべてのクライアントマシンは、マスタサーバから /FreeBSD/usr/obj をマウントする NFS によって簡単に、開発/構築環境のディレクトリをインポートすることができます。クライアントマシンの一般的な /etc/fstab エントリは、次のようなものになります:

masterserver:/FreeBSD     /FreeBSD        nfs     ro,bg    0       0 
masterserver:/usr/obj     /usr/obj        nfs     ro,bg    0       0

そして、もちろん、 /etc/rc.conf によって NFS クライアントの操作のためにクライアントを設定するべきです。特に、これは、クライアント側の NFS の性能を改善するように nfsiod(8) をオンに切り替えます:

nfs_client_enable="YES"

各クライアントは、NFS マウントされた環境を指す /usr/ports/usr/src のためのシンボリックリンクを作成するべきです。特別のクライアントが -CURRENT を実行しているなら、 /usr/src は、 /FreeBSD/src にシンボリックリンクされるべきです。それが -STABLE を実行しているなら、 /usr/src は、 /FreeBSD/FreeBSD-4.x/src にシンボリックリンクされるべきです。訳注: FreeBSD-4.x は、古く、FreeBSD-8.x または FreeBSD-9.x にするべきです。通常クライアントで /usr/src2 のシンボリックリンクを作成しません、というのは、マスタサーバのみでソースコードで作業するとき、便利なショートカットとして使用され、クライアントで (さまざまな人間の) おおきな混乱を生むかもしれません。

(各クライアントで) 
cd /usr 
rm -rf ports src 
ln -s /FreeBSD/ports ports 
ln -s /FreeBSD/src src

前に記述されたように、ports を構築することができるように、作業ディレクトリを作成することを忘れないでください。よい位置がないなら、それらの正確な位置へのシンボリックリンクを作成します。 /usr/ports/distfiles がマスタサーバによってエクスポートされ、したがって、すべてのマシンで同じ場所 (一般的に /usr/ports.distfiles) を指すようにすることを覚えておいてください。

mkdir /usr/ports.distfiles 
mkdir /usr/ports.workdir

カーネルの構築

ここに (主要な開発ボックスで) -STABLE カーネルを構築する方法を示します。カスタムカーネルを作成したいなら、 GENERICKERNELNAME にコピーして、次に、設定と構築の前に、それを編集します。カーネル設定ファイルは、 /usr/src/sys/i386/conf/KERNELNAME に残ります。

cd /usr/src 
make buildkernel KERNCONF=KERNELNAME

警告! -STABLE カーネルを構築する古い config/cd/make 手法に精通しているなら、 config(8) 手法は、 /usr/obj の代わりに /usr/src/sys/i386/compile/KERNELNAME の構築環境に置きます。

-CURRENT カーネルを構築します。

cd /usr/src2  (マスタサーバで) 
make buildkernel KERNCONF=KERNELNAME

カーネルのインストール

-STABLE カーネルをインストールします (一般的に、クライアント上で行われ、主要な開発サーバのために新しいカーネルをインストールしたい場合のみ、主要な開発サーバでこれを行います):

cd /usr/src 
make installkernel KERNCONF=KERNELNAME

-STABLE に対して古い config/cd/make 構築メカニズムを使用しているなら、次のものを使用してインストールします:

cd /usr/src/sys/i386/compile/KERNELNAME 
make install

-CURRENT カーネルをインストールします (一般的にクライアントでのみ行われます)。

(/usr/src は、クライアントの特有の環境を指しています) 
cd /usr/src 
make installkernel KERNCONF=KERNELNAME

WORLD の構築

この環境は、マスタサーバですべての構築を行い、次に各クライアントからインストールするように設計されています。 /usr/obj がそのクライアントでローカルである場合のみ、クライアントで構築を行うことができます。 world を構築することは、次のように容易です:

cd /usr/src 
make buildworld

利用者がマスタサーバにいるなら、-STABLE 環境で実行していますが、それは、利用者が -CURRENT の world を構築することを妨げません。単に、適切なソースディレクトリに cd(1) して、設定されます。しかしながら、うっかりマスタサーバにそれをインストールしないようにしでください!

cd /usr/src2 
make buildworld

WORLD のインストール

主要な開発サーバで構築して、クライアントにインストールすることができます。主要な開発サーバは、読み込み専用の NFS を介してクライアントに /FreeBSD/usr/obj をエクスポートしなければなりません。

注意!!! /usr/obj がマスタサーバでシンボリックリンクであるなら、各クライアントも「正確に同じ」シンボリックリンクでなければなりません。 /usr/obj/usr 中のディレクトリであるか、またはマスタサーバのマウントポイントであるなら、それは、 /usr 中の (交換しても同じように使える) ディレクトリであるか、または各クライアントのマウントポイントでなければなりません。これは、world を構築して、それをインストールするときのように、絶対パスが同じであると予想されるからで、一般的に主要な開発ボックスで、それを構築し、クライアントから、それをインストールします。 /usr/obj を適切に設定していないなら、マシンで構築して、別のところにインストールすることができません。

(クライアントで) 
(/usr/src は、クライアントの特有の環境を指しています) 
cd /usr/src 
make installworld

警告! マスタサーバで構築するが、クライアントからインストールできないなら、例えば、インストールしようとし、クライアントは、読み込み専用の /usr/obj にインストールを書き込むことを試みられたとエラーを出すなら、クライアントの make.conf(5) ファイルは、マスタサーバのものと厳密に一致せず、インストールは、構築されなかったものをインストールしようとしているようです。

クライアントで開発を行う (インストールだけでなく)

開発者は、しばしば、単にボックスをライフテスト (寿命試験) するためにクライアントのボックスで、buildkernel または buildworld を実行しなければなりません。マスタサーバで buildkernel と buildworld するのと同じ方法で、これを行います。利用者がやらなければいけないことは、 /usr/obj がローカル記憶域を指していることを確かめることだけです。利用者がアドバイスに従い、 /usr/obj をマスタサーバでそれ自体のパーティションにしたなら、それは、一般的にクライアントで NFS マウントになるでしょう。単に /usr/obj をアンマウントすることは、最後には、クライアントで一般的にローカルな /usr のサブディレクトリである /usr/obj となります。その後、利用者は、思う存分構築することができます!

ローカルブランチの維持

ソースツリーの他のバージョンを /FreeBSD/XXX に取り出すことを妨げるものは完全に何もありません。実際に、筆者の /FreeBSD のパーティションは、 OpenBSDNetBSD と様々 Linux も含んでいます。利用者は、必ずしもマスタサーバで FreeBSD 以外のオペレーティングシステムを構築することができないかもしれませんが、中央のサーバからソース配布を集めて管理できることは、たいへん便利なことで、それらの他のオペレーティングシステムを構築することができるマシンに確実にエクスポートすることができます。

多くの開発者は、パッチをテストするか、またはカスタム配布を構築するために FreeBSD のローカルブランチを管理することを選択します。これは、svn またはそれ自体のリポジトリがあるソースコード管理システム (git, mercurial, Perforce, BitKeeper) で行うことができます。

SVN による更新

更新された svn リポジトリを保守するために cron(8) ジョブを使用することによって、いつでも次のようにソースツリーを更新することができます:

(主要な開発サーバで) 
cd /usr 
svn update src doc ports

ただそれだけのことで、クライアントに全部エクスポートしているので、クライアントは、更新されたソースへの迅速な可視性があります。これは、またほとんどの svn(1) 操作が“ root”として行われることを思い出させるのにちょうどいい時です。

歴史

development マニュアルページは、はじめに Matthew Dillon <dillon@FreeBSD.org>によって書かれ、2002 年 12 月に FreeBSD 5.0 ではじめて登場しました。その後、 cvs から svn までリポジトリの変換を反映するために、 Eitan Adler <eadler@FreeBSD.org>によって大々的に修正されました。
March 7, 2013 FreeBSD