LinuxSir.cn,穿越时空的Linuxsir!

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

IN THE DEBIAN WAY: 构建 Debian 软件包

[复制链接]
发表于 2006-5-29 21:42:55 | 显示全部楼层 |阅读模式
以Debian的方式系列(IN THE DEBIAN WAY):

构建 Debian 软件包

etony C.F.AN etony@tom.com
v0.0.1, 2006-6-29 本文档主要简单介绍几种构建 Debian 软件包的方法.

1. 声明

    * 版本信息:

      本文档的最新版本将张贴于: LinuxSir.Org论坛 Debian 发行版讨论区 ;

      也可以从 http://debian.linuxsir.cn/ 获取.
    * 反馈:

      所有评论, 错误报告, 其他信息以及批评, 请邮寄到 etony@tom.com ;

      或在LinuxSir.Org论坛 Debian发行版讨论区 张贴.
    * 版权信息:

      本文档的版权(c)2006-2007 归 etony C.F.AN 所有.

      转载请注明源自 http://debian.linuxsir.cn/ .

2. Debian软件包介绍

在Debian中存在两种类型的软件包:

    * 源代码包

      源代码包, 包括一个描述源代码包的 .dsc 文件, 一个包含 gzip-tar 归档压缩格式的未经修改源码的 .orig.tar.gz 文件, 一个包含对源代码作 Debian 特有修改的 .diff.gz 文件. 可以使用 dpkg-source 打包和解压 debian 源码文档. 详见联机手册.
    * 二进制包

      二进制包以 .deb 扩展名来表示,这些文件通常称为DEB文件,其中包含可执行文件,文档,配置文件和版权信息及其它一些东西.可以使用 Debian 的 dpkg 工具解包(安装).但除去版权信息(和 changelog.Debian 文件)不讲,二进制包也可以是空的,这种软件包作为过渡包或关联包(也称虚拟包),它们的唯一的作用是用于满足依赖性.

在本文中我们将主要讲述 .deb 包的构建,源代码包的只会有少量舍己

软件包命名约定

Debian软件包命名遵循下列约定: <软件包名称>_<版本>-<Debian修订号>_<平台>.deb

例如

    nano_1.3.10-2_i386.deb

            软件包名称: nano
            版本: 1.3.10
            修订号: 2
            平台: i386

3. .deb 文件的结构

参阅 Debian 的软件包管理系统介绍
4. 修改现有 .deb 文件

比如 nano(1.3.10) 需要满足以下依赖关系:

    $ dpkg-deb -f nano_1.3.10-2_i386.deb depends            //depends 为对应查询段

    libc6 (>= 2.3.5-1), libncursesw5 (>= 5.4-5)

当系统不能满足依赖关系, 比如不能满足里来版本, 可以通过下边的方法处理, 当然这种情况下安装的nano并不一定运行正常, 这种方法可以应用于某些软件的变通安装.

    $ mkdir nano //创建nano目录

    $ dpkg-deb -e ./nano_1.3.10-2_i386.deb ./nano/DEBIAN    //解压控制文件

    $ dpkg-deb -x ./nano_1.3.10-2_i386.deb ./nano           //解压程序文件

    $ vi ./nano/DEBIAN/control                                //修改控制信息

    $ dpkg-deb -b nano nano_1.3.10-2_ill.deb                //重新打包

注:

下载 .deb 包的方法

    * 方法一

      运行命令

          $apt-get install -d packagename

      或

          $aptitude install -d packagename

      将下载 .deb 文件到 //var/cache/apt/archives/ 目录

      如果管理系统数据库中的对应版本不低于源上的版本将不会下载
    * 方法二

      运行命令:

          $aptitude download packagename

      将直接执行下载操作, 将 .deb 文件下载到当前目录.

5. 从当前系统构建 .deb 包

Debian软件包: dpkg-repack 可以用来重新构建已经安装到系统中的软件包为 .deb 文件. 并包含已经修改了的配置文件. 详细新息参阅:

dpkg-repack manpages



Debian GNU/Linux Anwenderhandbuch

对于某些需要修改配置后进行大面积安装的软件包, 可以是用 dpkg-repack 重新打包, 然后分发.

运行 dpkg-repack 需要 root 权限,也可以是用 fakeroot 取代 root 权限。例如:

    # aptitude install dpkg-repack

    $ fakeroot -u dpkg-repack nano
    dpkg-deb: building package `nano' in `./nano_1.3.11-2_i386.deb'.

    user@debian:~$ fakeroot -u dpkg-repack apt
    dpkg-deb: building package `apt' in `./apt_0.5.22_i386.deb'.

可以使用 dpkg-deb 进行验证

    $ dpkg-deb  -I ./nano_1.3.11-2_i386.deb
     new debian package, version 2.0.
     size 256488 bytes: control archive= 2749 bytes.
          12 bytes,     1 lines      conffiles            
         857 bytes,    22 lines      control              
        3529 bytes,    51 lines      md5sums              
         613 bytes,    21 lines   *  postinst             #!/bin/sh
         160 bytes,     5 lines   *  postrm               #!/bin/sh
         379 bytes,    20 lines   *  preinst              #!/bin/sh
         288 bytes,    14 lines   *  prerm                #!/bin/sh
     Package: nano
     Priority: important
     Section: editors
     Installed-Size: 1452
     Maintainer: Jordi Mallach <jordi@debian.org>
     Architecture: i386
     Version: 1.3.11-2
     Replaces: pico
     Provides: editor
     Depends: libc6 (>= 2.3.5-1), libncursesw5 (>= 5.4-5)
     Suggests: spell
     Conflicts: nano-tiny (<= 1.0.0-1), pico
     Conffiles:
      /etc/nanorc 0f0e96f9c7e5ffe2338e79c9aacb9b9f
     Description: free Pico clone with some new features
      GNU nano is a free replacement for Pico, the default Pine editor. Pine is
      copyrighted under a restrictive licence, that makes it unsuitable for
      Debian's main section. GNU nano is an effort to provide a Pico-like
      editor, but also includes some features that were missing in the original,
      such as 'search and replace', 'goto line' or internationalization support. .
      (Repackaged on Fri, 26 May 2006 22:17:52 +0800 by dpkg-repack.)
     Architecture: i386

    tony@tony:~/doc/build_package$

    $dpkg-deb -c ./nano_1.3.11-2_i386.deb
    drwxr-xr-x root/root         0 2006-05-26 22:17:52 ./
    drwxr-xr-x root/root         0 2006-05-26 22:17:52 ./etc/
    -rw-r--r-- root/root     13611 2006-04-06 06:22:03 ./etc/nanorc
    drwxr-xr-x root/root         0 2006-05-26 22:17:52 ./usr/
    drwxr-xr-x root/root         0 2006-05-26 22:17:52 ./usr/share/
    drwxr-xr-x root/root         0 2006-05-26 22:17:52 ./usr/share/doc/
    drwxr-xr-x root/root         0 2006-05-26 22:17:52 ./usr/share/doc/nano/
    -rw-r--r-- root/root      3419 2002-07-19 09:08:58 ./usr/share/doc/nano/BUGS.gz
    -rw-r--r-- root/root      1847 2005-08-30 02:29:02 ./usr/share/doc/nano/AUTHORS
    -rw-r--r-- root/root    102030 2006-03-30 14:34:43 ./usr/share/doc/nano/changelog.gz
    -rw-r--r-- root/root      2338 2005-03-20 05:33:13 ./usr/share/doc/nano/README
    -rw-r--r-- root/root      3234 2006-03-17 01:57:28 ./usr/share/doc/nano/THANKS
    -rw-r--r-- root/root      2206 2005-06-08 10:28:06 ./usr/share/doc/nano/TODO
    -rw-r--r-- root/root      1066 2003-03-24 21:09:26 ./usr/share/doc/nano/UPGRADE

    .....

6. 使用源提供的源代码构建 .deb 包

    * 下载源码包

      APT提供了一套简便的方法帮你获得发布版中众多程序的源代码以及创建一个.deb所需的所有文件。

      首先, 在 /etc/apt/sources.list 文件中加入 deb-src 条目. 详细参阅 APT HOWTO

      然后, 运行命令

          # apt-get update

      或

          # aptitude update

      就可以用下面的命令下载源码包:

          # apt-get source packagename

      或

          # aptitude source packagename

      通常会下载三个文件:.orig.tar.gz,.dsc 和 .diff.gz。对于 Debian 专用的软件包,最后一个文件不会下载,第一个文件的文件名中没有“orig”项。

      dpkg-source 读取 .dsc 文件信息,将源码包解包到 packagename-version 目录,下载下来的源码包中有一个 debian/ 目录,里面是创建 .deb 包所需的文件。

      例如:

          $ apt-get source nano
          Reading package lists... Done
          Building dependency tree... Done
          Need to get 1199kB of source archives.
          Get:1 http://ftp.us.debian.org testing/main nano 1.3.11-2 (dsc) [706B]
          Get:2 http://ftp.us.debian.org testing/main nano 1.3.11-2 (tar) [1173kB]      
          Get:3 http://ftp.us.debian.org testing/main nano 1.3.11-2 (diff) [25.4kB]      
          Fetched 1199kB in 3m46s (5287B/s)                                             
          ... ...
          dpkg-source: extracting nano in nano-1.3.11
          dpkg-source: unpacking nano_1.3.11.orig.tar.gz
          dpkg-source: applying ./nano_1.3.11-2.diff.gz

      做相应调整后, 在源代码的根目录 nano-1.3.11 下运行:

          # dpkg-buildpackage -rfakeroot -uc -b

      将代码编译成为软件包.

      想要下载的源码包自动编译成软件包,只需在命令行中加上 -b,例如:

          # apt-get -b source packagename

      请在下载包所在的目录中运行上面的命令。

          # dpkg -i file.deb

      apt-get的source命令与它的其它命令有所不同,普通用户权限就可以运行source命令,指定文件被下载到用户调用 apt-source package 命令时所处的目录中。
    * 编译源码包所需的软件包

      通常,编译源码包时要用到某些头文件和共享库,所有的源码包的管理文件 (control file) 中都有一个域 "Build-Depends:", 域中指出了编译该源码包需要哪些附加包。

      如果你仅仅想检查一下编译当前包需要哪些相关软件包,可以使用 apt-cache show 命令的一个变种,它将显示软件包信息中有关 Build-Depends 的行。

          $ apt-cache showsrc nano|grep Build-Depends  
          Build-Depends: dpkg-dev (>= 1.13.9), libncurses5-dev, libncursesw5-dev, libslang2-dev, debhelper (>= 5.0.22), dpatch

      APT 提供了一个简单的方法下载这些附加包,你只需运行 apt-get build-dep package, 其中 package 就是你打算编译的源码包名称。例如:

          # apt-get build-dep nano
          Reading package lists... Done
          Building dependency tree... Done
          The following NEW packages will be installed:
            build-essential dpatch g++ libncursesw5-dev libslang2-dev
          0 upgraded, 5 newly installed, 0 to remove and 0 not upgraded.
          Need to get 986kB of archives.
          After unpacking 2806kB of additional disk space will be used.
          Do you want to continue [Y/n]?

      这些用于 nano 正确编译指定源码包的附加包将会被安装。注意这个命令不能用来搜索软件的源码包,你得另外运行 apt-get source 下载源码包。

7. 对现有文件打包:

    * 创建工作目录

      构建模拟根目录, 比如 fakeroot :

          $ mkdir fakeroot

    * 部署文件

      在 fakeroot 下构建模拟文件系统, 将欲打包文件放置到对应目录

      形如:

          tony@tony:~$ tree fakeroot/
          fakeroot/
          |-- DEBIAN
          |   |-- control
          |   `-- preinst
          `-- usr
              `-- share
                  `-- doc
                      `-- securing-debian-howto.zh-cn
                          |-- ap-bind-chuser.zh-cn.html
                          |-- ap-bridge-fw.zh-cn.html
                          |-- ap-checklist.zh-cn.html
          ... ...

    * 创建配置文件

      在 fakeroot 下创建DEBIAN目录用于放置控制文件比如:

      control preinst postinst prerm postrm 等, 只有 control 是必须的, 其他为可选.

      可以在 /var/lib/dpkg/info 目录下找到这些脚本的范例

      比如

          tony@tony:~/fakeroot/DEBIAN$ cat control

          Package: securing-debian-howto.zh-cn
          Priority: extra
          Section: doc
          Maintainer: tony <etony@tom.com>
          Architecture: all
          Version: 3.0
          Description: Securing Debian Manual
          This manual describes the security of the Debian GNU/Linux operating system and within the Debian project. It covers some of the common tasks involved in setting up a secure user and network environment, gives information on the security tools available, steps to take before and after a compromise and also describes how security is enforced in Debian by the security team. The document includes a step by step hardening guide and within the appendix there is detailed information on how to setup an intrusion detection system and a bridge firewall with Debian GNU/Linux.

          tony@tony:~/fakeroot/DEBIAN$ cat preinst
          #! /bin/sh

          echo "."
          echo "."

          echo "Welcome to install Securing Debian HOWTO. "
          echo "press any key to continue... "
          read
          exit 0

    * 生成 .deb 包

      在 fakeroot 目录外执行:

          $ dpkg -b fakeroot securing-debian-howto-zh-cn.deb

          dpkg-deb: building package `securing-debian-howto.zh-cn' in `securing-debian-howto-zh-cn.deb'.

      将会在当前目录下生成 securing-debian-howto-zh-cn.deb 包
    * 检查包内容

      可是用以下命令检查:

          $ dpkg -c securing-debian-howto-zh-cn.deb

          $ dpkg -I securing-debian-howto-zh-cn.deb

8. 源代码构建

这次以 leafpad 为例, leafpad 的当前版本为 0.8.9

    * 下载程序源代码

          #wget http://savannah.nongnu.org/download/leafpad/leafpad-0.8.9.tar.gz   

    * 创建工作目录

          # mkdir leafpad  

          #mv leafpad-0.8.9.tar.gz leafpad/

          #cd leafpad

          #tar zxvf leafpad-0.8.9.tar.gz

          #cd leafpad-0.8.9

    * 安装打包环境

      运行一下命令,安装编译 leafpad 所需的环境

          # apt-get install dh-make dpkg-dev g++ patch make libc6-dev fakeroot libgtk2.0-dev cdbs debhelper pkg-config gnome-pkg-tools

    * Debian 初始化

          # dh_make -e etony@tom.com -f ../leafpad-0.8.9.tar.gz

          Type of package: single binary, multiple binary, library, kernel module or cdbs?
           [s/m/l/k/b] s

          Maintainer name : tony
          Email-Address   : etony@tom.com
          Date            : Sun, 28 May 2006 22:38:08 +0800
          Package Name    : leafpad
          Version         : 0.8.9
          License         : blank
          Type of Package : Single
          Hit <enter> to confirm:
          Done. Please edit the files in the debian/ subdirectory now. leafpad
          uses a configure script, so you probably don't have to edit the Makefiles.

    * 构建配置文件

      根据需求修改 debian/ 目录下的内容

      修改 changelog, control,

      以下为自动生成的 changelog, control 配置文件框架

          /leafpad/leafpad-0.8.9/debian$ cat control
          Source: leafpad
          Section: unknown
          Priority: optional
          Maintainer: tony <etony@tom.com>
          Build-Depends: debhelper (>= 4.0.0), autotools-dev
          Standards-Version: 3.6.2

          Package: leafpad
          Architecture: any
          Depends: ${shlibsepends}, ${miscepends}
          Description: <insert up to 60 chars description>
           <insert long description, indented with spaces>

          /leafpad/leafpad-0.8.9/debian$ cat changelog
          leafpad (0.8.9-1) unstable; urgency=low

            * Initial release Closes: #nnnn  (nnnn is the bug number of your ITP)

           -- tony <etony@tom.com>  Sun, 28 May 2006 22:38:08 +0800

      如有需要自己,根据示例文件 *.ex 生成 postinst, postrm, prerm 等脚本文件
    * 构建 .deb 包

          # dpkg-buildpackage -rfakeroot -uc -b

      如果您已经多次运行了上边的命令, 也可以使用下边的命令快速构建临时 .deb 包:

          #fakeroot debian/rules binary

      将会在其上一级目录生成 leafpad_0.8.9-1_i386.deb

9. 参考文档

    * Debian 新维护人员手册
    * 用Open Source工具开发软件: 软件包制作

10. HTML版

http://debian.linuxsir.cn/doc/in ... _build_package.html
发表于 2006-5-29 22:02:20 | 显示全部楼层
坐沙发了。。。。。支持
回复 支持 反对

使用道具 举报

发表于 2006-5-30 08:02:04 | 显示全部楼层
顶起!

不过发表日期应该是5月29日,别把我儿子的六一儿童节忽悠掉了。
回复 支持 反对

使用道具 举报

发表于 2006-5-30 08:37:13 | 显示全部楼层
再次感谢 eTony 前辈的贡献
回复 支持 反对

使用道具 举报

发表于 2006-5-30 09:13:52 | 显示全部楼层
etony的文章每次都是那么好。
学得到东西的。
谢谢。
回复 支持 反对

使用道具 举报

发表于 2007-9-13 17:30:41 | 显示全部楼层
支持一下,刚好用得到。
回复 支持 反对

使用道具 举报

发表于 2007-9-14 09:52:17 | 显示全部楼层
支持啊,学习中
回复 支持 反对

使用道具 举报

发表于 2007-9-14 13:02:39 | 显示全部楼层
支持,学习一下。
回复 支持 反对

使用道具 举报

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

本版积分规则

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