出自:LinuxSir.Org
pbuilder 可以通过创建 chroot 环境来自动安装编译依赖并编译 Debian 软件包(以免自己 apt-get build-dep
注:命令提示符采用 bash 风格, # 表示需要 root 权限, $ 就是不需要。
1、安装
Debian 包安装没什么可说的:
# apt-get install pbuilder
当然 aptitude, synaptic 都行,看个人习惯。建议安装其 recommends 的包。
值得注意的是目前的 cdebootstrap 有问题,大家要暂时使用 debootstrap 。
2、配置
全局配置文件在 /etc/pbuilderrc ,里面有各项参数的详细说明。个人的配置自然是编辑 ~/.pbuilderrc 。以我目前的为例:
MIRRORSITE=http://http.us.debian.org/debian # 镜像,可选 geekbone 或 cn99 。
APTCACHE="/var/cache/apt/archives" # 下载的 deb 文件缓存位置。让其和系统共用一个缓存,可以节省空间。
DEBOOTSTRAP="debootstrap" # 说过 cdebootstrap 暂时不能用啦,默认又用的是 cdebootstrap ,只好在这里改掉啦
注意,一定要注意:这些选项仅仅在创建 pbuilder 的 chroot 环境时有用,创建完成后, pbuilder 就会使用 chroot 环境里的设置。也就是说这些配置就没用了。
“那怎么改呢?” 有个 --override-config 参数,后面再说了 :)
另外, pbuilder 需要 root 权限(chroot 需要),但并不修改系统,因此配置 sudo 来运行 pbuilder 比较方便。
3、创建环境:
配置好后,可以用 create 参数来创建 chroot 环境。最简单的命令是
# pbuilder create
但请先不要着急执行。 pbuilder 默认创建的是 sid 环境,并且创建的 chroot 环境会作为 base.tgz 存储在 /var/cache/pbuilder/ 。这些设置可以通过参数来修改:
--basetgz [base.tgz location]
--distribution [distribution(sid|etch|lenny|experimental)]
详细的参数请参考 pbuilder --help 。
比如如果要创建 etch 环境:
# pbuilder create --distribution etch
创建 chroot 是一个漫长的过程。
4、更新 pbuilder chroot 环境:
sid 升级是很频繁的,如果不升级 chroot 环境,某些旧的包可能就会从 repository 里删除,导致编译依赖安装失败。升级是很容易的。
# pbuilder --update
各大镜像时不时会挂掉,这可是很郁闷的事儿。而且修改 ~/.pbuilderrc 已经没有用了。这时候就需要使用 --override-config 参数啦~ 比如 us 镜像挂掉了,但是 geekbone 还是好的:
# pbuilder update --override-config --mirror http://mirrors.geekbone.org/debian
实际上 --override-config 后面可以接各种参数,比如 --aptcache, --debootstrap 。具体的请参见 pbuilder --help 。
5、编译 Debian 包:
终于开始干正事儿了,我这里以编译打上 MSN 群补丁的 pidgin 为例
首先是建个目录来 apt-get source pidgin:
$ mkdir ~/pidgin-build && cd ~/pidgin-build
$ apt-get source pidgin
这样会下载下来 pidgin 的 Debian 源码包(包含原始档案 *.orig.tar.gz 和 Debian 的配置部分 *.diff.gz 和 *.dsc 文件)并解压。
接着下载下来本帖附件中的 MSN 群补丁(目前适用于 2.3.x )并解压:
$ gunzip 99_msn_group.patch.gz
之后把这个补丁放到 pidgin 的 debian/patches 目录下:
$ mv 99_msn_group.patch pidgin-2.3.1/debian/patches
接下来我们要修改 Debian 的 changelog ,因为编译出来的软件包的版本就是 changelog 的版本。这一步需要 devscripts ,安装 pbuilder 的时候如果选择安装 recommends 就安装好了,没有的话请自行安装。
我们编译出来的版本要大于 Debian 的版本,否则更新的时候会被要求重新下载。目前 pidgin 的版本是 2.3.1-2 ,那我们就起名为 2.3.1-2msngroup:
$ cd pidgin-2.3.1/debian
$ dch -v 2.3.1-2msngroup
之后会出现类似这样的几行:
pidgin (2.3.1-2msngroup) unstable; urgency=low
*
-- somebody
在星号后面随便填些什么就可以了,比如 Add msn group member name display patch. 然后保存退出。
下面就可以编译啦。 pbuilder 默认会把编译的结果放到 /var/cache/pbuilder/result 下,不过我们可以通过 --buildresult 来指定编译完成的包的位置。退到源码目录那一层,也就是 pidgin-2.3.1 下,执行:
$ cd .. # 或者 cd ~/pidgin-build/pidgin-2.3.1 或者 cd $(你自己创建的 pidgin-build 目录)/pidgin-2.3.1
# pdebuild --buildresult ..
然后等这它编译完成(chroot 下载安装编译依赖再编译得花一阵子了,这段时间各位想干嘛干嘛吧,编译出来的包会在 ~/pidgin-build 目录中(或者你自己选定的目录)。接下来用 dpkg -i 安装需要的部分就可以啦
这时候各位可以发现,由于编译是在 chroot 里完成的,宿主系统没有任何的修改,只是增加了编译时需要的 deb 包的缓存,想必应该比 apt-get build-dep 干净多了
方法就是这样,怎么用就要靠各位发挥想象力啦
6、几点建议:
(1) 编译前一定要先 pbuilder --update ,否则可能会无法安装依赖喔
(2) 在 backport 的时候失败是很正常的,因为新软件可能会依赖更高版本的组件。比如 stardict 需要 debhelper >=5.0.51 ,而 etch 只有 5.0.42 ,因此不进行修改是不行的。至于怎么改就超出本文的范围了
(3) 如果 backport 一系列软件是不能用 pbuilder 的。因为 pbuilder 总是会从 Debian 的 repository 来下载软件在 chroot 里使用,与你系统中的软件包无关。这种情况下大概只有老老实实 apt-get build-dep