pbuilder编译构建工具分析

1.

pbuilder(personal Debian package builder)ubuntu境下维护debian包的专业工具,能够为每个deb纯净编译构建境,自解析和安装依包,并且不染宿主系

 

2. 使用pbuilder的流程

(1) 使用pbuild create纯净编译构建境,可以通参数指定所要模debian版本

(2) 使用apt-get sourcedeb包的src

(3) 使用pbuilder build编译包,参数src包的dsc文件

(4) 回到第(2)继续编译更多的包

 

3. pbuilder的主要功能(摘自manual page)

(1) --create

建指定debian行版的编译构建境,最会打包base.tgz

(2) --update

更新base.tgz

(3) --build

编译指定的源包,通过传dsc-file指定源

(4) --clean

清空BUILDPLACEAPTCACHE中的内容。

(5) --login

chroot(login)到构建编译环。需要注意的是,exit后会自clean,期所有的操作都不会被保存,因此此命令只用于调试目的

(6) --excute

首先login编译构建,然后行指定的program。需要在参数中指定目program的路径,program会被复制到编译构建境中行。

(7) --debuild

Debian source directory(即解好的debian)编译,当前目中需要存在debian/pbuilder --debuild等价于pdebuild

 

4. pbuilder的原理

(1) 相关文件

pbuilder相关的脚本有/usr/sbin/pbuilder/usr/lib/pbuilder/*/usr/bin/pdebuild

相关的临时/var/cache/pbuilder

pbuilder运行所需的各种量如BUILDPLACE, MIRRORSITE,BUILDRESULT, DISTRIBUTION等都定配置文件中,些文件有/etc/pbuilder/*, /usr/share/pbuilder/pbuilderrc,/etc/pbuilderrc, ~/. pbuilderrc。通pbuilder-loadconfig脚本可知,些文件的依次升高/usr/share/pbuilder/pbuilderrc< /etc/pbuilderrc < ~/. pbuilderrc,即前者的配置可以被后者覆盖,最后,所有的参数又都可以通命令行参数覆盖。

 

(2) pbuilder create命令的体是pbuilder-createbuildenv

一个根目录环境,指定的debian行版。根目被打包在BUILDPLACE/base.tar.gz中,之后编译deb可以重复使用。

       (2.1) 脚本首先debian的基根目并安装基本的deb包,实际上是借助debootstrap完成的。根目录环境放在BUILDPLACE中。

       可以通参数定制debootstrap建的debian,如--arch=ARCH可指定目体系架构,--include=PACKAGES指定需要外下安装的package--variant=minbase|buildd|fakechroot|scratchbox可指定所使用的bootstrap脚本,不同的脚本建的debian境不同,主要区是安装的deb包不同,默minbase,如果要编译构建境,一般 buildddebootstrap目前所支持的debian统发行版http://neuro.debian.net/pkgs/debootstrap.html

       (2.2) 将一些重要的配置文件(hosts, hostname, resolv.conf)复制到目标环建并配置/etc/apt,添加apt keyring到目标环境中。

       (2.3) chroot到目标环,挂运行所需的目,如/proc, /dev/, /dev/pts, /selinux及用指定的需要bind mount的目

       (2.4) 在目标环境中,apt-get update,并安装build-essentialdpkg-dev以及其它的packages

       (2.5) 之前挂的运行

       (2.6) BUILDPLACE打包base.tgz

以上各步出现错误时,都会清空BUILDPLACE,避免染宿主系

 

(3) pbuilder buildpbuilder-buildpackage

它基于已有的base.tgz临时编译构建境,并在境中编译包。

       (3.1) 脚本首先base.tgz临时BUILDPLACE中,将宿主系中的重要配置文件复制,如果用指定要覆盖默apt源,重新配置临时环境中的/etc/apt,之后挂/proc等运行

       (3.2) 编译时所需的临时和文件,如BUILDRESULT,PBUILDER_BUILD_LOGFILE等。

       (3.3) chroot检查并安装编译包所需的依包,用指定的外包。

       检查并安装依包的工作,通pbuilder-satisfydepends脚本完成。脚本通解析dsc文件中的Build-Depends, Build-Depends-Indep, Build-Conflicts,Build-Conflicts-Indep等区域,得到编译包所需的依包和冲突包,利用些信息,建了一个空的debpbuilder-satisfydepends-dummy,再利用aptitude install安装dunmmy包,从而解决了依包和冲突包的问题

       (3.4) 根据参数中的dsc-file,将源文件复制到临时环(BUILDPLACE/tmp/buildd),并修改文件,同如果用指定了INPUTFILE一并复制去。最后chroot临时环,解

       (3.5) chroot的方式dpkg-buildpackage编译包。

       (3.6) 运行

       (3.7) 编译得到的deb包从BUILDPLACE/tmp/buildd复制到BUILDRESULT,默/var/cache/pbuilder/result/

       (3.8) 清除BUILDPLACE

 

5. pbuilder使用

(1) 安装pbuilder

sudo apt-get installpbuilder debootstrap devscripts

(2) 配置pbuilder使用的源

echo “MIRRORSITE=http://192.168.0.123 /ubuntu”>> /etc/ pbuilderrc

(3) 编译环

简单的方式是:

sudo pbuilder create

pbuilder会使用pbuilderrc中默的参数编译环境。

也可以通命令行参数定制:

sudo pbuilder create--distribution raring --debootstrapopts --arch=amd64 --debootstrapopts--variant=buildd

amd64架构的ubuntu raring编译环

(4) 编译

编译bc例,简单的方式是

apt-get source -d bc

sudo pbuilder buildbc_1.06.95-4ubuntu1.dsc

也可以手将源包解入源录编译

apt-get source -d bc

dpkg-source -xbc_1.06.95-4ubuntu1.dsc

cd bc-1.06.95

sudo pdebuild

 

6. 参考

https://help.ubuntu.com/community/LiveCDCustomizationFromScratch

https://wiki.ubuntu.com/PbuilderHowto

http://manpages.ubuntu.com/manpages/hardy/en/man5/pbuilderrc.5.html

http://neuro.debian.net/pkgs/debootstrap.html

 

posted @ 2014-03-27 15:25  使命召唤  阅读(2373)  评论(0编辑  收藏  举报