Ubuntu26.04 dpkg-build 超详细打包教程|从源码编译到 Deb 成品,Linux 打包高手成长实战

前言

在 Ubuntu/Debian 生态中,dpkg-buildpackage 是官方标准源码打包工具,区别于简易dpkg --build裸打包,它遵循 Debian 打包规范、自动处理编译、依赖、权限、版本、变更日志,产出规范可上架 APT 源的.deb.dsc.changes全套打包产物,是运维、开发进阶 Linux 必备技能。

Ubuntu26.04 搭载新版 dpkg、debhelper、dh 系列工具链,打包标准升级至Standards-Version:4.7.x,本文基于 26.04 原生环境,从环境部署→源码规范→debian 目录配置→rules/control/changelog 全文件编写→编译打包→验包→排错全流程落地,跟着实操即可从零完成规范 deb 包制作,实现从新手到打包高手进阶。

环境:Ubuntu26.04 amd64,全部命令可直接复制运行

一、前期:安装全套打包依赖环境

dpkg-buildpackage 依赖编译链、打包辅助工具、密钥、debhelper 套件,一键安装:

sudo apt update
# 打包必备全家桶:编译环境+dh打包工具+dh_make+签名+源码依赖自动安装
sudo apt install build-essential dpkg-dev devscripts debhelper debmake dh-make fakeroot gnupg apt-src -y

工具说明:

  1. dpkg-dev:dpkg-buildpackage 本体、dpkg-source 源码打包
  2. debhelper/dh:现代打包核心,简化 debian/rules 编写(99% 项目用 dh 规范)
  3. fakeroot:非 root 用户模拟 root 权限打包,不用 sudo 构建 deb
  4. devscripts:dch(修改 changelog)、debuild 辅助打包命令

补充:配置打包者信息(全局,后续 changelog 自动填充)

# 替换为自己姓名+邮箱,打包变更日志自动读取
export DEBFULLNAME="Your Name"
export DEBEMAIL="yourname@xxx.com"
# 写入环境变量永久生效
echo 'export DEBFULLNAME="Your Name"' >> ~/.bashrc
echo 'export DEBEMAIL="yourname@xxx.com"' >> ~/.bashrc
source ~/.bashrc

二、Deb 打包源码目录规范(重中之重,新手高频踩坑)

dpkg-buildpackage 对源码目录、源码压缩包命名有强制规范,格式:

软件名-上游版本 → 目录名;上游源码压缩包:软件名_上游版本.orig.tar.gz(下划线分隔,必须.orig.tar.gz后缀)

实战示例:以 C 语言 hello 源码演示打包

  1. 新建源码目录:hello-1.0.0(hello = 包名,1.0.0 = 上游源码版本)
mkdir hello-1.0.0 && cd hello-1.0.0
  1. 编写极简 hello.c 源码
#include <stdio.h>
int main(){
    printf("Hello Ubuntu26.04 dpkg-buildpackage\n");
    return 0;
}
  1. 编写 Makefile 编译脚本

makefile

CC=gcc
CFLAGS=-O2 -g
hello:hello.c
	$(CC) $(CFLAGS) -o hello hello.c
# install规则:指定编译后程序安装路径,遵循Linux FHS规范
install:hello
	install -D ./hello $(DESTDIR)/usr/bin/hello
clean:
	rm -f hello *.o

关键:Makefile 必须支持make install DESTDIR=xxx$(DESTDIR)是 dh 打包时临时安装目录变量,debian/rules 会自动传入。

  1. 回到上级目录,生成官方源包hello_1.0.0.orig.tar.gz(dpkg-buildpackage 校验 orig 源码包必备)

cd ..
tar -zcvf hello_1.0.0.orig.tar.gz hello-1.0.0/

目录结构最终:

./
├── hello_1.0.0.orig.tar.gz # 原始上游源码包(规范命名)
└── hello-1.0.0/            # 源码工作目录(打包主目录)

三、生成 debian 打包目录 2 种方案(自动生成 + 手动编写,高手两种都会)

debian 目录是 deb 打包的控制中枢,包含control/rules/changelog/copyright/install等核心配置文件,决定包信息、依赖、编译方式、安装路径、版权。

方案 1:dh_make 自动生成 debian 模板(新手首选,快速初始化)

进入源码目录:

cd hello-1.0.0
# dh_make -f 指定orig源码包,-s=原生独立源码包,单二进制包
dh_make -f ../hello_1.0.0.orig.tar.gz -s

执行后交互选项:

  • Type of package:s Single binary(单个 deb 包,绝大多数小程序) 执行完成自动生成debian/全套模板目录,目录内容:

debian/
├── control    # 包元数据、编译依赖+运行依赖(打包大脑)
├── rules      # 打包构建脚本(makefile风格,dh自动化编译安装)
├── changelog  # 版本变更日志(决定最终deb版本号)
├── copyright  # 软件开源协议版权
├── compat     # debhelper兼容版本(26.04默认填13)
└── source/

方案 2:手动新建 debian 目录(高阶高手自定义打包,无多余垃圾模板)

mkdir debian
# 自行新建control/rules/changelog/copyright/compat,下文附完整模板

四、逐个配置 debian 目录核心配置文件(全字段详解,可直接复制模板)

4.1 debian/compat(固定配置)

写入数字:13(Ubuntu26.04 默认 debhelper 兼容版本)

echo "13" > debian/compat

4.2 debian/control(最核心:源码包 + 二进制包信息、依赖)

分两段:上方 Source 源码包段、下方 Package 二进制包段,字段严格遵循 Debian 官方规范,小写命名、格式不能错Debian。

control

Source: hello
Section: utils
Priority: optional
Maintainer: Your Name <yourname@xxx.com>
# Build-Depends:编译阶段需要安装的依赖(apt build-dep自动安装)
Build-Depends: debhelper-compat (=13), build-essential
Standards-Version: 4.7.3
Homepage: https://github.com/demo/hello-demo
Rules-Requires-Root: no

Package: hello
Architecture: amd64
Multi-Arch: foreign
# ${shlibs:Depends}=自动扫描程序链接的系统库依赖,${misc:Depends}=debhelper杂项依赖
Depends: ${shlibs:Depends},${misc:Depends}
Description: Demo hello app for dpkg-buildpackage tutorial
 A simple demo program to test dpkg-buildpackage on Ubuntu26.04,
 print hello info after execute /usr/bin/hello.

关键字段释义:

  1. Source:源码包名,和上游源码名一致(hello)
  2. Build-Depends:编译依赖,执行sudo apt build-dep ./一键自动安装所有编译依赖
  3. Architecture:amd64:仅 amd64 架构;填all= 脚本类跨全架构无需编译
  4. Depends:deb 安装时系统必须预装的运行依赖,${shlibs:Depends}dh 自动分析二进制动态库,不用手动填写 libc6 等,大幅减少依赖写错概率
  5. Description:首行短描述,空一行缩进写长描述(Debian 强制格式)

4.3 debian/rules(打包编译脚本,dh 极简模板,现代打包通用)

使用 dh 自动化规则,三行万能 rules(95% C/C++/Makefile 项目通用),不用手写复杂编译、安装、清理逻辑:

makefile 内容:

#!/usr/bin/make -f
%:
	dh $@

原理:dh $@自动执行 dh_clean (清理)、dh_build (编译)、dh_install (安装文件到临时目录)、dh_strip (精简二进制)、dh_fixperms (修正权限)、dh_package (生成 deb) 全流程。

修改权限可执行:

chmod +x debian/rules

4.4 debian/changelog(决定 deb 最终版本号,打包必填)

版本格式规范:上游版本-打包修订号1.0.0-1-1代表第 1 次 debian 打包修订,升级包改为1.0.0-2

快速生成:

# dch --create自动生成首条变更记录,版本1.0.0-1
dch --create -v 1.0.0-1

打开后默认模板,按需修改描述,保存退出。

后续迭代升级包:dch -i自动升打包小版本,新增变更日志。

4.5 debian/copyright(版权文件,上架 APT 源必填,本地打包可简写)

copyright

Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: hello
Source: https://github.com/demo/hello-demo

Files: *
Copyright: 2025 Your Name <yourname@xxx.com>
License: GPL-3.0

五、一键 dpkg-buildpackage 打包(3 种常用打包参数,26.04 实测)

进入源码目录hello-1.0.0/,3 种打包场景:

1、日常本地打包(最常用:-us -uc 跳过 gpg 签名,非密钥环境首选)

-us不签名源码包、-uc不签名 changes 文件,本地自用必用参数

# fakeroot模拟root权限打包
fakeroot dpkg-buildpackage -us -uc

2、只编译二进制 deb,不生成源码包(-b)

fakeroot dpkg-buildpackage -b -us -uc

3、只构建源码包(-S,准备上传 PPA 仓库)

dpkg-buildpackage -S -us -uc

打包产物(打包成功后,上级目录生成文件)

../
├── hello_1.0.0-1_amd64.deb      # 最终成品deb安装包(重点)
├── hello_1.0.0-1_amd64.changes  # 打包变更清单
├── hello_1.0.0.dsc              # 源码包描述文件
└── hello_1.0.0.orig.tar.gz      # 原始源码压缩包

六、安装、校验 deb 包(打包后验包步骤)

1、安装 deb

sudo dpkg -i ../hello_1.0.0-1_amd64.deb
# 缺失依赖自动补全
sudo apt -f install
# 运行测试
hello

2、查看 deb 信息、内部文件

# 查看包元数据
dpkg-deb -I ../hello_1.0.0-1_amd64.deb
# 查看deb内部目录结构
dpkg-deb -c ../hello_1.0.0-1_amd64.deb

3、卸载软件

sudo dpkg -r hello

七、进阶打包技巧(高手必备:自定义安装路径、配置文件、服务)

7.1 自定义指定文件安装路径:debian/*.install 文件

新建debian/hello.install,格式:源码路径 系统安装前缀

conf/hello.conf /etc/
doc/readme.md /usr/share/doc/hello/

dh_install 自动把对应文件安装到 deb 内对应目录,无需修改 Makefile。

7.2 打包系统 service:debian/*.service + debian/postinst/prerm

  • 把 systemd 服务文件放入debian/hello.service,dh_installsystemd 自动注册启停
  • postinst:安装后执行脚本;prerm:卸载前执行脚本(如关闭服务)

7.3 dpkg-buildpackage 高频优化参数

表格

参数作用
-ncno-clean,不清理编译中间文件,反复调试打包提速
-d跳过编译依赖检测,调试临时用
-j4-jN 多线程编译,跟随 CPU 核心,dpkg-buildpackage -j4 -us -uc

八、Ubuntu26.04 打包高频报错 & 避坑指南(新手 90% 问题汇总)

  1. 报错:找不到 xxx.orig.tar.gz 原因:源码压缩包命名不规范,必须包名_版本.orig.tar.gz,下划线,不能横线;必须放在源码上级目录。
  2. 报错 Build-Depends 缺失 修复:sudo apt build-dep .一键安装 control 内所有编译依赖。
  3. make install DESTDIR 无法写入 修复:Makefile 安装规则必须使用$(DESTDIR)前缀,不能写死/usr/bin
  4. deb 安装提示依赖缺失 修复:control 中 Depends 使用${shlibs:Depends},dh 自动扫描动态库,不要手动乱写系统库名。
  5. 目录名错误 规范:源码目录包名-版本(横线),源压缩包包名_版本.orig.tar.gz(下划线)。

九、高手进阶方向

  1. 多二进制分包:一个源码打包生成多个 deb(如主程序包 + 文档包),control 多段 Package 配置;
  2. PPA 仓库打包:带 gpg 密钥签名,dpkg-buildpackage -S上传 Launchpad PPA 自动编译全架构包;
  3. Python/Go/Java 跨语言打包:调整 Build-Depends,配合 dh_python3/dh_golang 辅助打包。

总结

dpkg-buildpackage 是 Ubuntu 官方标准化打包方案,区别简易 dpkg 裸打包,产出符合 Debian 规范的软件包,可上架官方源、PPA 私有源。掌握流程核心:规范源码命名→debian 三剑客 (control/rules/changelog) 配置→fakeroot dpkg-buildpackage -us -uc 打包,熟练后可快速打包自研各类 C/C++、Shell、Python 程序,是 Linux 运维 / 开发由入门迈向高阶的标志性技能。

本文首发于 58Linux技术博客,专注Ubuntu桌面使用、Linux服务器运维与网站搭建实战。

发表评论

粤ICP备10052831号 | © 2026 58Linux 技术笔记. All Rights Reserved. | 联系我们 | 关于本站
本站内容开放共享,仅供学习交流 | 专注 Ubuntu & Linux 实战教程
Built with GeneratePress