RELEASE(7)

名称
release - リリース構築基盤

解説
FreeBSD は、ユーザが FreeBSD オペレーティングシステムのリリース全てを作成できるような完全な構築環境を 提供しています。 リリースを構築するために必要なツールの全ては、 CVS リポジトリ中の src/release に揃っています。 実のところ、 CD-ROM を焼く際に使える ISO イメージ、インストール用フロッピ、 FTP インストール用ディレクトリの生成をはじめとして、完全なリリースを コマンド一発で構築できます。 このコマンドは、 “make release” と、うまい名前が付けられています。

リリースを構築する前に、 build(7) の内容によく馴染んでおいてください。 また、ソースからのシステムアップグレードの経験も必須です。 リリース構築プロセスでは、 現在動作しているカーネルに対応したソースから、そのシステム上で “make buildworld” によってコンパイルされた結果を、 /usr/obj に置いておくことが必要です。 完全なシステムのためのオブジェクトファイルを、まっさらの chroot(8) 環境にインストールできるようにするために、これが必要となります。 リリースを進めるには、 md(4) (メモリディスク) デバイスドライバがカーネルに存在する (コンパイル済み、またはモジュールとして利用可能のいずれも可) ことも必要です。

この文書は、ソースコード管理、品質管理など、 リリースエンジニアリングプロセスに関するその他の側面は扱いません。

ターゲット
リリース用 makefile (src/release/Makefile) は、かなり難解です。 ほとんどの場合、 release ターゲットのことを考えるだけで済むと思います。

release
    “make installworld” を用いて、ファイルシステムの chroot(8) 環境にまっさらのシステムをインストールします。 指定したバージョンのソースコードをチェックアウトし、 “make buildworld” を用いて、まっさらの環境に完全なシステムを再構築します。 そのあとに、ディストリビューション別のパッケージング(まとめ上げ)、 インストール用フロッピディスクの構築、リリース文書の構築などの 細かいステップが続きます。

    このターゲットは、 kern.securelevel sysctl を -1 (デフォルト) とした root で構築する必要があります。

rerelease
    このターゲットは、リリース構築作業の結果を手で修正し、前の “make release” の中間結果を使い、最小のステップ数でリリースを再構築することを 想定したものです。

floppies
    新規のブートおよび fixit フロッピの組を作成します。 release.4, release.8, floppies.1, floppies.2, floppies.3 ターゲットを呼び、直前の “make release” のフロッピイメージを再作成します。 このターゲットは、カスタムブートフロッピの作成にもっとも良く使用されます。

“make release” により呼び出されるターゲットは次のとおりです。

release.1
    ディレクトリ ${CHROOTDIR}/R をまっさらにし、 mtree(8) を用いてシステム用のディレクトリ階層を構築します。

release.2
    システムをディストリビューション用ディレクトリにインストールします。

release.3
    GENERIC カーネルを作り、インストールします。 同時に KERNELS にリストされた他のカーネルも、作成しインストールします。

release.4
    crunchgen(1) を用いて、インストール用フロッピに収容する “crunched” バイナリを構築します。

release.5
    合成ディストリビューションを構築し、 また、作成されたディストリビューションツリーを掃除しきれいにします。

release.6
    組み立てられたディストリビューションツリーの tarball を 生成します。

release.7
    ソースディストリビューションを作成します。

release.8
    MFS root ファイルシステムを生成します。

floppies.1
    boot と kernel フロッピを生成します。

floppies.2
    fixit フロッピを生成します。

floppies.3
    ${CHROORDIR}/R/ftp/stage/floppies ステージディレクトリでの作業の仕上げをします。

ftp.1
    FTP インストールに適切な領域を ${CHROOTDIR}/R/ftp に整えます。

cdrom.1
    CD-ROM イメージ構築に適切な領域を ${CHROOTDIR}/R/cdrom に整えます。

iso.1
    CD-ROM リリース領域から ISO イメージを 2 つ構築します (インストール用と “live” ファイルシステムの 2 つ)。 デフォルトでは無効になっています。 以下の MAKE_ISOS を参照してください。

fetch-distfiles
    リリースビルドに必要な distfile で RELEASEDISTFILES にはまだ無いものを取得します。

doc.1
    FreeBSD ドキュメンテーションプロジェクトのソースドキュメント (SGML, XML) を リリースに含める HTML / テキストドキュメントに変換するために 必要なツール全てを構築します。 また、現在存在するユーザドキュメントも構築、インストールします。 これには、Handbook, FAQ, article などが含まれます。

doc.2
    リリースドキュメントを構築します。 これには、リリースノート、ハードウェアガイド、インストール作業説明書 (installation instructions) が含まれます。

環境変数
指定しなければならない環境変数は以下のとおりです。

BUILDNAME
    構築するリリースの名前。 この名前は、 sys/conf/newvers.sh の中で RELEASE の値を設定するのに使用します。 この値は uname(1) の出力を変更します。

CHROOTDIR
    chroot(8) 環境として、全リリース構築に使用するディレクトリ。 i386 アーキテクチャの場合、これが存在するファイルシステムには 少なくとも 3.2GB の空き領域が必要です。

CVSROOT
    FreeBSD CVS リポジトリの位置です。 このパス名は、実システムルートから参照され、 chroot(8) されたディレクトリツリーのルートからの参照では ありません。

オプションの変数は次のとおりです。

CVSCMDARGS
    cvs(1) のコマンド checkout と update への追加の引数です。 例えば、この変数を “-D '01/01/2002 00:00:00 GMT'” に設定して “make release” または “make rerelease” すると、 cvs(1) はそれぞれ 2002 年 1 月 1 日 00:00:00 GMT のソースを チェックアウトまたはアップデートするよう cvs(1) に指示します。

LOCAL_PATCHES
    /usr/src に対するパッチファイル。 このパッチは、リリース構築を開始する前に、 chroot(8) 環境で適用されます。

PATCH_FLAGS
    パッチファイル

DOC_LANG
    構築すべき SGML ベースドキュメンテーションの、言語とコード。 設定されないと、使用可能なすべての言語に対し、 ドキュメンテーションが構築されます。

DOCRELEASETAG
    ドキュメンテーションツリーのチェックアウト時に使用する CVS タグ。 通常、デフォルトで、ドキュメンテーションツリーの先頭が使用されます。 RELEASETAG がリリースタグを指定する場合、 関連付けられたリリースバージョンがデフォルトの代りに使用されます。

EXTLOCALDIR
    ${CHROOTDIR}/usr/local にコピーされるディレクトリ。

EXTSRCDIR
    この変数で指定されるディレクトリは、 CVS checkout によって置かれたディレクトリの代わりに、 ${CHROOTDIR}/usr/src へとコピーされます。 “rerelease” では、このディレクトリはコピーされません。 cvs update が代わりに使用されます。

KERNEL_FLAGS
    リリース構築中のカーネル構築時に、この変数の内容が make(1) に渡されます。 例えば、この変数を “-j 4” に設定すると、 make(1) に最大 4 プロセスまで同時に実行することを指示することになります。

KERNELS
    コンパイルして “ベース” 配布にインストールする、追加のカーネル設定のリストを指定します。 各カーネルは、 /boot/<config> にインストールされ、ローダから “boot <config>” でブートできるようになります。 LOCAL_PATCHES を適用する際に用いる patch(1) コマンドに渡す引数。

LOCAL_SCRIPT
    chroot(8) 環境で、ローカルパッチ適用直後に実行されるスクリプト。

MAKE_ISOS
    これを定義した場合、CD-ROM ステージのディレクトリの内容から、 ブータブル ISO CD-ROM イメージを生成します。

DISC1_LABEL
    disc1 の内容から生成される CD-ROM 用に使われるラベルです。 デフォルトは “fbsd_miniinst” です。

DISC1_NAME
    disc1 の内容から生成される CD-ROM の ISO の ファイル名の一部として使用される名前です。 デフォルトは “miniinst” です。

DISC2_LABEL
    disc2 の内容から生成される CD-ROM 用に使われるラベルです。 デフォルトは “fbsd_livefs” です。

DISC2_NAME
    disc2 の内容から生成される CD-ROM の ISO の ファイル名の一部として使用される名前です。 デフォルトは “disc2” です。

NOCDROM
    定義した場合、CD-ROM ステージのディレクトリを生成しません。

NODOC
    定義した場合、 FreeBSD ドキュメンテーションプロジェクトの SGML ベースのドキュメントを生成しません。 しかしながら、 src/share/doc にある最小のドキュメンテーションセットから “doc” ディストリビューションが依然として作成されます。

NO_FLOPPIES
    定義した場合、boot と fixit フロッピディスクイメージファイルを生成しません (これらをサポートするプラットフォーム用)。

NOPORTS
    定義した場合、Ports Collection はリリースから省略されます。

NOPORTREADMES
    これを定義した場合、 Ports Collection の各 port に対する readme ファイルを作成しません。 デフォルトの動作は、 “make release” が “make readmes” を ${CHROOTDIR}/usr/ports から実行するというものであり、莫大な時間を費すことになります。

PORTSRELEASETAG
    ports ツリーのチェックアウト時に使用する CVS タグ。 通常、デフォルトで、ports ツリーの先頭が使用されます。 RELEASETAG がリリースタグを指定する場合、 関連付けられたリリースバージョンがデフォルトの代りに使用されます。

NO_PREFETCHDISTFILES
    この変数が定義されている場合、 chroot(8) 環境に入る前に、リリース構築に必要な distfile がダウンロードされません。 NO_PREFETCHDISTFILES が設定されていない場合、取得が行われるのは、 RELEASEDISTFILES から distfile を取得完了した後であることに注意してください。

RELEASEDISTFILES
    ports 用として、リリース構築に必要となる ディストリビューションファイルが存在するディレクトリです。 これにより、低速なリンク経由で distfiles をダウンロードする際に費やされる莫大な時間を 節約することができます。

RELEASENOUPDATE
    “make rerelease” の際にこの変数の値を設定した場合、 “cvs update” によるソースコード更新を行ないません。

RELEASETAG
    構築するリリースに相当する CVS タグ。 未定義の場合、CVS ツリーの HEAD “(-CURRENT スナップショット”) から構築されます。

TARGET_ARCH
    ターゲットとなるマシンプロセッサアーキテクチャ。 この環境変数は “uname -p” の出力と同じものです。 異なるアーキテクチャ用にクロスビルドするにはこの環境変数を設定してください

TARGET
    ターゲットとなるハードウェアプラットフォーム。 この環境変数は “uname -m” の出力と同じものです。 ターゲットアーキテクチャをクロスビルドするのに必要な変数です。 例えば、PC98 マシン用にクロスビルドを行うには TARGET_ARCH=i386 と TARGET=pc98 が必要です。

WORLDDIR
    “make buildworld” が実行されたディレクトリです。 デフォルトは ${.CURDIR}/.. であり、通常は /usr/src を指します。

WORLD_FLAGS
    リリース構築中の世界 (world) 構築時に、この変数の内容が make(1) に渡されます。 例えば、この変数を “-j 4” に設定すると、 make(1) に最大 4 プロセスまで同時に実行することを指示することになります。

関連ファイル
/etc/make.conf
/usr/doc/Makefile
/usr/doc/share/mk/doc.project.mk
/usr/ports/Mk/bsd.port.mk
/usr/ports/Mk/bsd.sites.mk
/usr/share/examples/etc/make.conf
/usr/src/Makefile
/usr/src/Makefile.inc1
/usr/src/release/Makefile
/usr/src/release/${arch}/drivers.conf
/usr/src/release/${arch}/boot_crunch.conf
/usr/src/release/${arch}/fixit_crunch.conf

使用例
以下のコマンド列は FreeBSD 4.9 release を構築する際に使用したものです。

    cd /usr
    cvs co -rRELENG_4_9_0_RELEASE src
    cd src
    make buildworld
    cd release
    make release CHROOTDIR=/local3/release BUILDNAME=4.9-RELEASE \
      CVSROOT=/host/cvs/usr/home/ncvs RELEASETAG=RELENG_4_9_0_RELEASE

これらのコマンドを実行すると、FTP ディストリビューション用と、 CD-ROM ディストリビューション用として使える完全なシステムが ディレクトリ /local3/release/R にできます。

次のコマンド列は、ローカルで修正したソースツリーの “-CURRENT スナップショット” を構築するために使用できます。

    cd /usr/src
    cvs diff -u > /path/to/local.patch
    make buildworld
    cd release
    make release CHROOTDIR=/local3/release BUILDNAME=5.0-CURRENT \
      CVSROOT=/host/cvs/usr/home/ncvs LOCAL_PATCHES=/path/to/local.patch

関連項目
cc(1), crunchgen(1), cvs(1), install(1), make(1), patch(1), uname(1), md(4), drivers.conf(5), make.conf(5), build(7), ports(7), chroot(8), mtree(8), sysctl(8) FreeBSD Release Engineering, http://www.FreeBSD.org/doc/en_US.ISO8859-1/articles/releng/. FreeBSD Release Engineering of Third Party Packages, http://www.FreeBSD.org/doc/en_US.ISO8859-1/articles/releng-packages/. FreeBSD Developers' Handbook, http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/developers-handbook/.

歴史
FreeBSD 1.x では、チェックリストを手でチェックしながら、 Rod Grimes によりコンパイルされ、リリースが作成されました。 不完全さはさておくにしても、このチェックリストには、 ファイルシステムを使えるようにするためのこまごまとした要求が大量に 含まれており、その実行は拷問としかいいようがないものでした。

FreeBSD 2.0 リリースエンジニアリングを続ける中で、 src/release/Makefile を直して、隔離された無菌環境でリリースを構築する際の退屈な作業の ほとんどを自動的に行なえるようにすることに、顕著な努力が払われました。

複数のブランチにまたがる 1000 回近くの改版を経て、 src/release/Makefile の cvs(1) ログには、リリースエンジニアたちが経験した苦難のいくばくかを示す 生々しい歴史の記録が刻み込まれています。

作者
src/release/Makefile は、もともとは -nosplit Rod Grimes, Jordan Hubbard, Poul-Henning Kamp が書きました。 このマニュアルページは、 Murray Stokely <murray@FreeBSD.org> が書きました。

バグ
FreeBSD ドキュメンテーションに対するインフラストラクチャ変更は頻繁で、 これが原因でセキュリティブランチ上のリリース構築が失敗することがあります。 最後に完全にサポートされた FreeBSD リリースから ドキュメンテーションをチェックアウトし、リリース構築することで、 この問題を回避できます。 例:

    make release RELEASETAG=RELENG_4_9 DOCRELEASETAG=RELEASE_4_9_0 ...