Version 41 (modified by munepi, 12 years ago) (diff) |
---|
hoge.src.rpmからVine Linux 5.1/i386用のバイナリパッケージを作成する方法。
# vbuilder --version 5.1 --arch i386 clean build # vbuilder --version 5.1 --arch i386 --unionfs clean build build-rpm /path/to/hoge.src.rpm
はじめにVine Linux 5.1/i386の環境を用意し、次にunionfs上でhoge.src.rpmのビルドを実施。
Vine Linux 上で Vine Linux のベースシステムを作成するためのスクリプト。
vbootstrap パッケージをインストールすると、利用可能になります。
# apt-get install vbootstrap
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 を読み込ませる。
rpm http://updates.vinelinux.org/apt 4.2/i386 main plus updates
-o Dir::Etc::sourcelist=/tmp/sources.list.4.2
rm -f $INSTALLDIR/var/lib/rpm/__db.00* chroot $INSTALLDIR rpm --rebuilddb
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
Usage: vbuilder {--version [version]} {--arch [arch]} {--category [categories]} {--dist-upgrade} {--target [target]} {--with-compat32} {--rpmbuild-define [macro_expr]} {--rpmbuild-with [bcond_with]} {--rpmbuild-without [bcond_with]} {--sign} {--no-install} {--bootstrap-dir [directory]} {--cache-dir [directory]} {--built-rpms-dir [directory]} {clean|build|build-rpm [src.rpm]|install-rpm [arch.rpm|package]|remove-rpm [package]|show-info} Options: --version: set [version] (default: VineSeed) --arch: set [arch] (default: x86_64) --category: set [categories] (default: main,plus,nonfree) --dist-upgrade: make VineSeed bootstrap via 5.2 --unionfs: cover a bootstrap with unionfs --target: build rpms with [target] --with-compat32: build rpms with compat32 on boostrap --rpmbuild-define: give a option --define [macro_expr] to rpmbuild --rpmbuild-with: give a option --with [bcond_with] to rpmbuild --rpmbuild-without: give a option --without [bcond_with] to rpmbuild --sign: sign built rpms --no-install: build only a source rpm - do NOT install a built rpm --bootstrap-dir: set a bootstrap directory (default: /dev/shm/vbootstrap) --cache-dir: set a directory to cache rpms (default: /var/local/vbootstrap/cache) --built-rpms-dir: set a directory to store built rpms in chroot (default: /home/munepi/rpm/vbuilder) Actions: clean: clean the boostrap of [version] build: build a boostrap of [version] build-rpm: build [src.rpm] on a boostrap install-rpm: install [arch.rpm|package] on a boostrap remove-rpm: remove [package] on a boostrap show-info: show basic informations and logs in chroot For example, * make a clean/plain build environment on the current archtecture: vbuilder clean build * build rpms from the specified source rpm: vbuilder build-rpm [src.rpm] * make a plain build environment for Vine Linux 4.2: vbuilder --version 4.2 clean build * make a i386 chroot on x86_64: vbuilder --arch i386 clean build * build a kernel package with target i686: vbuilder --target i686 build-rpm [kernel src.rpm] * build a compat32 package: vbuilder --arch i386 --with-compat32 build-rpm [src.rpm] supported version: 4.2 4.2_i386 5.2 5.2_i386 VineSeed VineSeed_i386
例えば、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
など。
${HOME}/.bashrc などに、以下の行を追加します。
. /etc/bash_completion.d/vbuilder
以後、bash を起動するたびに、この vbuilder の補完が有効になります。
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
VineSeed 上の一時的な依存関係などの不具合により、
$ sudo vbuilder clean build
を実行しても、VineSeed の bootstrap を構築できない場合がありました。
そのような場合は、このオプションを指定して
$ sudo vbuilder --dist-upgrade clean build
を実行すると、 現在リリースされている最新の安定版の bootstrap を一旦構築してから、 apt-line を VineSeed へ切り替えた後、apt-get dist-upgrade することにより、 VineSeed の bootstrap を構築します。
$ 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 を指定し、rpmbuild --target に渡せます。 例えば、
$ sudo vbuilder --target i686 build-rpm hoge-1.0-1vl6.src.rpm
を実行すると、hoge-1.0-1vl6.i686.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を使うと、一度構築した最小のブートスラップに変更を加えずに、 その上に変更のみを被せることができます。
まず、最小のブーツストラップを構築します。
$ 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
$ sudo vbuilder build-rpm ... でビルドした rpm を SUDO_USER により鍵署名をします。
build-rpm によりビルドした rpm は、通常 chroot 内に install もします。 このオプションを指定すると、ビルドされた rpm を chroot 内に install しません。
/etc/vbootstrap/vbuilder.conf で設定されたデフォルトの各種ディレクトリ VBOOTSTRAP_DIR, CACHE_DIR, BUILT_RPMS_DIR をそれぞれコマンドラインから直接指定できます。
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 を実行できるようになります。