一、.deb 的物理构成
.deb 是 ar 归档文件,内部固定包含三个成员:
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-essential、devscripts、debhelper。
步骤 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 --create或dch -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
注意:修改第三方包可能导致签名失效、依赖不匹配,仅建议用于私有包或调试。