制作deb包

deb 是 Debian 软件包格式,文件扩展名为 .deb,在 Debian 和 Ubuntu 中广泛使用。将应用打包成 deb 软件包可以方便分发、安装和卸载,提供更好的用户体验。

如果安装时文件已存在,不会覆盖原文件。

Debian 软件包结构

deb 包中主要包括三部分:

  • debian-binary 二进制数据,包括格式版本号码等;
  • control.tar.gz 元数据,包括对 deb 包的描述、脚本等;
  • data.tar.* 实际安装的内容

其中,”*”所指代的内容随压缩算法不同而不同。常见的可能值为xz、gz、或bz2。有时也会使用lzma。

打包目录结构

在 Ubuntu 或者 Debian 系统中,创建一个打包目录,按照要求放入内容,使用 dpkg -i 命令打包。

一个打包目录的示例结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.
├── DEBIAN
│   ├── changlog
│   ├── conffiles
│   ├── control
│   ├── copyright
│   ├── postinst
│   ├── postrm
│   ├── preinst
│   ├── prerm
│   └── postrm
├── lib
│   └── systemd
│   └── system
│   ├── backend.service

其中:

  • DEBIAN 目录存放 deb 包的描述和脚本等元数据,其内容最后会形成 control.tar.gz
  • 其他目录为具体安装目录(相对于安装时根目录而言)。举例来说,该目录下的 lib/systemd/system/backend.service 文件在安装 deb 包时会被复制到系统 /lib/systemd/system/ 目录中,并保留原文件的权限和属组

DEBIAN 目录文件介绍

control

control 文件用于描述 deb 包信息,举例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Package: hello-world
Version: 1.0
Architecture: amd64
Maintainer: Jack Ma <email@example.com>
Installed-Size:
Pre-Depends:
Depends:
Recommends:
Suggests:
Section: devel
Priority: optional
Multi-Arch: foreign
Homepage: www.yunify.com
Description: hello world, man.

对一些属性的说明:

  • Architecture:硬件架构平台,可选值 i386amd64m68ksparcalphapowerpc 等;
  • Pre-Depends:软件安装前必须安装、配置依赖性的软件包和库文件,它常常用于必须的预运行脚本需求;
  • Depends:软件所依赖的其他软件包和库文件。如果是依赖多个软件包和库文件,彼此之间采用逗号隔开;
  • Priority:申明软件对于系统的重要程度,如 requiredstandardoptionalextra 等;

另外,control 文件末尾要有一个空行。

脚本文件

在 DEBIAN 目录中有四个 shell 脚本文件,分别在包安装和卸载的不同时刻运行:

  • preinst 在 deb 包实际内容安装前运行;
  • postinst 在 deb 包实际内容安装后运行;
  • prerm 在 deb 包实际内容删除前运行;
  • postrm 在 deb 包实际内容删除后运行;

比如安装一个安装后自动运行的软件包,可以在 preinst 中检查安装目录并清理旧文件,在 postinst 中启动服务,在 prerm 中停止服务,在 postrm 中清理日志文件。

其他文件

  • copyright 版权信息;
  • changlog 修订记录;

打包命令

1
dpkg -b <打包目录> hello-world-1.0.deb

安装和卸载

1
2
dpkg -i hello-world-1.0.deb
dpkg -p hello-world

参考链接

觉得有用可以请作者喝杯咖啡呀~
0%