LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2591|回复: 6

使用pbuilder来回迁(backport)软件包

[复制链接]
发表于 2007-9-16 17:12:14 | 显示全部楼层 |阅读模式
在服务器或某些特殊环境下,系统必须使用稳定的发行版本。在这样的环境中,如果需要使用某些高版本的软件,只有通过源码进行编译。成功编译软件包时可能需要满足许多依赖条件,比如某些软件,某些函数库,某些编译环境等。在有些情况下,满足这些依赖条件比较困难或者会造成某些不便。
比如,我正在进行某个项目的开发工作,锁定了某个版本的编译工具链以及一些低版本的库函数。
又比如,编译gnuplot 4.2时会因为texlive livecd镜像不可写入而导致编译中断,必须本地安装一个tex版本才可以正常编译。

以上的情况提出了一个问题,如何在不影响当前工作环境的前提下编译所需要的软件?答案很简单,构造一个隔绝的净室或沙盒,在沙盒中进行操作,与外界环境无关。在linux中,一个沙盒就是一个可以chroot的子目录树。有一些工具可以帮助我们创建可以chroot的目录树,如debootstrap与cdebootstrap。但是,如果是为了编译,测试软件包而创建净室,pbuilder才是我们真正的帮手。
这个软件的工作方式非常简单。首先创建一个chroot镜像,这个镜像会以base.tgz的方式压缩存储。以后的所有build工作都在这个镜像中完成。
下面以编译gnuplot为例说明这个软件的使用,真的很简单。

sudo pbuilder create --distribution etch --mirror http://debian.ustc.edu.cn/debian
默认会创建sid的镜像,这里需要etch的,所以要明确指定。--mirror参数指定速度最快的镜像,否则速度有够慢的。pbuilder依赖debootstrap来创建chroot环境,可能需要你指定系统中的debootstrap实现版本,用--debootstrap参数指定。
等待一段时间后,镜像完成,文件位于/var/cache/pbuilder/下。

接下来有两种选择,一种是执行
sudo pbuilder build “package.dsc"
另一种是在软件代码目录(要求存在Debian子目录)中执行pdebuild
我选择的是后者,这个命令会在chroot环境下执行所有依赖检测安装,build与打包动作,最后会在/var/cache/pbuilder/result/目录中生成目标软件包。
需要注意的是,pbuilder编译时在/var目录下会占用较多的空间,同时还会在/var/cache/pbuilder/aptcache中缓存所有下载的软件包。根分区或/var分区大小不够的系统可能会遇到麻烦。
sudo pbuilder clean可以用来清除aptcache目录与失败的build遗留的文件。
关于pbuilder的更多信息与配置,请参阅相关文档。
发表于 2007-9-16 17:46:03 | 显示全部楼层
很好,原来只是添加高版本的源,但是有的软件没有deb包,得自己编译时确实有点头大,只好用虚拟机来再装个testing或者sid的debian,太占资源,下次用pbuilder试试。
回复 支持 反对

使用道具 举报

发表于 2008-1-11 07:02:04 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2008-1-11 21:27:26 | 显示全部楼层
..其实如果依照LFS的经验 一切都不是问题 嘿嘿..
回复 支持 反对

使用道具 举报

发表于 2008-1-12 09:41:50 | 显示全部楼层

  1. #!/bin/sh
  2. # script from Jamin W. Collins  BTS: #255165
  3. # name this script 'pbuilder-woody', 'pbuilder-sid', 'pbuilder-sarge', 'pbuilder-experimental' etc.

  4. OPERATION=$1
  5. DISTRIBUTION=`basename $0 | cut -f2 -d '-'`
  6. PROCEED=false
  7. BASE_DIR="$HOME/pbuilder"
  8. case $OPERATION in
  9.    create|update|build|clean|execute|debuild )
  10.       PROCEED=true
  11.       ;;
  12.    login )
  13.         LOGIN=true
  14.         ;;
  15. esac
  16. datum=`/bin/date +"_%Y%m%d_%H%M"`
  17. echo "Your File is at $BASE_DIR/logs/$DISTRIBUTION/$datum.buildlog "
  18. if ( $PROCEED == true ) then
  19.    shift
  20.    sudo pbuilder $OPERATION \
  21.       --override-config \
  22.       --basetgz ~/pbuilder/sid-base.tgz \
  23.       --distribution $DISTRIBUTION \
  24.       --configfile $BASE_DIR/etc/sid-pbuilderrc \
  25.       --logfile $BASE_DIR/logs/$DISTRIBUTION/$datum.buildlog \
  26.       --buildresult $BASE_DIR/result/sid $@
  27. fi

  28. if ( $LOGIN == true ) then
  29.    shift
  30.    sudo pbuilder $OPERATION \
  31.       --override-config \
  32.       --basetgz $BASE_DIR/$DISTRIBUTION-base.tgz \
  33.       --distribution $DISTRIBUTION \
  34.       --configfile $BASE_DIR/etc/sid-pbuilderrc \
  35.       --buildresult $BASE_DIR/result/sid $@
  36. fi

复制代码

建议使用这个wrapper,这样你在你的机器上可以使用多个pbuillder,比如我的机器上会同时使用sid lenny hardy gutsy feisty这些
回复 支持 反对

使用道具 举报

发表于 2008-2-12 00:47:16 | 显示全部楼层
楼上兄台:你好
我是新人,刚编译 Audacious 1.4.6 播放器费了好大的力编译成功,也可以用了,我怕以后我的ubuntu坏了以后,避免重新编译,如何用你的上面脚本把安装好audacious 打包成 deb
谢谢了!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-13 12:45:16 | 显示全部楼层
上面那个脚本只是自动在系统中维护多个pbuilder的镜像,跟你的要求没有什么关系。
至于构建deb包,其实很简单。debian维护的Audacious 源代码中有个Debian/目录,
里面有个Rules文件。这个文件是Debian特化的makefile,用它编译就能做出deb包,
具体用哪个target你自己看看,我记不清了。
在pbuilder环境中还有一个办法。

接下来有两种选择,一种是执行
sudo pbuilder build “package.dsc"
另一种是在软件代码目录(要求存在Debian子目录)中执行pdebuild
我选择的是后者,这个命令会在chroot环境下执行所有依赖检测安装,build与打包动作,最后会在/var/cache/pbuilder/result/目录中生成目标软件包。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表