news 2026/2/6 18:07:48

Debian 包的制作与安装完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Debian 包的制作与安装完整指南

1. 创建简单的程序

首先创建一个简单的 C 程序作为示例:

# 创建程序目录 mkdir -p ~/example/hello-world-program # 编写 C 程序 echo '#include <stdio.h> int main() { printf("hello packaged world\n"); return 0; }' > ~/example/hello-world-program/hello.c # 编译程序 cd ~/example/hello-world-program gcc -o hello-world hello.c

2. 创建 Debian 包结构

2.1 创建包目录结构

# 创建符合命名规范的目录 # 格式: <package-name>_<version>-<release-number>_<architecture> mkdir -p ~/example/hello-world_0.0.1-1_amd64

2.2 组织文件结构

cd ~/example/hello-world_0.0.1-1_amd64 # 创建二进制文件目录 mkdir -p usr/bin # 复制编译好的程序 cp ~/example/hello-world-program/hello-world usr/bin/

2.3 创建控制文件

# 创建 DEBIAN 目录 mkdir -p DEBIAN # 创建 control 文件 cat > DEBIAN/control << EOF Package: hello-world Version: 0.0.1 Maintainer: example <example@example.com> Depends: libc6 Architecture: amd64 Homepage: http://example.com Description: A program that prints hello EOF

3. 构建 Debian 包

# 返回包目录的上级目录 cd ~/example # 构建 .deb 包 dpkg --build hello-world_0.0.1-1_amd64

构建完成后会生成hello-world_0.0.1-1_amd64.deb文件。

4. 检查包内容

4.1 查看包信息

dpkg-deb --info hello-world_0.0.1-1_amd64.deb

输出示例:

new Debian package, version 2.0. size 2832 bytes: control archive=336 bytes. 182 bytes, 7 lines control Package: hello-world Version: 0.0.1 Maintainer: example <example@example.com> Depends: libc6 Architecture: amd64 Homepage: http://example.com Description: A program that prints hello

4.2 查看包内容

dpkg-deb --contents hello-world_0.0.1-1_amd64.deb

5. 安装和测试

5.1 安装包

sudo apt-get install -f ./hello-world_0.0.1-1_amd64.deb

5.2 验证安装

# 检查程序位置 which hello-world # 运行程序 hello-world

应该输出:hello packaged world

5.3 卸载包

sudo apt-get remove hello-world

6. 创建 APT 仓库(可选)

6.1 创建仓库目录结构

mkdir -p ~/example/apt-repo/pool/main/ cp ~/example/hello-world_0.0.1-1_amd64.deb ~/example/apt-repo/pool/main/

6.2 生成 Packages 文件

cd ~/example/apt-repo mkdir -p dists/stable/main/binary-amd64 # 生成 Packages 文件 dpkg-scanpackages --arch amd64 pool/ > dists/stable/main/binary-amd64/Packages # 压缩 Packages 文件 gzip -9 < dists/stable/main/binary-amd64/Packages > dists/stable/main/binary-amd64/Packages.gz

6.3 生成 Release 文件

# 创建生成脚本 cat > ~/example/generate-release.sh << 'EOF' #!/bin/sh set -e do_hash() { HASH_NAME=$1 HASH_CMD=$2 echo "${HASH_NAME}:" for f in $(find -type f); do f=$(echo $f | cut -c3-) # remove ./ prefix if [ "$f" = "Release" ]; then continue fi echo " $(${HASH_CMD} ${f} | cut -d" " -f1) $(wc -c $f)" done } cat << EOF Origin: Example Repository Label: Example Suite: stable Codename: stable Version: 1.0 Architectures: amd64 Components: main Description: An example software repository Date: $(date -Ru) EOF do_hash "MD5Sum" "md5sum" do_hash "SHA1" "sha1sum" do_hash "SHA256" "sha256sum" EOF chmod +x ~/example/generate-release.sh # 生成 Release 文件 cd ~/example/apt-repo/dists/stable ~/example/generate-release.sh > Release

7. 测试本地仓库

7.1 启动 HTTP 服务器

cd ~/example python3 -m http.server

7.2 配置 APT 源

echo "deb [arch=amd64] http://127.0.0.1:8000/apt-repo stable main" | sudo tee /etc/apt/sources.list.d/example.list

7.3 更新并安装

sudo apt-get update --allow-insecure-repositories sudo apt-get install hello-world

8. 包签名(安全部署)

8.1 生成 GPG 密钥

# 创建密钥生成配置 cat > /tmp/example-pgp-key.batch << EOF %echo Generating an example PGP key Key-Type: RSA Key-Length: 4096 Name-Real: example Name-Email: example@example.com Expire-Date: 0 %no-ask-passphrase %no-protection %commit EOF # 生成密钥 export GNUPGHOME="$(mktemp -d ~/example/pgpkeys-XXXXXX)" gpg --no-tty --batch --gen-key /tmp/example-pgp-key.batch

8.2 导出公钥

gpg --armor --export example > ~/example/pgp-key.public

8.3 签名仓库

# 签名 Release 文件 cd ~/example/apt-repo/dists/stable cat Release | gpg --default-key example -abs > Release.gpg # 创建 InRelease 文件(包含签名的 Release) cat Release | gpg --default-key example -abs --clearsign > InRelease

8.4 安全配置 APT 源

echo "deb [arch=amd64 signed-by=$HOME/example/pgp-key.public] http://127.0.0.1:8000/apt-repo stable main" | sudo tee /etc/apt/sources.list.d/example.list # 安全更新和安装 sudo apt-get update sudo apt-get install hello-world

重要注意事项

  1. 包命名规范:遵循<package>_<version>-<release>_<arch>格式

  2. 文件权限:确保二进制文件有可执行权限

  3. 依赖管理:在 control 文件中正确声明依赖

  4. 架构支持:根据程序类型选择正确的架构(amd64, all 等)

  5. 安全签名:生产环境必须使用 GPG 签名

  6. 私钥保护:妥善保管 GPG 私钥,不要泄露

这个指南涵盖了从简单程序打包到完整 APT 仓库创建的全过程,适合个人使用和小规模部署。

参考:Creating and hosting your own deb packages and apt repo - Earthly Blog

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/6 10:56:53

【课程设计/毕业设计】基于SpringBoot+Vue的企业内部知识产权管理系统基于springboot的企业内部知识产权管理系统【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/2/5 0:21:01

突发,Deepseek新模型MODEL1曝光!

作为明星产品&#xff0c;必须得用放大镜看&#xff01;正值DeepSeek-R1 发布一周年之际&#xff0c;DeepSeek 在 GitHub 上悄悄更新了一波代码。结果&#xff0c;眼尖的开发者在 DeepSeek 核心的推理优化库 FlashMLA 中&#xff0c;发现了一个此前从未公开过的神秘代号&#x…

作者头像 李华
网站建设 2026/2/5 22:47:00

AI代码质检员:如何用大模型提前揪出软件缺陷?

深夜两点,某大型电商平台的代码仓库悄悄合入了一个看似普通的促销模块更新。三天后的618大促当天,系统却在订单峰值时意外崩溃——事后发现,原来是一个边界条件检查遗漏造成的并发问题。这种故事在软件工程领域反复上演,直到AI开始介入这个传统上依赖人工经验的领域。 想象…

作者头像 李华
网站建设 2026/2/5 19:24:16

IP地址与端口号

IP地址及编址方式 IP地址基础概念 IP地址的本质 定义&#xff1a;用于唯一标识互联网上设备的逻辑地址结构&#xff1a;采用两级结构&#xff08;网络号 主机号&#xff09;唯一性&#xff1a;在整个互联网范围内是唯一的表示方法&#xff1a;点分十进制记法&#xff08;如…

作者头像 李华
网站建设 2026/2/5 19:45:28

(新卷,200分)- 任务调度(Java JS Python)

(新卷,200分)- 任务调度&#xff08;Java & JS & Python&#xff09;题目描述现有一个CPU和一些任务需要处理&#xff0c;已提前获知每个任务的任务ID、优先级、所需执行时间和到达时间。 CPU同时只能运行一个任务&#xff0c;请编写一个任务调度程序&#xff0c;采用“…

作者头像 李华
网站建设 2026/2/5 18:09:08

(新卷,200分)- 探索地块建立(Java JS Python)

(新卷,200分)- 探索地块建立&#xff08;Java & JS & Python&#xff09; 题目描述 给一块n*m的地块&#xff0c;相当于n*m的二维数组&#xff0c;每个元素的值表示这个小地块的发电量&#xff1b; 求在这块地上建立正方形的边长为c的发电站&#xff0c;发电量满足目…

作者头像 李华