dpkg制作deb包详解
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”为首行,然后给该脚本赋予可执行权限
Preinst:Debian软件包(".deb")解压前执行的脚本,为正在被升级的包停止相关服务。
Rules:rules文件本质上是一个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
图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
图1-2 rule脚本
Debian.control的内容如图1-3:
图1-3 control
特别说明:1、Source需要与源码名字相同,这个Source取的是CMakelist.txt中定义的包
2、Package是指生成的包名,必须与***.install相同,这里的install文件名必须命令为server.install
Debian.postinst的内容格式要求如下图1-4,主要用于主要完成软件包(".deb")安装完成后所需的配置工作。通常,postinst 脚本要求用户输入, 和/或警告用户如果接受默认值,应该记得按要求返回重新配置这个软件。一个软件包安装或升级完成后,postinst 脚本驱动命令,启动或重起相应的服务。
图1-4 postinst
Debian. postrm的内容格式要求如下图1-5,用于修改相关文件或连接,和/或卸载软件包所创建的文件。
图1-5 postrm
此外,常用的还有Debian. Preinst的内容格式要求如1-6,主要用于Debian软件包(".deb")解压前执行的脚本,为正在被升级的包停止相关服务,直到升级或安装完成(成功后执行 'postinst' 脚本)
图1-6 preinst
以及Debian.prerm,其内空格式要求如1-7,主要在停止一个软件包的相关进程,要卸载软件包的相关文件前执行
图1-7 prerm
特别说明:1、这几个脚本都必须有可执行权限,请查看图3-1的第11行代码,更改权限,否则,deb包安装时,不可执行
2、deb包安装后,可以通过ll /var/lib/dpkg/info/***.*查看,相应的脚本是否存在,如图1-8所示
图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所示:
图1-9 install
编译生成对就的deb时,可以可能dpkg -c ***.dep命令查看包中的内容以及安装的目录路径,如图1-10所示
图1-10 dpkg查看示例
Debian. Changelog:源码的修改记录,文件第一行的格式一定一定要注意,第一行要带上相应的版本号,最后一行的格式,版本号为空,最后一行格式不对,不能继续编译否则。示例参考如图1-11所示
图1-11 changelog内容示例
步骤三:集成DEBIAN文件到编译环境中,CMakeLists.txt做如下如下几处修改
1、确保debuild软件包已安装
2、设置package编译的配置文件
3、设置build-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