Debian软件包发布指南

在 Debian 系统中发布自行编译的软件包需遵循其打包规范,涉及目录结构、构建工具和发布流程。以下是关键步骤及目录组织格式的详细说明:


📦 一、Debian 软件包基本结构

Debian 软件包(.deb)本质是 ar 格式的归档文件,包含三个核心部分:

  1. debian-binary
    仅包含版本号(如 2.0),标识包格式版本。
  2. control.tar.gz
    包含控制信息:

    • control:包名、版本、依赖等元数据;
    • md5sums:文件校验和;
    • 脚本文件:preinst(安装前)、postinst(安装后)、prerm(卸载前)、postrm(卸载后)。
  3. 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),需可执行权限。支持覆盖标准步骤(buildinstall)。
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

构建步骤:

  1. 进入源码目录
    cd my-app/
  2. 安装构建依赖
    sudo apt build-dep .   # 自动解析 control 中的依赖
  3. 执行构建(二选一):
    • dpkg-buildpackage(基础命令):
      dpkg-buildpackage -rfakeroot -b -uc -us  # -b: 仅构建二进制包;-uc/-us: 不签名
    • debuild(推荐,自动检查规范):
      debuild -b -uc -us  # 生成 .deb 文件及日志
  4. 输出文件
    生成的 .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 安装:

步骤

  1. 注册与配置
    • 创建 Launchpad 账户(需验证邮箱)。
    • 生成 GPG 密钥(4096 位)并上传至 keyserver.ubuntu.com
      gpg --gen-key
      gpg --export --armor you@email.com | sudo apt-key add -
  2. 创建 PPA 仓库
    在 Launchpad 控制台新建 PPA(如 ppa:yourname/yourrepo)。
  3. 构建源码包(需含完整 debian/):
    debuild -S -sa  # -S: 生成源码包;-sa: 包含源码
  4. 上传到 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

💎 五、关键注意事项

  1. 目录规范
    安装文件需按 FHS 部署(如二进制至 /usr/bin,配置文件至 /etc)。
  2. 依赖管理
    control 文件需明确定义依赖(如 Depends: libc6 (>= 2.34)),避免运行时缺失。
  3. 测试验证
    • 使用 lintian 检查包规范:lintian ../myapp.deb
    • 在纯净环境中测试安装/卸载流程。

总结

发布 Debian 软件包的核心在于规范组织 debian/ 控制目录,并通过 dpkg-buildpackagedebuild 构建。对于个人分发,PPA 是最便捷的托管方案;若需跨平台构建,推荐使用 Docker 容器隔离环境。严格遵循 FHS 和 Debian Policy 可确保包兼容性与可维护性。


apt-key 确实已在最新 Debian/Ubuntu 版本中被废弃。以下是更新后的 GPG 密钥管理方法:

🔑 修正后的 GPG 密钥管理(替代 apt-key

新方法步骤

  1. 生成 GPG 密钥

    gpg --full-generate-key
    • 选择密钥类型:RSA (sign only)
    • 密钥长度:4096
    • 设置姓名和邮箱(需与 Launchpad 注册邮箱一致)
  2. 导出公钥到文件

    gpg --export --armor you@email.com > my-public-key.asc
  3. 将公钥添加到 APT 信任链(新标准方法)

    sudo mkdir -p /etc/apt/keyrings
    sudo gpg --dearmor -o /etc/apt/keyrings/my-key.gpg my-public-key.asc
  4. 上传公钥到 Ubuntu 密钥服务器

    gpg --keyserver keyserver.ubuntu.com --send-keys 

    通过 gpg --list-secret-keys 查看 <KEY-ID>(类似 3B4FE6ACC0B21F32

  5. 在 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 现在会自动:

  1. /etc/apt/sources.list.d/ 创建 .list 文件
  2. /etc/apt/keyrings/ 添加对应的 .gpg 密钥环
  3. .list 文件中显式指定密钥路径:
    deb [signed-by=/etc/apt/keyrings/my-key.gpg] https://ppa.launchpadcontent.net/yourname/yourrepo/ubuntu jammy main

⚠️ 关键注意事项

  1. 密钥目录权限

    sudo chmod 644 /etc/apt/keyrings/*.gpg  # 确保全局可读
  2. 旧系统兼容
    如需支持 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/
  3. 验证密钥

    apt-key list  # 已废弃,改用:
    gpg --list-keys --keyring /etc/apt/keyrings/my-key.gpg

这些更改遵循 Debian RFC 8220 规范,提供更安全的密钥管理机制,避免了全局密钥环的安全风险。


评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

zh_CN简体中文