deb 格式是 Debian 系统(包含 Debian 和 Ubuntu )专属安装包格式。
dpkg 是 Debian下的包管理工具,用来执行软件包的打包、解包、安装、卸载等命令。
运行环境:Debian、Ubuntu,国产操作系统 UOS、银河麒麟等。
本文将介绍以下几点内容:
作为入门,首先以 hello world 程序为例,介绍如何将其可执行文件打包、安装到用户指定目录、软件卸载。之后介绍 Debian 的 preinst、postinst、prerm、postrm 脚本,这些是软件包安装前后自动运行的可执行脚本。最后对 deb 包管理工具 dpkg 的常用命令进行总结。
程序语言的入门都是 hello world 程序,下面就以此开始,介绍如何将其生成的可执行文件进行打包、安装到指定目录、卸载。
C语言 helloworld.c 代码如下:
#include
int main(void)
{
printf("Hello, world!\n");
return 0;
}
将代码编译生成可执行文件 helloworld。
gcc helloworld.c -o helloworld
创建文件夹 MyFirstDeb,并在该文件夹下创建子文件夹 DEBIAN、创建指定的安装目录。DEBIAN目录下存放的是控制信息control、以及软件包安装前后自动运行的可执行脚本preinst、postinst、prerm、postrm(后续介绍)。其他目录为软件具体的安装路径,而在安装过程中,包里的数据会被直接解压到根目录(即/),因此在打包之前需要根据文件所在位置设置好相应的文件/目录树。
此时的目录树为:
|-- MyFirstDeb
|-- DEBIAN
|-- control
|-- opt
|-- helloworld
control文件记录待发布的软件包名,版本号,平台,维护者、描述信息等数据,内容为:
package: MyFirstDeb
version: 1.0.0
architecture: arm64
maintainer: WonderThink
description: This is my first deb package.
control字段信息说明
字段 | 用途 | 例子/其他 |
---|---|---|
package | 程序名称 | 中间不能有空格 |
version | 软件版本 | |
description | 程序说明 | |
section | 软件类别 | utils, net, mail, text, x11 |
priority | 软件对于系统的重要程度 | required, standard, optional, extra等 |
essential | 是否是系统最基本的软件包 | yes/no,若为yes,则不允许卸载(除非强制性卸载) |
architecture | 软件所支持的平台架构 | i386, arm64, amd64, m68k, sparc, alpha, powerpc等 |
maintainer | 维护者信息 | |
source | 软件包的源代码名称 | |
depends | 软件所依赖的其他软件包和库文件 | 若依赖多个软件包和库文件,采用逗号隔开 |
pre-depends | 软件安装前必须安装、配置依赖性的软件包和库文件 | 常用于必须的预运行脚本需求 |
recommends | 推荐安装的其他软件包和库文件 | |
suggests | 建议安装的其他软件包和库文件 |
以上完成了打包前准备工作,接下来执行打包、安装、卸载操作。
在 MyFirstDeb 同级目录下进行打包,规范的包名格式为(包名、版本号、平台,中间以下划线连接)package_version_architecture.deb,dpkg打包命令为:
dpkg -b MyFirstDeb/ MyFirstDeb_1.0.0_arm64.deb
MyFirstDeb_1.0.0_arm64.deb 的安装:
dpkg -i MyFirstDeb_1.0.0_arm64.deb
安装后在 /opt 目录下有了 helloworld 可执行文件。
卸载 MyFirstDeb 包(dpkg对包名的大小写不敏感):
dpkg -r MyFirstDeb
通过上述操作就简单完成了 helloworld 可执行文件的打包、安装到指定目录、卸载。接下来介绍 Debian 的软件包安装前后自动运行的可执行脚本。
DEBIAN 目录下除了 control 文件,还可以有 preinst、postinst、prerm、postrm 脚本,这些是软件包安装前后自动运行的可执行shell脚本,统称为控制文件。
控制文件 | 描述 |
---|---|
control | 用了记录软件标识,版本号,平台,依赖信息等数据 |
preinst | pre-installation,在解包前运行的脚本 |
postinst | post-installation,在解包后运行的脚本 |
prerm | pre-removal,卸载时,在删除文件之前运行的脚本 |
postrm | post-removal,在删除文件之后运行的脚本 |
preinst
Debian软件包(".deb")解压前执行的脚本,为正在被升级的包停止相关服务,直到升级或安装完成。
postinst
主要完成软件包(".deb")安装完成后所需的配置工作。通常,postinst 脚本要求用户输入,和(或) 警告用户如果接受默认值,应该记得按要求返回重新配置这个软件。 一个软件包安装或升级完成后,postinst 脚本驱动命令,启动或重起相应的服务。
prerm
停止一个软件包的相关进程,要卸载软件包的相关文件前执行。
postrm
修改相关文件或连接,和(或)卸载软件包所创建的文件。
打包:
dpkg -b MyFirstDeb/ xxx.deb # build,将文件夹MyFirstDeb打deb包
安装与卸载:
dpkg -i xxx.deb # install,安装deb软件包
dpkg -r xxx # remove,卸载软件包
解包:
dpkg -X xxx.deb extract/ #提取包的内容到文件夹 extract/ 下
dpkg -e xxx.deb extract/DEBIAN #提取的控制信息到文件夹 extract/DEBIAN 下
查看deb软件包信息:
dpkg -I xxx.deb # info,查看deb软件包的控制信息
dpkg -c xxx.deb # contents,查看deb软件包中包含的文件结构
查看已安装的deb软件包信息:
dpkg -l xxx # list,查看xxx软件包的信息
dpkg -L xxx # listfile,列出xxx软件包安装到系统中的文件
dpkg -s xxx # status,查看xxx软件包的控制信息
[1] Ubuntu中deb包详解及打包教程
[2] linux的程序打包deb
[3] Debian 的 preinst, postinst, prerm, 和 postrm 脚本