最可控的deb打包方式是手动使用dpkg-deb,必须严格遵循ar归档结构(debian-binary、control.tar.gz、data.tar.xz)、debian/全大写目录、control文件五项必填字段、正确权限与路径规范,避免dh_make等重型工具。

直接用 dpkg-deb 手动打包是最可控的方式,但必须严格遵循 DEB 文件结构和控制文件规范,否则安装时会报 control file parse error 或被 apt 拒绝识别。
DEB 包的核心结构必须是 DEBIAN/control + 二进制/配置文件目录
DEB 不是压缩包,而是 ar 归档,内部固定包含三部分:debian-binary(版本标识)、control.tar.gz(元数据)、data.tar.xz(实际文件)。你不能靠 tar -cf 直接生成有效 deb。
-
DEBIAN/目录名必须全大写,小写debian/会被dpkg-deb --build忽略 -
DEBIAN/control是强制文件,至少需含Package、Version、Architecture、Maintainer、Description五项,缺一不可 - 所有安装路径(如
/usr/bin/mytool)必须放在构建目录的对应相对路径下,比如你要装到/usr/bin/,就得把可执行文件放进mytool-1.0/usr/bin/mytool -
Architecture值不能写all以外的值却放了平台相关二进制——比如 x86_64 编译的程序填arm64,安装时会失败且无明确提示
dpkg-deb --build 的权限和路径陷阱
构建目录里的文件权限会原样进入 data.tar.xz。如果可执行文件没有 x 权限,安装后就无法运行;如果 /etc/ 下的配置文件被设为 root:root 但构建时是普通用户,dpkg 安装时不会自动修正属主,导致服务启动失败。
- 构建前统一修复权限:
find mytool-1.0 -type f -exec chmod 644 {} \;; find mytool-1.0/usr/bin -type f -exec chmod 755 {} \; - 不要在构建目录里放
~/.bashrc或/tmp/下的临时文件——dpkg-deb会把它们一起打包进去 - 路径不能以
/开头,否则dpkg-deb --build会报错:cannot create archive with absolute path - 若需预/后安装脚本(
DEBIAN/preinst、postinst),必须设为755且第一行是#!/bin/sh,否则 dpkg 执行时报Exec format error
用 dh_make 自动生成模板反而容易翻车
dh_make 是 Debian 官方工具链的一部分,但它默认生成的是完整源码包(.dsc + .orig.tar.gz + .debian.tar.xz)流程,不是单个二进制 deb。新手常误以为运行完就能直接 dpkg-buildpackage 出 deb,结果卡在 GPG 签名或上游 tarball 校验上。
- 除非你真要进 Debian/Ubuntu 官方仓库,否则别碰
dh_make+dpkg-buildpackage这套 -
dh_make生成的rules文件本质是 Makefile,里面调用dh_auto_configure等,对纯脚本或已编译二进制毫无意义 - 真正轻量的做法:手写
DEBIAN/control+ 放好文件 +dpkg-deb --build mytool-1.0
最常被忽略的是 control 文件里的 Depends 字段——写成 Depends: python3 可以,但写成 Depends: python3.10 就会导致在 Ubuntu 24.04(自带 python3.12)上无法安装,apt 会直接拒绝解析该包。











