I frequently need to package software for install on Ubuntu systems. If you manage only one server, don’t upgrade often, and don’t need to uninstall, then you may be happy with the ancient “untar, make, make install” method. But if you’re like me you prefer to create .deb packages and install those.
I run Ubuntu 8.04 “hardy” on my servers. Hardy is almost a year old now, and although it has up to date security fixes it no longer has the latest releases of software. This is fine for most purpose, but sometimes I want an updated version of some software and I’m willing to risk the slight chance that it has bugs.
The best traceroute tool around is mtr. The version in Hardy is 0.72, but Jaunty now has a package for 0.75. So let’s backport it with pbuilder.
pbuilder is by far the easiest way to backport existing packages to older releases. The Ubuntu wiki provides an excellent pbuilder HowTo. If you want to know more about Debian packages, I also advise you to read the Ubuntu Packaging Guide.
Install pbuilder:
apt-get install pbuilder
Now configure it to support multiple distributions. This means you can build packages for Dapper, Hardy, Debian Lenny, whatever; and you can build i386 packages on amd64. Here is my ~/.pbuilderrc:
# 2008-08-13 tyler # support building multiple distributions and architectures : ${DIST:=$(lsb_release --short --codename)} : ${ARCH:=$(dpkg --print-architecture)} NAME="$DIST-$ARCH" DISTRIBUTION="$DIST" DEBOOTSTRAPOPTS=("--arch" "$ARCH" "${DEBOOTSTRAPOPTS[@]}") BASETGZ="`dirname $BASETGZ`/$NAME-base.tgz" BUILDRESULT="/var/cache/pbuilder/$NAME/result/" APTCACHE="/var/cache/pbuilder/$NAME/aptcache/" # Don't rebuild source files (.diff.gz, .dsc), or list them in .changes # See Ubuntu bug 118181 DEBBUILDOPTS="-b" case "$DIST" in karmic|jaunty|intrepid|hardy|dapper) # ubuntu specific MIRRORSITE="http://archive.ubuntu.com/ubuntu/" COMPONENTS="main restricted universe multiverse" ;; sid|squeeze|lenny|etch) # debian specific MIRRORSITE="http://mirrors.kernel.org/debian/" COMPONENTS="main contrib non-free" ;; *) echo "Unknown distribution: $DIST" exit 1 ;; esac HOOKDIR=$HOME/.pbuilder-hooks
Now create your initial pbuilder root images. This will create a .tar.gz of a basic root image of that distribution, which pbuilder unpacks each time it builds packages. Do this once for each distribution and architecture for which you want to build. You select these with the DIST and ARCH environment variables.
The following builds environments for Hardy on amd64 and i386, and dapper on i386.
sudo DIST=hardy ARCH=amd64 pbuilder create
sudo DIST=hardy ARCH=i386 pbuilder create
sudo DIST=dapper ARCH=i386 pbuilder create
I run Hardy amd64 on my laptop, so I can run the first command without specifying DIST or ARCH.
sudo pbuilder create
You only need do the above once for each distribution/architecture combination you intend to support. You do not need to do it each time you build packages.
We are now ready to build mtr packages. Check the Ubuntu package archives for mtr. Note the updated mtr version for Jaunty.
Load the Jaunty mtr page, and look on the left side of the page where is says “Download Source Package mtr”. Download the three files there, ending in .dsc, orig.tar.gz, and .diff.gz. Alternatively, right-click on the .dsc and “Copy Link Location”, and use the dget command (install the “devscripts” package:
dget http://archive.ubuntu.com/ubuntu/pool/main/m/mtr/mtr_0.75-2.dsc
This will download the three needed files to the current directory. We’re now ready to build mtr with pbuilder.
sudo pbuilder build mtr_0.75-2.dsc
Or for another distribution and architecture:
sudo DIST=dapper ARCH=i386 pbuilder build mtr_0.75-2.dsc
pbuilder will now unpack the base tarball it created in /var/cache/pbuilder/hardy-amd64-base.tgz, download any packages mtr needs, and compile it, and create the .deb files. Here is my pbuilder mtr build log.
Results will be copied to /var/cache/pbuilder/DIST-ARCH/result.
tyler@baal:~$ ls /var/cache/pbuilder/hardy-amd64/result/ mtr_0.75-2_amd64.changes mtr_0.75-2_amd64.deb mtr_0.75-2.diff.gz mtr_0.75-2.dsc mtr_0.75.orig.tar.gz mtr-tiny_0.75-2_amd64.deb
Now install .deb file, and you’re done!
mtr 0.75 for Ubuntu Hardy is now in the repository.
-
I’m interested in ‘forward porting’ of php4 packages from Debian Etch to Debian Lenny.
I tried this out with pbuilder but had failed dependencies lots of things like:
Unpacking pbuilder-satisfydepends-dummy (from …/pbuilder-satisfydepends-dummy.deb) …
dpkg: dependency problems prevent configuration of pbuilder-satisfydepends-dummy:
pbuilder-satisfydepends-dummy depends on apache-dev (>= 1.3.23); however:
Package apache-dev is not installed.Is this an insurmountable obstacle?
-
ahhh I had thought that pbuilder was going to work out dependencies.
It looks as if I have to work out all the dependencies and install or build each one of them manually.
I’ve found that in many cases while the dependencies it complains about are available in Lenny pbuilder doesn’t install them while in other cases it does.
Its been pretty confusing so far, however this is possibly because I’m ‘forward porting’ rather than ‘back porting’. In working my way toward php4 I had to build db4.4 packages as Lenny appears to have 4.2,4.5 and 4.6… but 4.4 conflicts with these… so that wasn’t going to work out. I gave up at this point; as sole sysadmin in a small web development/hosting company, I don’t have time to resolve this complexity.
It would be lovely if there were already existing php4 packages for Lenny :( I know php4 won’t get any security updates but that doesn’t mean I shouldn’t maintain the rest of the packages on the servers… and we don’t have the resources to upgrade all of our apps to php5 in anything like a reasonable amount of time (ie before end-of-life for Etch).
-
Thank you. That’s really useful. I now have a very nice package for darcs2 on hardy.
-
I just went through this for the latest Apache packages from Lenny for an Etch box. The pbuilderrc is quite appreciated. I moved my care-n-feeding hooks into the user dir and everything worked. Backporting Apache 2.2 to Sarge was more of a challenge, though. I didn’t know about dget. Also awesome.
Thanks.
-
Say I want to backport a package from Jaunty to Hardy. So should I be installing the pbuilder and doing all the build process on Jaunty or Hardy. Or it does not matter?
-
Hi,
Thanks for this.
I followed this, but didn’t manage to make it happen.
The problem is that the pkg I need is coming from version 14.04 and i run 12.04
So I dget the foo.dsc and try to build it using pbuilder, but the foo.dsc needs some other pkgs version which are no exits in the verion 12.04,
so it failed.
I started to download each required pkg (bar.dsc, zoo.dsc, etc…) that foo was depend on, but then got to a endless loop, since bar.dsc also wanted some pkg that where missing in the 12.04.So I play a little with the control file of the foo pkg, and got to a point where I had only 4 pkg that need to come from version 14.04 to version 12.04.
I manage to build them, and also create a local repo, so the base image of pbuilder will be aware of them.Then try to build the foo.dsc and failed again.
What am I’m doing wrong?It’s being a week already without any sleep – and I just can’t figure it out.
Help will be mot welcome!
Thank
Sassy
-
11 comments
Comments feed for this article
Trackback link: https://www.tolaris.com/2009/03/31/backporting-debian-packages-with-pbuilder/trackback/