在 Ubuntu 上手动打包 deb
deb 包本质是一个 ar 归档,内含元数据(控制信息)与实际文件树。dpkg-deb 可直接把一个约定结构的目录打包成 .deb,无需 debhelper 等工具链,适合打包自有脚本、二进制或配置。
1. 目录结构
打包目录需要模拟安装后在系统中的真实路径,外加一个 DEBIAN/ 存放元数据。
1 | myapp_1.0.0_amd64/ |
DEBIAN/内文件不会被安装,仅供 dpkg 使用;其余目录原样映射到系统根目录- 目录名约定为
包名_版本_架构,仅为可读性,真正的元信息以control为准 - 可执行文件、维护者脚本需有执行权限(
chmod 755)
2. control 文件
DEBIAN/control 是唯一必需的元数据文件,定义包名、版本、依赖等。
1 | Package: myapp |
| 字段 | 必填 | 说明 |
|---|---|---|
Package |
是 | 包名,小写、数字、-,不含空格 |
Version |
是 | 版本号,格式如 1.0.0 或 1.0.0-1 |
Architecture |
是 | amd64、arm64,与体系无关用 all |
Maintainer |
是 | 维护者,格式 Name <email> |
Description |
是 | 首行摘要 + 缩进续行详述 |
Depends |
否 | 运行依赖,安装时强制满足 |
Section |
否 | 分类,如 utils、net、admin |
Priority |
否 | 常用 optional |
Description续行必须以一个空格开头,否则解析报错- 纯脚本类(如 Python、Shell)用
Architecture: all Depends会由 apt 自动解析安装;dpkg -i则需手动补齐
3. 维护者脚本
维护者脚本在安装/卸载的特定阶段由 dpkg 调用,用于建目录、注册服务、清理残留等。放在 DEBIAN/ 下,需 chmod 755。
| 脚本 | 触发时机 |
|---|---|
preinst |
解包前 |
postinst |
解包后(配置阶段),最常用 |
prerm |
移除文件前 |
postrm |
移除文件后 |
1 |
|
- 脚本首行必须是 shebang,且以
set -e保证出错即中断 $1是动作参数:postinst为configure,prerm为remove/upgrade- 卸载时删除文件应交给 dpkg,脚本只处理它管不到的内容(服务、缓存、软链)
4. 构建与校验
用 dpkg-deb --build 打包,--root-owner-group 强制包内文件归属 root:root(避免带入本地用户 UID)。
1 | # 打包,生成 myapp_1.0.0_amd64.deb |
- 若省略输出名,
.deb与源目录同名;也可显式指定:dpkg-deb --build 源目录 输出.deb lintian报告E:为错误、W:为警告,正式分发前应尽量清零- 权限问题多因未加
--root-owner-group,或源目录文件权限不当
5. 安装与卸载
1 | sudo dpkg -i myapp_1.0.0_amd64.deb # 安装(不自动装依赖) |
dpkg -i不解析依赖,缺依赖会中断,需再跑apt-get install -f- 本地包用
apt install ./file.deb(路径前缀./必需)可一步装好依赖 remove保留/etc下配置,purge连同删除
6. 用脚本自动化
手动摆目录、改版本号、设权限重复且易错,可用一个 Shell 脚本把整套流程固化下来:改版本只需动一个变量,运行即出包。
1 |
|
- 版本、架构、依赖集中在脚本顶部,改一处即可,避免目录名与
control不同步 install -m同时完成拷贝与权限设置,比cp+chmod更紧凑control用普通 here-doc(变量会插值);postinst用<<'EOF'(引号防止$1被提前展开)lintian ... || true让校验失败不中断脚本;正式发布时应去掉|| true强制通过- 接入 CI 时,
VERSION可改为从 git tag 读取:VERSION=$(git describe --tags --abbrev=0)
7. 小结
手动打包 deb 的最小闭环:
- 按安装后路径布局文件树,附带
DEBIAN/control - 需要时补维护者脚本(
postinst等)并授予执行权限 dpkg-deb --build --root-owner-group打包,lintian校验apt install ./xxx.deb安装以自动处理依赖- 重复打包用 Shell 脚本固化流程,版本号集中管理
需要长期维护、上传 PPA 或遵循 Debian 政策时,再转向 debhelper、fpm 等工具链,详见《用工具链打包 deb:debhelper、fpm 与 checkinstall》;语言生态原生方案与 CI 驱动分发见《deb 包现代化打包方案:nfpm、cargo-deb、CPack 与 CI 驱动》。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 iehtian!
