dpkg制作deb包详解

时间:2024-03-26 19:16:29

1 deb包文件结构

       deb 软件包里面的结构,它具有DEBIAN和软件具体安装目录(如etc, usr, opt, tmp等)。在DEBIAN目录中至少必须包括control文件,还有可能postinst(postinstallation)postrm(postremove)preinst(preinstallation)prerm(preremove)copyright (版权)、changlog (修订记录)和conffiles等。

control文件:描述软件包的名称(Package),版本(Version),描述(Description)等,是deb包必须剧本的描述性文件,以便于软件的安装管理和索引。为了能将软件包进行充分的管理,可能还具有以下字段:

  Section:申明软件的类别,常见的有`utils’, `net’, `mail’, `text’, `x11′ 等;

  Priority:申明软件对于系统的重要程度,如`required’, `standard’, `optional’, `extra’ 等;

  Essential:申明是否是系统最基本的软件包(选项为yes/no),如果是的话,这就表明该软件是维持系统稳定和正常运行的软件包,不允许任何形式的卸载(除非进行强制性的卸载)

  Architecture:软件包结构,如基于`i386′, ‘amd64’,`m68k’, `sparc’, `alpha’, `powerpc’ 等;

  Source:软件包的源代码名称;

  Depends:软件所依赖的其他软件包和库文件。如果是依赖多个软件包和库文件,彼此之间采用逗号隔开;

  Pre-Depends:软件安装前必须安装、配置依赖性的软件包和库文件,它常常用于必须的预运行脚本需求;

  Recommends:这个字段表明推荐的安装的其他软件包和库文件;

Suggests:建议安装的其他软件包和库文件。

control文件完整示例: dh_make 命令为我们创建的为例,请参考

1 Source: gentoo

 2 Section: unknown

 3 Priority: optional

 4 Maintainer: Josip Rodin <[email protected]>

 5 Build-Depends: debhelper (>=10)

 6 Standards-Version: 4.0.0

 7 Homepage: <insert the upstream URL, if relevant>

 8

 9 Package: gentoo

10 Architecture: any

11 Depends: ${shlibs:Depends}, ${misc:Depends}

12 Description: <insert up to 60 chars description>

13  <insert long description, indented with spaces>

说明:第 1–7 行是源代码包的控制信息。第 9–13 行是二进制包的控制信息。

 

postinst文件:包含了软件在进行正常目录文件拷贝到系统后,所需要执行的配置工作。
prerm文件:软件卸载前需要执行的脚本。
postrm文件:软件卸载后需要执行的脚本。

一个DEBIAN目录的完整架构如下,请参考

|----DEBIAN

       |-------changelog             

     |-------compat

     |-------copyright

       |-------control

       |-------postinst

       |-------postrm

     |-------rules

     |-------***.install

     |-------source

各文件内容说明如下:

Changelog提供版本修改信息,帮助下载软件包的人了解软件包中是否有他们需要知道的信息

Compat定义兼容级别,Ubuntu Kylin下保持默认值即可,默认值为9

Copyright:包含源码的版权和许可,dh_make可以给出一个 copyright 文件的模板

Control: 决定着deb包的包名、编译依赖和运行依赖,这个文件是必须的

Postinst:软件安装完后,执行该Shell脚本,一般用来配置软件执行环境,必须以“#!/bin/sh”为首行,然后给该脚本赋予可执行权限。

Postrm 软件卸载后,执行该Shell脚本,一般作为清理收尾工作,必须以“#!/bin/sh”为首行,然后给该脚本赋予可执行权限

PreinstDebian软件包(".deb")解压前执行的脚本,为正在被升级的包停止相关服务。

Rulesrules文件本质上是一个Makefile文件,这个Makefile文件定义了创建deb格式软件包的规则。打包工具按照rules文件指定的规则,完成编译,将软件安装到临时安装目录,清理编译目录等操作,并依据安装到临时目录的文件来生成deb格式的软件包。

***.install一些文件可以通过该install脚本,在软件安装时安装到系统的指定路径下。

Source写明了此源码包的格式,我们使用写“3.0 (quilt)”即可,意思是其他所有软件

更加详实的说明,可参考https://www.debian.org/doc/manuals/maint-guide/index.zh-cn.html

1.1、deb包制作过程

    以在实际的源代码中为例

步骤一:确定deb相应的依赖已安装

    apt-get install debhelper devscripts automake dh-make

步骤二:创建DEBIAN相应的文件,

创建的脚本如图1-1,以sysrepo源码为例,git clone https://github.com/sysrepo/sysrepo.git

dpkg制作deb包详解

图1-1 local-deb脚本

    Debian.rule的内容如图1-2,写dh-make的Makefile的规则,可以根据自己的软件的需要做相应的变动,欲了解更加详实的使用说明,请参考https://www.debian.org/doc/manuals/maint-guide/dreq.zh-cn.html 第 4 章 debian 目录中的必须内容的第4.4. rules

dpkg制作deb包详解

图1-2 rule脚本

Debian.control的内容如图1-3:

dpkg制作deb包详解

图1-3 control

特别说明:1、Source需要与源码名字相同,这个Source取的是CMakelist.txt中定义的包

2、Package是指生成的包名,必须与***.install相同,这里的install文件名必须命令为server.install

    Debian.postinst的内容格式要求如下图1-4,主要用于主要完成软件包(".deb")安装完成后所需的配置工作。通常,postinst 脚本要求用户输入, /或警告用户如果接受默认值,应该记得按要求返回重新配置这个软件。一个软件包安装或升级完成后,postinst 脚本驱动命令,启动或重起相应的服务。

dpkg制作deb包详解

   图1-4 postinst

Debian. postrm的内容格式要求如下图1-5,用于修改相关文件或连接,和/或卸载软件包所创建的文件。

dpkg制作deb包详解

图1-5 postrm

此外,常用的还有Debian. Preinst的内容格式要求如1-6,主要用于Debian软件包(".deb")解压前执行的脚本,为正在被升级的包停止相关服务,直到升级或安装完成(成功后执行 'postinst' 脚本)

dpkg制作deb包详解

图1-6 preinst

以及Debian.prerm,其内空格式要求如1-7,主要在停止一个软件包的相关进程,要卸载软件包的相关文件前执行

dpkg制作deb包详解

图1-7 prerm

特别说明:1、这几个脚本都必须有可执行权限,请查看图3-1的第11行代码,更改权限,否则,deb包安装时,不可执行

        2、deb包安装后,可以通过ll /var/lib/dpkg/info/***.*查看,相应的脚本是否存在,如图1-8所示

dpkg制作deb包详解

图1-8 sysrepo实例

Debian. Compat:文件定义了debhelper的兼容级别,不要使用任何低于9的兼容等级,在新建的软件包中也需要避免

Debian.source/format只包含一行,写明了此源代码包的格式通过查看dpkg-source可获得完整列表,默认写成3.0 (quilt)即可。

查看图1-1,第11行,第12行内容即可

Debian. Copyright:可以预先写好的一个授权信息,也可以从源码处copy,没有过多的要求。

Debian.***.install:指定要安装的文件与目录,将已经编译到debian/tmp目录下的可执行程序相应的文件安装,内容格式如图1-9所示:

dpkg制作deb包详解

图1-9 install

编译生成对就的deb时,可以可能dpkg -c ***.dep命令查看包中的内容以及安装的目录路径,如图1-10所示

dpkg制作deb包详解

    图1-10 dpkg查看示例

Debian. Changelog:源码的修改记录,文件第一行的格式一定一定要注意,第一行要带上相应的版本号,最后一行的格式,版本号为空,最后一行格式不对,不能继续编译否则。示例参考如图1-11所示

dpkg制作deb包详解

图1-11 changelog内容示例

 

步骤三:集成DEBIAN文件到编译环境中,CMakeLists.txt做如下如下几处修改

   1、确保debuild软件包已安装

dpkg制作deb包详解

      2、设置package编译的配置文件

dpkg制作deb包详解

    3、设置build-deb编译开关

dpkg制作deb包详解

步骤四:开始编译

1、mkdir -p build

2、cd build

3、cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr -DCMAKE_BUILD_TYPE:String="debug" ..

4、make build-deb

步骤五:查看编译结果

编译结束后,在/build/debs/目录下有相应的deb包生成,可以通过dpkg -c ***.dep查看包的内容

 

1.2、dpkg常用命令

    1、安装deb包

    $dpkg -i mydeb.deb

    2、卸载deb包:

            $dpkg -r   mysoftware 

    3、查看deb包是否安装

          $dpkg -s   mysoftware

    4、查看deb包文件内容:

           $dpkg   -c   mydeb.deb

   5、查看当前目录某个deb包的信息

          $dpkg --info mydeb.deb

6、解压deb包中所要安装的文件

    $dpkg -X mydeb.deb mydeb #第一个参数为所要解压的deb包,这里为 mydeb.deb

                                                  #第二个参数为将deb包解压到指定的目录,这里为 mydeb

7、解压deb包中DEBIAN目录下的文件(至少包含control文件)

    $dpkg -e mydeb.deb mydeb/DEBIAN #第一个参数为所要解压的deb包,这里为 mydeb.deb

                                                             #第二个参数为将deb包解压到指定的目录,这里为 #mydeb/DEBIAN

8、列出已安装的软件包列表

      $dpkg -l

9 、显示已安装软件包的版本

      $dpkg -l mysoftware 

10、查找软件包是否已安装

     $dpkg -l | grep mysoftware 

PS:列出的只是dpkg的常用命令,欲更加详尽了解,请man dpkg