wiki:VineBootstrap

Version 47 (modified by munepi, 12 years ago) (diff)

vbuilder のヘルプを更新

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

projects/vbootstrap/trunk

Vine Linux 上で Vine Linux のベースシステムを作成するためのスクリプト。

vbootstrap パッケージをインストールすると、利用可能になります。

# apt-get install vbootstrap

Features

  • chroot 環境の構築や Xen の DomainU 構築など
  • まずは Vine Linux 上で作成できるように。 他のシステム上でも作成できるようにするのは将来。

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 機構

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.48 に同梱されている vbuilder のヘルプ

vbuilder 0.0.48 
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] を設定 (デフォルト: )
	--arch:			[arch] を設定 (デフォルト: )
	--category:		[categories] を設定 (デフォルト: )
	--fetch-url:		パッケージを取得する [fetch_url] を設定 (デフォルト: )
	--dist-upgrade:		 経由で 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:	ブートストラップディレクトリを設定 (デフォルト: )
	--unionfs-dir:		unionfs イメージを格納するディレクトリを設定 (デフォルト: )
	--cache-dir:		rpm のキャッシュディレクトリを設定 (デフォルト: )
	--built-rpms-dir:	chroot でビルドされた rpm を格納するディレクトリを設定 (デフォルト: )
	--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 <version>_<arch>:
    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 に対応させました。

$ vbuilder
スーパユーザー権限を必要とする"vbuilder"を実行しようとしていますが、
 実行するには追加情報が必要です。
"root" として認証中
パスワード:

と root として認証されます。

$ cat /etc/security/console.apps/vbuilder
FALLBACK=false
PROGRAM=/usr/sbin/vbuilder
GUI=no
USER=root
# UGROUPS=wheel

例えば、UGROUPS=wheel を有効にすると、 wheel グループに属しているユーザにより、 vbuilder を実行できるようになります。

TODO

  • BaseSystem の構築方法をいくつか増やす
    • tarball
  • vchroot を作成
  • プロファイル (--profile <profile>):複数の bootstrap 管理
    • <profile> = <version>_<arch>_<conf>
  • fakeroot, fakechroot への対応
  • stable/old-stableバージョンのmainカテゴリのみの環境構築 (security fix/proposed-updateなどのパッケージ作成に有用) (done)
  • rpm作成時の自動署名機能
  • autovbuilder?
  • $ sudo vbootstrap <version> <targetdir> [option:<url>] のように拡張する
  • 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にそのようなパッケージ名を指定したときにエラーがでる。
  • chroot に /dev/random がないとビルドできないパッケージがある。
    • tomboy