[[PageOutline]] = Getting Started = hoge.src.rpmからVine Linux 5.2/i386用のバイナリパッケージを作成する方法。 {{{ # vbuilder --version 5.2 --arch i386 clean build # vbuilder --version 5.2 --arch i386 --unionfs clean build build-rpm /path/to/hoge.src.rpm }}} はじめにVine Linux 5.2/i386の環境を用意し、次にunionfs上でhoge.src.rpmのビルドを実施。 = vbootstrap - bootstrap a basic Vine Linux system = [browser:projects/vbootstrap/trunk] Vine Linux 上で Vine Linux のベースシステムを作成するためのスクリプト。 vbootstrap パッケージをインストールすると、利用可能になります。 {{{ # apt-get install vbootstrap }}} == Features == * chroot 環境の構築や Xen の DomainU 構築など * まずは Vine Linux 上で作成できるように。 他のシステム上でも作成できるようにするのは将来。 {{{ #!comment == bootstrap == Vine Linux 上で Vine Linux のベースシステムを作成するためのスクリプト。 * chroot 環境の構築や Xen の DomainU 構築など * まずは Vine Linux 上で作成できるように。 他のシステム上でも作成できるようにするのは将来。 * 同様の仕組みをもつものとして plus に tiny-buildfarm があるが現状では 動作しない状態になっている。 == 開発の選択肢 == 選択肢としては以下のもの。 1. ~~tiny-buildfarm をメンテナンスする~~ 2. 独自スクリプト(vbootstrap)を用意する a. __ホストの apt を利用した簡便なシステムにする__ b. ~~bootstrap 用の static な apt を用意してつかう~~ c. ~~apt に頼らないで bootstrapping できるようにする~~ 3. ~~[http://rpmstrap.pimpscript.net/ rpmstrap] を Vine Linux に対応させる~~ 4. ~~[http://code.erisian.com.au/Wiki/debootstrap debootstrap] ベースで改造する~~ 5. ~~[http://xen-tools.org/software/rinse/ rinse] を調整~~ 2.a. 案で現在 VineSeed に vbootstrap-0.0.3 投入済み。 }}} == chroot環境作成手順 == vbootstrap は大雑把には以下のような手順で chroot 環境を用意している。 詳しくはスクリプトを参照してほしい。(実際には前処理後処理なども含まれる) {{{ INSTALLDIR=/path/to/root # rpmdb の初期化 mkdir -p $INSTALLDIR/var/lib/rpm rpm --initdb --root $INSTALLDIR # apt データベースの更新 apt-get -o RPM::RootDir=$INSTALLDIR update # 基本のパッケージをインストール for i in setup glibc coreutils bash rpm apt rootfiles do apt-get -y -o RPM::RootDir=$INSTALLDIR install $i done # vine-keyring を再インストール(上でいれた apt に再度読み込ませる) apt-get -y -q --reinstall -o RPM::RootDir=$INSTALLDIR install vine-keyring # resolv.conf をホストからコピー cp -a /etc/resolv.conf $INSTALLDIR/etc/ }}} 違うバージョンの chroot を作る場合は、apt に別の sources.list を読み込ませる。 * {{{/tmp/sources.list.4.2}}} {{{ rpm http://updates.vinelinux.org/apt 4.2/i386 main plus updates }}} * apt-get の追加オプション {{{ -o Dir::Etc::sourcelist=/tmp/sources.list.4.2 }}} * 完了後に rpmdb を再構築 {{{ rm -f $INSTALLDIR/var/lib/rpm/__db.00* chroot $INSTALLDIR rpm --rebuilddb }}} == 参考: 関連 bootstrap 機構 == * Debian: [http://code.erisian.com.au/Wiki/debootstrap debootstrap] * RPMベースシステム: [http://rpmstrap.pimpscript.net/ rpmstrap] (dead?) * RPMベースシステム: [http://xen-tools.org/software/rinse/ rinse] * ALT Linux: apt-rpm (rpm) [http://en.altlinux.org/Hasher Hasher] * Fedora: yum (rpm) [http://people.redhat.com/~rjones/febootstrap/ febootstrap] = vbuilder = vbootstrap を利用して chroot 環境の構築をサポートするスクリプトです。 特に、vbuilder に src.rpm を投げると、 chroot 環境上に Vine Linux のベースシステムを構築し、 投げた src.rpm をビルドし、生成された rpm をインストールします。 主な用途としては、ある src.rpm が必要とする !BuildRequires: や Requires: の漏れを検証するために利用できます。 例えば、self-build パッケージのような、 ほとんどの環境でビルド可能なパッケージを作成するときに、 !BuildRequires: 検証を強力にサポートします。 簡単な実行例をヘルプで出すようにしていますが、基本的な流れは以下の通りです。 {{{ $ sudo vbuilder clean ← 必要であれば、あらかじめ chroot 環境を削除する。 $ sudo vbuilder build $ sudo vbuilder build-rpm hoge.src.rpm }}} これらは一度に渡すこともできて、 以下のようにすれば、順次 clean → build → build-rpm のように実行します。 {{{ $ sudo vbuilder clean build build-rpm hoge.src.rpm }}} == vbootstrap-0.0.49 に同梱されている vbuilder のヘルプ == {{{ vbuilder 0.0.49 Usage: vbuilder {--profile [profile]} {--version [version]} {--arch [arch]} {--category [categories]} {--fetch-url [fetch_url]} {--dist-upgrade} {--target [target]} {--with-compat32} {--rpmbuild-define [macro_expr]} {--rpmbuild-with [bcond_with]} {--rpmbuild-without [bcond_with]} {--sign} {--no-install} {--debug} {--help} {--bootstrap-dir [directory]} {--unionfs-dir [directory]} {--cache-dir [directory]} {--built-rpms-dir [directory]} {clean|build|build-rpm [src.rpm]|install-rpm [arch.rpm|package]|remove-rpm [package]} Options: --profile: [profile] を設定 --version: [version] を設定 (デフォルト: VineSeed) --arch: [arch] を設定 (デフォルト: x86_64) --category: [categories] を設定 (デフォルト: main,plus,nonfree) --fetch-url: パッケージを取得する [fetch_url] を設定 (デフォルト: http://updates.vinelinux.org/apt) --dist-upgrade: 6.0 経由で VineSeed ブートストラップを構築する --unionfs: unionfs でブートストラップをカバーする --target: [target] で rpm をビルドする --with-compat32: compat32 を付加して rpm をビルドする --rpmbuild-define: rpmbuild に --define [macro_expr] を与える --rpmbuild-with: rpmbuild に --with [bcond_with] を与える --rpmbuild-without: rpmbuild に --without [bcond_with] を与える --sign: ビルドされた rpm を署名する --no-install: ビルドされた rpm をインストールしない --login: root として chroot にログインする --bootstrap-dir: ブートストラップディレクトリを設定 (デフォルト: /var/local/vbootstrap) --unionfs-dir: unionfs イメージを格納するディレクトリを設定 (デフォルト: /var/local/vbootstrap/unionfs) --cache-dir: rpm のキャッシュディレクトリを設定 (デフォルト: /var/local/vbootstrap/cache) --built-rpms-dir: chroot でビルドされた rpm を格納するディレクトリを設定 (デフォルト: /home/munepi/rpm/vbuilder) --debug: デバッグモードを有効 --help: このヘルプを表示します Actions: clean: [version] のブートストラップを削除する build: [version] のブートストラップを構築する build-rpm: ブートストラップ上で [src.rpm] をビルドする install-rpm: ブートストラップ上に [arch.rpm|package] をインストールする remove-rpm: ブートストラップ上から [package] を削除する Examples: * 手元と同一バージョン、同一アーキテクチャのビルド環境を構築する: vbuilder clean build * 指定したソース rpm から rpm をビルドする: vbuilder build-rpm [src.rpm] * Vine Linux 5.2 のビルド環境を構築する: vbuilder --version 5.2 clean build * x86_64 上で i386 chroot 環境を構築する: vbuilder --arch i386 clean build * ターゲット i686 の kernel パッケージをビルドする: vbuilder --target i686 build-rpm [kernel src.rpm] * compat32 パッケージをビルドする: vbuilder --arch i386 --with-compat32 build-rpm [src.rpm] supported _: 4.2_i386 4.2_ppc 5.2_arm 5.2_i386 5.2_ppc 5.2_x86_64 6.0_i386 6.0_x86_64 VineSeed_arm VineSeed_i386 VineSeed_ppc VineSeed_x86_64 }}} == 実用例 == 例えば、hoge.src.rpm を vbuilder へ投げます。 {{{ $ sudo vbuilder clean build build-rpm hoge.src.rpm }}} ところが、すでにリポジトリにある foo-devel, bar-devel パッケージと、 まだリポジトリに上がっていないが手元にビルド済みの fuga.arch.rpm が ビルド依存に必要だったために、 hoge.src.rpm のビルドが失敗してしまいました。 foo-devel, bar-devel, fuga.arch.rpm を chroot 環境へインストールしてから、 hoge.src.rpm のビルドを再度実行してみます。 {{{ $ sudo vbuilder install-rpm foo-devel install-rpm bar-devel install-rpm /some/where/fuga.arch.rpm build-rpm hoge.src.rpm }}} また、fuga.arch.rpm に別の修正を加えたために、 hoge.src.rpm のリビルドが再度チェックする必要が出てきました。 fuga.src.rpm の検証も兼ねて、vbuilder でテストしてみます。 {{{ $ sudo vbuilder clean build build-rpm /some/where/fuga.src.rpm build-rpm hoge.src.rpm }}} など。 == vbuilder の引数の補完 == === bash === {{{${HOME}/.bashrc}}} などに、以下の行を追加します。 {{{ . /etc/bash_completion.d/vbuilder }}} 以後、bash を起動するたびに、この vbuilder の補完が有効になります。 === zsh === http://trac.vinelinux.org/browser/projects/zsh-completion にすごく大雑把に書かれた「_vbuilder」の補完用ファイルがある。これをパッケージングしたものがzsh-completion-vineパッケージなのでそれをインストールする。 あるいは、それを直接取ってきて適切なディレクトリに置く。 例えば、{{{${HOME}/.zsh.d/functions/Completion}}}を作成し、{{{${HOME}/.zshrc.local}}}に次のように追記する。 {{{ fpath=(~/.zsh.d/functions/Completion ${fpath}) autoload -U compinit compinit }}} == Tips == === --dist-upgrade === VineSeed 上の一時的な依存関係などの不具合により、 {{{ $ sudo vbuilder clean build }}} を実行しても、VineSeed の bootstrap を構築できない場合がありました。 そのような場合は、このオプションを指定して {{{ $ sudo vbuilder --dist-upgrade clean build }}} を実行すると、 現在リリースされている最新の安定版の bootstrap を一旦構築してから、 apt-line を VineSeed へ切り替えた後、apt-get dist-upgrade することにより、 VineSeed の bootstrap を構築します。 === build-rpm === {{{ $ sudo vbuilder clean build build-rpm hoge.src.rpm }}} のうち、build-rpm hoge.src.rpm は、 事前に vbuilder を当てる chroot 環境の / の存在をチェックしています。 そのとき、vbuilder を当てる chroot 環境の / が無ければ、 あらかじめ build と同等の処理をしますので、 実は、build は省略して以下のように実行しても構いません。 {{{ $ sudo vbuilder clean build-rpm hoge.src.rpm }}} === --target === 特定の target を指定し、rpmbuild --target に渡せます。 例えば、 {{{ $ sudo vbuilder --target i686 build-rpm hoge-1.0-1vl6.src.rpm }}} を実行すると、hoge-1.0-1vl6.i686.rpm がビルドされます。 === chroot 環境で生成された rpm === ユーザ foo が hoge-1.0-1vl5.src.rpm を vbuilder に投げたとします。 {{{ $ sudo vbuilder clean build-rpm hoge.src.rpm }}} このとき、chroot 環境で生成された hoge-1.0-1vl6.{i386,src}.rpm は、 foo の $HOME/rpm/vbuilder 以下の場所に、 hoge-1.0-1vl5.src.rpm と同じ所有者、同じグループとしてコピーされます。 {{{ /home/foo/rpm/vbuilder/ /home/foo/rpm/vbuilder/RPMS /home/foo/rpm/vbuilder/RPMS/i386/hoge-1.0-1vl6.i386.rpm /home/foo/rpm/vbuilder/RPMS/ppc /home/foo/rpm/vbuilder/RPMS/noarch /home/foo/rpm/vbuilder/RPMS/x86_64 /home/foo/rpm/vbuilder/SRPMS/hoge-1.0-1vl6.src.rpm }}} === --unionfs === unionfsを使うと、一度構築した最小のブートスラップに変更を加えずに、 その上に変更のみを被せることができます。 まず、最小のブーツストラップを構築します。 {{{ $ sudo vbuilder clean build }}} 以後、unionfsでブートスラップをカバーし、 hoge-1.0-1vl6.src.rpmのビルドを行います。 {{{ $ sudo vbuilder --unionfs build-rpm hoge-1.0-1vl6.src.rpm }}} --unionfs を保ったまま clean を実行すると、最小のブートスラップは消えません。 {{{ $ sudo vbuilder --unionfs clean }}} 引き続き、foo-1.0-1vl6.src.rpm をすぐさまビルドできます。 {{{ $ sudo vbuilder --unionfs build-rpm foo-1.0-1vl6.src.rpm }}} === --sign === {{{$ sudo vbuilder build-rpm ...}}} でビルドした rpm を {{{SUDO_USER}}} により鍵署名をします。 usermode で vbuilder を実行していた場合は、実行したユーザの鍵で署名します。 === --no-install === build-rpm によりビルドした rpm は、通常 chroot 内に install もします。 このオプションを指定すると、ビルドされた rpm を chroot 内に install しません。 === --bootstrap-dir, --cache-dir, --built-rpms-dir === /etc/vbootstrap/vbuilder.conf で設定されたデフォルトの各種ディレクトリ {{{VBOOTSTRAP_DIR}}}, {{{CACHE_DIR}}}, {{{BUILT_RPMS_DIR}}} をそれぞれコマンドラインから直接指定できます。 === usermode === 0.0.35 から vbuilder を usermode に対応させました。 0.0.44 以降、wheel グループに属しているユーザが、vbuilder を実行できるようにしました。 実際に、コマンドラインから {{{$ vbuilder}}} を実行すると、以下のようになります。 {{{ $ vbuilder 管理者権限を必要とする"vbuilder"を実行するには認証が必要です。 "munepi" として認証しています パスワード: }}} === --fetch-url === 別のミラーサーバからパッケージを取得するように指定できます。 このオプションは、0.0.48 から利用できます。 それまでは、事実上、デフォルトの http://updates.vinelinux.org/apt から、 パッケージを取得して、ブートストラップを構築していました。 たとえば、JAIST や KDDI Labs. ですと、以下のように指定します。 {{{ $ vbuilder --fetch-url ftp://ftp.jaist.ac.jp/pub/Linux/Vine/apt clean build $ vbuilder --fetch-url ftp://ftp.kddilabs.jp/Linux/packages/Vine/apt clean build }}} === --profile === [http://ml.vinelinux.org/vineseed/msg07626.html VineSeed:024481] を参照。 プロファイル機能は、現時点で実験的側面が強いので、大幅に仕様が変わる可能性もあります。 == TODO == * !BaseSystem の構築方法をいくつか増やす * tarball * vchroot を作成 * プロファイル (--profile ):複数の bootstrap 管理 * = __ * fakeroot, fakechroot への対応 * ~~stable/old-stableバージョンのmainカテゴリのみの環境構築 (security fix/proposed-updateなどのパッケージ作成に有用)~~ (done) * rpm作成時の自動署名機能 * autovbuilder? * {{{ $ sudo vbootstrap [option:] }}} のように拡張する * vbuilder でホスト指定してリモートでビルドできるようになるといいなあ * ssh を使う? * HTTP PUTしたら走る、みたいな感じ * 本当は vbuildd みたいなのがカコイイ * vbootstrap のキャッシュを外に * /var/local/vbootstrap/cache/VERSION * update-watch が vbuilder/vbootstrap でやった kernel とかのインストールも拾ってリブート促してくる問題 * update-watch は、Scripts::AptGet::Update::Post:: のスロットを使っている * vbuilder にビルドのログをファイルに落とす機能が欲しい * rpmbuild中のstdout (stderrも).rpm と一緒に、.log とか残るといい。 == 既知の問題 == * RPMパッケージでProvidesされたパッケージ名を (2010年3月7日現在の) aptがハンドリングしないので、BuildRequiresにそのようなパッケージ名を指定したときにエラーがでる。 * [workaround] install-rpmオプションで実パッケージ名を指定する * http://trac.vinelinux.org/changeset/969 で解決 * chroot に /dev/random がないとビルドできないパッケージがある。 * tomboy