在 Debian 系统中发布自行编译的软件包需遵循其打包规范,涉及目录结构、构建工具和发布流程。以下是关键步骤及目录组织格式的详细说明:
📦 一、Debian 软件包基本结构
Debian 软件包(.deb
)本质是 ar
格式的归档文件,包含三个核心部分:
debian-binary
仅包含版本号(如2.0
),标识包格式版本。control.tar.gz
包含控制信息:control
:包名、版本、依赖等元数据;md5sums
:文件校验和;- 脚本文件:
preinst
(安装前)、postinst
(安装后)、prerm
(卸载前)、postrm
(卸载后)。
data.tar.xz
存放实际要安装的文件(如二进制、配置文件),按 Linux 文件系统层次标准(FHS)组织(如/usr/bin
、/etc
)。
📂 二、源代码目录组织格式
构建 Debian 包需在源代码根目录创建 debian/
子目录,存放打包控制文件。典型结构如下:
my-app/
├── debian/ # 打包控制目录(必需)
│ ├── control # 包元数据(名称、依赖等)
│ ├── copyright # 版权声明
│ ├── changelog # 版本变更历史
│ ├── rules # 构建脚本(Makefile 类)
│ ├── source/ # 源码格式配置(可选)
│ └── ... # 其他(如服务脚本、安装模板)
├── src/ # 项目源代码(上游内容)
│ ├── main.c
│ └── ...
├── systemd/ # 服务文件(如 .service)
├── Makefile # 项目构建配置
├── README.md
└── LICENSE
debian/
目录关键文件说明:
文件 | 作用 |
---|---|
control |
定义包名、版本、架构、依赖关系(如 Depends: python3 )。 |
changelog |
记录版本变更,格式需严格遵循(使用 dch 工具生成)。 |
rules |
构建脚本(如调用 make ),需可执行权限。支持覆盖标准步骤(build 、install )。 |
copyright |
声明软件许可证及版权归属。 |
install |
指定需安装的文件及目标路径(如 src/myapp /usr/bin )。 |
💡 注意:
- 若项目需适配 Debian 官方源,建议通过
.gitattributes
排除debian/
目录在源码 tarball 中的发布。- 非 Debian 原生包(如从上游源码构建)需分离
debian/
目录;若为原生包(如自研软件),可直接包含在源码树中。
🔧 三、构建 Debian 包的方法
环境准备(Debian/Ubuntu):
# 安装基础编译工具
sudo apt install build-essential devscripts dpkg-dev
# 安装依赖检查工具
sudo apt install fakeroot lintian
构建步骤:
- 进入源码目录:
cd my-app/
- 安装构建依赖:
sudo apt build-dep . # 自动解析 control 中的依赖
- 执行构建(二选一):
dpkg-buildpackage
(基础命令):dpkg-buildpackage -rfakeroot -b -uc -us # -b: 仅构建二进制包;-uc/-us: 不签名
debuild
(推荐,自动检查规范):debuild -b -uc -us # 生成 .deb 文件及日志
- 输出文件:
生成的.deb
位于上级目录(如../myapp_1.0-1_amd64.deb
)。
⚠️ 跨平台构建提示:
在非 Debian 系统(如 RHEL)上构建时,建议使用 Docker 创建纯净的 Debian 环境:docker run -v $(pwd):/src -it debian:stable apt update && apt install build-essential cd /src && dpkg-buildpackage -b
🚀 四、发布软件包到 PPA(个人软件仓库)
通过 Launchpad 的 PPA(Personal Package Archive)发布,允许用户通过 apt
安装:
步骤:
- 注册与配置:
- 创建 Launchpad 账户(需验证邮箱)。
- 生成 GPG 密钥(4096 位)并上传至
keyserver.ubuntu.com
:gpg --gen-key gpg --export --armor you@email.com | sudo apt-key add -
- 创建 PPA 仓库:
在 Launchpad 控制台新建 PPA(如ppa:yourname/yourrepo
)。 - 构建源码包(需含完整
debian/
):debuild -S -sa # -S: 生成源码包;-sa: 包含源码
- 上传到 PPA:
dput ppa:yourname/yourrepo ../myapp_1.0-1_source.changes
用户安装方式:
sudo add-apt-repository ppa:yourname/yourrepo
sudo apt update
sudo apt install myapp
💎 五、关键注意事项
- 目录规范:
安装文件需按 FHS 部署(如二进制至/usr/bin
,配置文件至/etc
)。 - 依赖管理:
control
文件需明确定义依赖(如Depends: libc6 (>= 2.34)
),避免运行时缺失。 - 测试验证:
- 使用
lintian
检查包规范:lintian ../myapp.deb
。 - 在纯净环境中测试安装/卸载流程。
- 使用
总结
发布 Debian 软件包的核心在于规范组织 debian/
控制目录,并通过 dpkg-buildpackage
或 debuild
构建。对于个人分发,PPA 是最便捷的托管方案;若需跨平台构建,推荐使用 Docker 容器隔离环境。严格遵循 FHS 和 Debian Policy 可确保包兼容性与可维护性。
apt-key
确实已在最新 Debian/Ubuntu 版本中被废弃。以下是更新后的 GPG 密钥管理方法:
🔑 修正后的 GPG 密钥管理(替代 apt-key
)
新方法步骤:
-
生成 GPG 密钥:
gpg --full-generate-key
- 选择密钥类型:
RSA (sign only)
- 密钥长度:
4096
- 设置姓名和邮箱(需与 Launchpad 注册邮箱一致)
- 选择密钥类型:
-
导出公钥到文件:
gpg --export --armor you@email.com > my-public-key.asc
-
将公钥添加到 APT 信任链(新标准方法):
sudo mkdir -p /etc/apt/keyrings sudo gpg --dearmor -o /etc/apt/keyrings/my-key.gpg my-public-key.asc
-
上传公钥到 Ubuntu 密钥服务器:
gpg --keyserver keyserver.ubuntu.com --send-keys
通过
gpg --list-secret-keys
查看<KEY-ID>
(类似3B4FE6ACC0B21F32
) -
在 Launchpad 账户中添加此密钥:
- 登录 Launchpad
- 进入
~/.gnupg/openpgp-revocs.d
找到.rev
吊销证书(可选) - 在账户设置中导入密钥
📤 更新后的 PPA 上传流程
构建签名源码包:
debuild -S -sa # -sa 确保包含完整源码
上传到 PPA:
dput ppa:yourname/yourrepo ../myapp_1.0-1_source.changes
👥 用户端安装更新(新密钥系统)
用户添加 PPA 时仍使用标准命令:
sudo add-apt-repository ppa:yourname/yourrepo
sudo apt update
底层变化:
add-apt-repository
现在会自动:
- 在
/etc/apt/sources.list.d/
创建.list
文件 - 在
/etc/apt/keyrings/
添加对应的.gpg
密钥环 - 在
.list
文件中显式指定密钥路径:deb [signed-by=/etc/apt/keyrings/my-key.gpg] https://ppa.launchpadcontent.net/yourname/yourrepo/ubuntu jammy main
⚠️ 关键注意事项
-
密钥目录权限:
sudo chmod 644 /etc/apt/keyrings/*.gpg # 确保全局可读
-
旧系统兼容:
如需支持 Ubuntu 20.04 等旧系统:sudo cp my-public-key.asc /usr/share/keyrings/ sudo ln -s /usr/share/keyrings/my-public-key.asc /etc/apt/trusted.gpg.d/
-
验证密钥:
apt-key list # 已废弃,改用: gpg --list-keys --keyring /etc/apt/keyrings/my-key.gpg
这些更改遵循 Debian RFC 8220 规范,提供更安全的密钥管理机制,避免了全局密钥环的安全风险。
发表回复