Debian软件包发布指南

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


📦 一、Debian 软件包基本结构

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

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

    • <code>control</code>:包名、版本、依赖等元数据;
    • <code>md5sums</code>:文件校验和;
    • 脚本文件:<code>preinst</code>(安装前)、<code>postinst</code>(安装后)、<code>prerm</code>(卸载前)、<code>postrm</code>(卸载后)。
  3. <code>data.tar.xz</code>
    存放实际要安装的文件(如二进制、配置文件),按 Linux 文件系统层次标准(FHS)组织(如 <code>/usr/bin</code>、<code>/etc</code>)。

📂 二、源代码目录组织格式

构建 Debian 包需在源代码根目录创建 <code>debian/</code> 子目录,存放打包控制文件。典型结构如下:

my-app/
├── debian/             # 打包控制目录(必需)
│   ├── control         # 包元数据(名称、依赖等)
│   ├── copyright       # 版权声明
│   ├── changelog       # 版本变更历史
│   ├── rules           # 构建脚本(Makefile 类)
│   ├── source/         # 源码格式配置(可选)
│   └── ...             # 其他(如服务脚本、安装模板)
├── src/                # 项目源代码(上游内容)
│   ├── main.c
│   └── ...
├── systemd/            # 服务文件(如 .service)
├── Makefile            # 项目构建配置
├── README.md
└── LICENSE

<code>debian/</code> 目录关键文件说明

文件 作用
<code>control</code> 定义包名、版本、架构、依赖关系(如 <code>Depends: python3</code>)。
<code>changelog</code> 记录版本变更,格式需严格遵循(使用 <code>dch</code> 工具生成)。
<code>rules</code> 构建脚本(如调用 <code>make</code>),需可执行权限。支持覆盖标准步骤(<code>build</code>、<code>install</code>)。
<code>copyright</code> 声明软件许可证及版权归属。
<code>install</code> 指定需安装的文件及目标路径(如 <code>src/myapp /usr/bin</code>)。

💡 注意

  • 若项目需适配 Debian 官方源,建议通过 <code>.gitattributes</code> 排除 <code>debian/</code> 目录在源码 tarball 中的发布。
  • 非 Debian 原生包(如从上游源码构建)需分离 <code>debian/</code> 目录;若为原生包(如自研软件),可直接包含在源码树中。

🔧 三、构建 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. 执行构建(二选一):
    • <code>dpkg-buildpackage</code>(基础命令):
      dpkg-buildpackage -rfakeroot -b -uc -us  # -b: 仅构建二进制包;-uc/-us: 不签名
    • <code>debuild</code>(推荐,自动检查规范):
      debuild -b -uc -us  # 生成 .deb 文件及日志
  4. 输出文件
    生成的 <code>.deb</code> 位于上级目录(如 <code>../myapp_1.0-1_amd64.deb</code>)。

⚠️ 跨平台构建提示
在非 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)发布,允许用户通过 <code>apt</code> 安装:

步骤

  1. 注册与配置
    • 创建 Launchpad 账户(需验证邮箱)。
    • 生成 GPG 密钥(4096 位)并上传至 <code>keyserver.ubuntu.com</code>:
      gpg --gen-key
      gpg --export --armor you@email.com | sudo apt-key add -
  2. 创建 PPA 仓库
    在 Launchpad 控制台新建 PPA(如 <code>ppa:yourname/yourrepo</code>)。
  3. 构建源码包(需含完整 <code>debian/</code>):
    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 部署(如二进制至 <code>/usr/bin</code>,配置文件至 <code>/etc</code>)。
  2. 依赖管理
    <code>control</code> 文件需明确定义依赖(如 <code>Depends: libc6 (>= 2.34)</code>),避免运行时缺失。
  3. 测试验证
    • 使用 <code>lintian</code> 检查包规范:<code>lintian ../myapp.deb</code>。
    • 在纯净环境中测试安装/卸载流程。

总结

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


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

🔑 修正后的 GPG 密钥管理(替代 <code>apt-key</code>)

新方法步骤

  1. 生成 GPG 密钥

    gpg --full-generate-key
    • 选择密钥类型:<code>RSA (sign only)</code>
    • 密钥长度:<code>4096</code>
    • 设置姓名和邮箱(需与 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 <KEY-ID>

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

  5. 在 Launchpad 账户中添加此密钥

    • 登录 Launchpad
    • 进入 <code>~/.gnupg/openpgp-revocs.d</code> 找到 <code>.rev</code> 吊销证书(可选)
    • 在账户设置中导入密钥

📤 更新后的 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

底层变化:

<code>add-apt-repository</code> 现在会自动:

  1. 在 <code>/etc/apt/sources.list.d/</code> 创建 <code>.list</code> 文件
  2. 在 <code>/etc/apt/keyrings/</code> 添加对应的 <code>.gpg</code> 密钥环
  3. 在 <code>.list</code> 文件中显式指定密钥路径:
    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 规范,提供更安全的密钥管理机制,避免了全局密钥环的安全风险。