cowbuilder
This is the tutorial for cowbuilder. See also qemubuilder.
Usage
Initialization
Create the base image:
sudo cowbuilder --create
And a new and shiny build image is created in /var/cache/pbuilder/base.cow/
Every day usage
Update the base image
sudo cowbuilder --update
Build a package:
sudo cowbuilder --build somepackage.dsc
Tips
Bash and SVN tips
Setup your .bashrc according to:
http://upsilon.cc/~zack/blog/posts/2007/09/svn-cowbuilder/
Building your package for many distributions at once
cowbuilder is really handy to build your pet project for many distributions at once. If you have got an amd64 system, you can easily build a package for i386 and amd64 architectures and for say etch, sid and gutsy.
The first step involves creating as many basepaths as you need. I chose to put them in /var/cache/pbuilder/$DIST-$ARCH.cow.
I use an apt cache to reduce the downloads on mirrors, so my mirror is always http://apt:9999/debian or http://apt:9999/ubuntu.
I adapted a ~/.pbuilderrc file to this purpose. I stole it from the Ubuntu pbuilder howto.
if [ -n "${DIST}" ]; then DISTRIBUTION="$DIST" BUILDRESULT="/var/cache/pbuilder/result/$DIST/" if [ "$DIST" == "gutsy" ]; then echo "Adding universe" COMPONENTS="main universe" fi fi APTCACHE=""
Creating a base path :
$ DIST=etch sudo cowbuilder --create --basepath /var/cache/pbuilder/etch-amd64.cow --mirror http://apt:9999/debian
Creating an ubuntu base path which is trickier because one must :
- import ubuntu signing keys
use a backport of the latest cdebootstrap if you use etch and install pbuilder > 0.174
exclude packages of priority important in /usr/share/cdebootstrap/generic-ubuntu/packages
add universe to complete creation of chroot because the cowdancer package is in universe.
Some steps left to describe here.
$ DIST=gutsy sudo cowbuilder --create --distribution gutsy --components "main universe" --basepath /var/cache/pbuilder/gutsy-amd64.cow --mirror http://apt:9999/ubuntu --debootstrapopts --exclude=udev,pcmciautils,initramfs-tools
Building i386 base paths may be achieved by appending those options to the cowbuilder --create command line.
--debootstrapopts --arch --debootstrapopts i386
Once everything is set up, I use this script in a debian source package directory to build it for every distribution.
set -e RESULTDIR=$1 [ -d $RESULTDIR ] || mkdir $RESULTDIR DISTLIST=$(ls -d /var/cache/pbuilder/*.cow) for chrootdir in $DISTLIST do sudo cowbuilder --update --basepath $chrootdir DIST=$(basename $chrootdir | cut -d'-' -f1) [ -d $RESULTDIR/$DIST ] || mkdir $RESULTDIR/$DIST DIST=$DIST pdebuild --pbuilder cowbuilder\ --buildresult $RESULTDIR/$DIST\ -- --basepath $chrootdir done
Troubleshooting
Slow copying and removing of the COW directory
What cowbuilder does is:
cp -al /var/cache/pbuilder/base.cow /tmp/new rm -rf /tmp/new
Of course cowbuilder uses a different location than /tmp/new. You need to optimize those 2 commands on your computer. They should take around 0.2s each. If not, try to use the ext3 filesystem, for more details, see our benchmarks.