debian 包 .deb 的构成、制作和解压(不安装)

一、.deb 的物理构成

.debar 归档文件,内部固定包含三个成员:

复制代码
debian-binary   → 文本文件,版本号(目前固定为 "2.0\n")
control.tar.gz  → 包元数据(依赖、描述、安装脚本、校验和)
data.tar.xz     → 实际文件(/usr/bin、/usr/share 等)

control.tar 内部

  • control --- 包名、版本、架构、依赖、描述
  • preinst/postinst/prerm/postrm --- 维护者脚本
  • md5sums --- 文件校验
  • conffiles --- 配置文件标记

data.tar 内部 --- 以根目录 / 为基准的完整文件树。


二、不安装,只解压

底层方式:ar + tar

bash 复制代码
mkdir /tmp/deb && cd /tmp/deb
ar x /path/to/foo.deb                    # 解压出 debian-binary, control.tar.xz, data.tar.xz

tar -xf control.tar.xz                   # 解压控制信息
cat control                              # 查看元数据

tar -xf data.tar.xz                      # 解压数据文件(保持目录结构)

ar 属于 binutils,几乎所有 Linux 都自带。data.tar 后缀可能是 .gz.xz.zst

便捷方式:dpkg-deb(推荐)

bash 复制代码
dpkg-deb -I foo.deb              # 查看控制信息
dpkg-deb -c foo.deb              # 列出数据文件清单
dpkg-deb -x foo.deb /tmp/out    # 只解压 data 到目录
dpkg-deb -e foo.deb /tmp/out/DEBIAN  # 只解压 control 到目录
方式 执行脚本 写 dpkg 数据库 处理依赖
dpkg -i
dpkg-deb -x
ar + tar

三、制作 .deb 包的流程

Debian 打包有两种路径:简易打包 (dpkg-deb)和 标准打包(dh + dpkg-buildpackage)。


路径 A:简易打包(dpkg-deb --- 适合脚本、静态文件)

适合不需要编译的程序、配置文件、脚本等。

步骤 1:创建目录结构

bash 复制代码
mkdir -p mypkg/DEBIAN
mkdir -p mypkg/usr/bin
mkdir -p mypkg/usr/share/doc/mypkg

步骤 2:放入文件

bash 复制代码
cp myscript mypkg/usr/bin/
cp README mypkg/usr/share/doc/mypkg/

步骤 3:编写 control 文件

bash 复制代码
cat > mypkg/DEBIAN/control << 'EOF'
Package: mypkg
Version: 1.0.0
Section: utils
Priority: optional
Architecture: amd64
Depends: bash (>= 4.0)
Maintainer: Your Name <you@example.com>
Description: A short description
 A longer description can span multiple lines.
 Each line must start with a space.
EOF

步骤 4:可选脚本

bash 复制代码
cat > mypkg/DEBIAN/postinst << 'EOF'
#!/bin/bash
echo "mypkg installed"
EOF
chmod 755 mypkg/DEBIAN/postinst

步骤 5:构建

bash 复制代码
dpkg-deb --build mypkg
# 输出:mypkg.deb

验证

bash 复制代码
dpkg-deb -I mypkg.deb
dpkg-deb -c mypkg.deb

路径 B:标准打包(dh_make + dpkg-buildpackage --- 适合编译型软件)

这是 Debian 官方仓库使用的流程,需要 build-essentialdevscriptsdebhelper

步骤 1:准备源码

bash 复制代码
tar -czvf myapp-1.0.0.tar.gz myapp-1.0.0/

步骤 2:生成 debian 目录模板

bash 复制代码
cd myapp-1.0.0
dh_make -f ../myapp-1.0.0.tar.gz -s --createorig
# -s = single binary package

这会生成 debian/ 目录,包含:

  • control --- 包元数据
  • rules --- Makefile,定义如何编译/安装(通常用 debhelper 简写)
  • changelog --- 版本历史(必须存在,格式严格)
  • compat --- debhelper 兼容级别
  • copyright --- 版权信息

步骤 3:修改 debian/control

text 复制代码
Source: myapp
Section: utils
Priority: optional
Maintainer: Your Name <you@example.com>
Build-Depends: debhelper (>= 12), gcc, make
Standards-Version: 4.5.0

Package: myapp
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: short description
 long description...

步骤 4:修改 debian/rules

通常默认模板即可,debhelper 会自动处理大多数情况:

makefile 复制代码
#!/usr/bin/make -f
%:
	dh $@

如果需要自定义(比如指定 configure 参数):

makefile 复制代码
#!/usr/bin/make -f
%:
	dh $@

override_dh_auto_configure:
	dh_auto_configure -- --prefix=/usr --enable-feature

步骤 5:修改 debian/changelog

格式必须严格正确:

text 复制代码
myapp (1.0.0-1) unstable; urgency=medium

  * Initial release.

 -- Your Name <you@example.com>  Thu, 04 Sep 2026 18:30:00 +0800

可用 dch --createdch -i 辅助编辑。

步骤 6:构建

bash 复制代码
dpkg-buildpackage -us -uc -b
# -us -uc = 不签名 source/changes
# -b = 只构建二进制包

输出在父目录:

  • myapp_1.0.0-1_amd64.deb --- 二进制包
  • myapp_1.0.0-1.dsc --- 源码描述(如未加 -b)
  • myapp_1.0.0-1_amd64.changes --- 变更文件

清理构建环境

bash 复制代码
debian/rules clean

四、关键文件详解

control 字段

字段 说明
Package 包名(小写、无空格)
Version 版本号(upstream-version-debian-revision,如 1.0.0-1
Architecture amd64/i386/all(架构无关用 all)
Depends 运行时依赖
Build-Depends 编译时依赖(仅源码包)
Pre-Depends 安装本包前必须先装好的包(比 Depends 更强)
Conflicts 冲突包
Replaces 本包替换哪些包(用于文件接管)
Provides 本包提供哪些虚拟包

维护者脚本执行时机

脚本 触发时机
preinst 解压 data.tar 之前
postinst 解压 data.tar 之后
prerm 卸载前,删除文件之前
postrm 卸载后,删除文件之后

参数传递:

  • install / upgrade / abort-upgrade 等,脚本通过 $1 接收。

五、修改已有 .deb 并重新打包

bash 复制代码
# 1. 解压
dpkg-deb -x foo.deb foo_extracted
dpkg-deb -e foo.deb foo_extracted/DEBIAN

# 2. 修改文件或 control
vim foo_extracted/DEBIAN/control

# 3. 重新打包
dpkg-deb --build foo_extracted foo_modified.deb

# 4. 验证
dpkg-deb -I foo_modified.deb

注意:修改第三方包可能导致签名失效、依赖不匹配,仅建议用于私有包或调试。


相关推荐
qetfw2 天前
Debian Nginx + PHP-FPM 配置:FastCGI、站点目录与访问验证
linux·nginx·debian·php
机器人梦想家2 天前
Debian 12/13 关闭开机图形界面(仅保留命令行)
运维·debian
淼澄研学4 天前
Debian通过AI决议:合规解析与Ollama本地部署Llama3实操
运维·人工智能·debian
qetfw6 天前
Debian lftp FTP 客户端使用:登录、目录切换与文件传输
linux·运维·debian
技术不支持9 天前
wsl 离线安装 Debian 11, Debian 12等指定版本
运维·debian
wzq11_6669 天前
HDFS集群的高可用集群一遍过!!!
运维·debian
qetfw10 天前
Debian Samba 与 OpenLDAP 统一认证配置
linux·debian
超龄超能程序猿11 天前
实战优化:.NET 8 容器 Debian 源+时间同步企业级 Dockerfile
运维·debian·.net
qetfw13 天前
Debian OpenLDAP 目录服务配置:DN、LDIF、ldapsearch 与认证验证
linux·运维·debian