wiki:VineBootstrap

Version 22 (modified by munepi, 14 years ago) (diff)

--

vbootstrap - bootstrap a basic Vine Linux system

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?: 検証を強力にサポートします。

簡単な実行例をヘルプで出すようにしていますが、

[vbootstrap-0.0.10 に同梱されている vbuilder]

$ vbuilder 
Usage:	vbuilder {--version [version]} {--arch [arch]} {--dist-upgrade} {--target [target]} {--with-compat32} {--build|--clean|--build-rpm [src.rpm]|--install-rpm [arch.rpm|package]|--remove-rpm [package]}

Options:
	--version:		set [version] (default: VineSeed)
	--arch:			set [arch] (default: x86_64)
	--dist-upgrade:		build VineSeed bootstrap via 5.0
	--target:		build rpms with [target]
	--with-compat32:	build rpms with compat32 on boostrap

Actions:
	--clean:		clean boostrap of [version]
	--build:		build boostrap of [version]
	--build-rpm:		build [src.rpm] on boostrap
	--install-rpm:		install [arch.rpm|package] on boostrap
	--remove-rpm:		remove [package] on boostrap

For example, 
* make a clean/plain build environment on the current archtecture:
vbuilder --clean --build
* build a 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
    5.0
    5.0_i386
    VineSeed
    VineSeed_i386

基本的な流れは以下の通りです。

$ 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

実用例

例えば、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

など。

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

TODO

  • vbootstrap に例外処理とかエラー処理を入れる
  • vbuilder のオプションの制御
  • 別途 conf などの設定ファイルを作成 (done)
  • chroot 内で build user つくって、そいつに rpmbuild させる (done)
  • BaseSystem? の構築方法をいくつか増やす
    • tarball
    • unionfs
    • 安定版からの dist-upgrade(VineSeed のみ) (done)
  • vchroot を作成
  • 複数の bootstrap 管理
    • /var/lib/vbootstrap 以下に、name, version, arch , workdir データを保存
    • --name, --workdir オプションの検討
    • 実行したコマンド履歴を保存、閲覧
  • fakeroot, fakechroot への対応