1.

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

2. 使用pbuilder的流程

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

(2) 使用apt-get source下载目标deb包的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

清空BUILDPLACE和APTCACHE中的内容。

(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,如果要创建编译构建环境,一般选用 buildd。debootstrap目前所支持的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-essential,dpkg-dev以及其它的packages。

(2.5) 卸载之前挂载的运行时目录。

(2.6) 将BUILDPLACE打包为base.tgz。

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

(3) pbuilder build的实体是pbuilder-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等区域,得到编译目标源码包所需的依赖包和冲突包,利用这些信息,创建了一个空的deb包pbuilder-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

pbuilder编译构建工具分析的更多相关文章

  1. 鸿蒙内核源码分析(构建工具篇) | 顺瓜摸藤调试鸿蒙构建过程 | 百篇博客分析OpenHarmony源码 | v59.01

    百篇博客系列篇.本篇为: v59.xx 鸿蒙内核源码分析(构建工具篇) | 顺瓜摸藤调试鸿蒙构建过程 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿 ...

  2. Nodejs编译Native Code:使用C++构建工具npm

    Nodejs的很多NPM包需要本地编译,通常是C++写的代码,例如图像处理模块等. 这是如果生产环境没有安装Visual Studio 2015等开发工具,通常会编译失败,发现了一个npm专门干这事儿 ...

  3. android ARM 汇编学习—— 在 android 设备上编译c/cpp代码并用objdump/readelf等工具分析

    学习 android 逆向分析过程中,需要学习 Arm 指令,不可避免要编写一些 test code 并分析其指令,这是这篇文档的背景. 在目前 android 提供的开发环境里,如果要编写 c / ...

  4. Erlang:[笔记一,构建工具rebar之编译]

    Rebar概述 Rebar是一款Erlang构建工具,使用它可以方便的编译,测试erlang程序和打包erlang发行版本.Rebar其实是一个独立的erlang脚本,默认情况下,Rebar会按照Er ...

  5. 前端构建工具gulp使用

    前端自动化流程工具,用来合并文件,压缩等. Gulp官网 http://gulpjs.com/ Gulp中文网 http://www.gulpjs.com.cn/ Gulp中文文档 https://g ...

  6. ES6的模块、构建工具及应用的发布

    作者:寸志链接:https://zhuanlan.zhihu.com/p/19569085来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 总的说来就是按照将来的标准书写 ...

  7. Ninja - chromium核心构建工具

    转自:http://guiquanz.me/2014/07/28/a_intro_to_Ninja/ Ninja - chromium核心构建工具Jul 28, 2014 [在线编辑] 缘由 经过上次 ...

  8. (转载)前端构建工具gulp使用

    前端构建工具gulp使用 前端自动化流程工具,用来合并文件,压缩等. Gulp官网 http://gulpjs.com/ Gulp中文网 http://www.gulpjs.com.cn/ Gulp中 ...

  9. gulp前端自动化构建工具入门篇

    现在我们通过这3个问题来学习一下: 1.什么是gulp? 2.为什么要用gulp? 3.怎么用?   什么是gulp 答:是一个前端自动化的构建工具,直白点说,如果没有这个工具,我们利用人工依旧可以做 ...

随机推荐

  1. Yii2.0 Gridview为某列增加属性

    我们知道GridView组件非常方便,会自动生成数据表格.table tr td神马的全自动生成的.但是如果想定制化稍微有点难度. 比如想在某列td上应用样式. 老写法是这样的 <?= Grid ...

  2. php-laravel中间件使用

    中间件使用 1.项目目录下cmd中php artisan make:middleware adminLogin,创建中间件 2.注册中间件(\Http\kernel.php) protected $r ...

  3. Electron小记

    一.安装 1.安装NodeJS 2.安装electronjs:npm install -g electron --unsafe-perm=true --allow-root 安装完,环境为: Node ...

  4. xxl_job springboot改造

    代码地址:https://gitee.com/sharehappy/xxl_job_springboot 官方文档:https://github.com/xuxueli/xxl-job/blob/ma ...

  5. Appium 安卓计算器demo

    package testProject; import org.openqa.selenium.*; import org.openqa.selenium.remote.DesiredCapabili ...

  6. 网络流dinic模板,邻接矩阵+链式前向星

    //这个是邻接矩阵的#include<iostream> #include<queue> #include<string.h> #include<stdio. ...

  7. http 502 bad gate way

    世界杯期间,公司的cdn在回源时突然出现大量502. 刚出现问题时,因为考虑到一般502都是上游服务器出现问题,然后因为已经服务了很久都没有出现过这种问题, 就没有仔细考虑,就让回源中心的同事进行排查 ...

  8. IO多路复用(一)-- Select、Poll、Epoll

    在上一篇博文中提到了五种IO模型,关于这五种IO模型可以参考博文IO模型浅析-阻塞.非阻塞.IO复用.信号驱动.异步IO.同步IO,本篇主要介绍IO多路复用的使用和编程. IO多路复用的概念 多路复用 ...

  9. 33.[LeetCode] Search in Rotated Sorted Array

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

  10. leetcode个人题解——#31 Next Permutation

    写这题时脑子比较混乱,重写了一遍wiki大佬的解法. 算法: According to Wikipedia, a man named Narayana Pandita presented the fo ...