1. 为什么需要自己制作.deb包?
在Debian系Linux发行版中,.deb是最基础的软件分发格式。掌握打包技能意味着你可以:
- 将自研脚本/程序标准化部署到多台服务器
- 修改现有软件包的配置后重新打包分发
- 为内网环境制作定制化的离线安装包
- 参与开源项目维护时处理软件包依赖
我最早接触打包是因为需要批量部署自研的监控脚本。当时手动复制文件既低效又难以维护,后来学会打包后,版本管理和部署效率提升了90%以上。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础打包环境搭建
2.1 必备工具安装
在Debian/Ubuntu上执行:
bash复制sudo apt update
sudo apt install -y build-essential devscripts debhelper dh-make
关键工具说明:
dh_make:初始化包结构的脚手架工具debhelper:提供打包用的辅助脚本devscripts:包含源码包校验工具
注意:建议使用较新的Debian/Ubuntu系统作为打包环境,旧版本的工具链可能导致兼容性问题。
2.2 测试环境准备
我习惯使用LXC容器隔离打包环境:
bash复制sudo lxc-create -n pack-env -t download -- \
-d debian -r bookworm -a amd64
sudo lxc-start -n pack-env
容器化的优势:
- 避免污染主机环境
- 可以模拟不同发行版环境
- 快速重置测试环境
3. 从零开始构建示例包
我们以打包一个简单的bash脚本为例:
3.1 创建项目结构
bash复制mkdir -p mypkg/usr/local/bin
cat > mypkg/usr/local/bin/hello <<'EOF'
#!/bin/bash
echo "Hello from custom package!"
EOF
chmod +x mypkg/usr/local/bin/hello
3.2 初始化包配置
bash复制cd mypkg
dh_make --createorig -s -n
这会生成debian目录,关键文件包括:
control:包元数据(依赖/描述等)rules:构建规则文件changelog:版本变更记录
3.3 修改control文件示例
plaintext复制Source: mypkg
Section: utils
Priority: optional
Maintainer: Your Name <your@email.com>
Build-Depends: debhelper-compat (= 13)
Standards-Version: 4.6.1
Package: mypkg
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: Example package
A simple demonstration of .deb packaging.
3.4 构建二进制包
bash复制dpkg-buildpackage -us -uc
成功后会生成:
../mypkg_1.0-1_amd64.deb:二进制包../mypkg_1.0-1.dsc:源码包描述
4. 高级打包技巧
4.1 处理安装前后脚本
在debian目录创建:
preinst:安装前执行的脚本postinst:安装后执行的脚本
示例postinst:
bash复制#!/bin/sh
set -e
case "$1" in
configure)
update-alternatives --install \
/usr/bin/hello hello /usr/local/bin/hello 100
;;
abort-upgrade|abort-remove)
;;
*)
echo "Usage: $0 {configure}"
exit 1
;;
esac
exit 0
4.2 添加系统服务
- 创建systemd单元文件:
bash复制mkdir -p mypkg/lib/systemd/system
cat > mypkg/lib/systemd/system/mypkg.service <<EOF
[Unit]
Description=My Package Service
[Service]
ExecStart=/usr/local/bin/hello
Restart=always
[Install]
WantedBy=multi-user.target
EOF
- 在postinst中添加:
bash复制systemctl daemon-reload
systemctl enable mypkg.service
5. 常见问题排查
5.1 依赖问题修复
如果出现依赖错误:
bash复制sudo apt-get install -f
检查依赖关系:
bash复制dpkg -I package.deb | grep Depends
5.2 包验证与测试
安装前检查:
bash复制lintian ../mypkg_1.0-1_amd64.deb
测试安装:
bash复制sudo dpkg -i ../mypkg_1.0-1_amd64.deb
卸载测试:
bash复制sudo dpkg -r mypkg
6. 实际项目经验分享
在为企业内部打包Python应用时,我总结出以下最佳实践:
- 使用
pyinstaller生成单文件二进制后再打包 - 通过
virtualenv隔离Python依赖 - 在
postinst中设置合理的文件权限 - 使用
conffiles标记配置文件
典型目录结构示例:
code复制/opt/myapp/
├── bin/
├── lib/
├── etc/
└── var/
打包时特别注意:
- 配置文件要放在
/etc目录 - 日志文件目录需设置
logrotate - 临时文件使用
tmpfiles.d管理
7. 持续集成方案
推荐使用GitLab CI自动打包:
yaml复制stages:
- build
build_package:
stage: build
image: debian:bookworm
script:
- apt update && apt install -y build-essential devscripts
- dpkg-buildpackage -us -uc
artifacts:
paths:
- "*.deb"
关键配置点:
- 使用官方基础镜像确保一致性
- 缓存
$HOME/.cache加速构建 - 通过artifacts保存生成的包
8. 软件仓库管理
搭建私有仓库的简易方案:
bash复制sudo apt install reprepro
mkdir -p /var/packages/conf
cat > /var/packages/conf/distributions <<EOF
Codename: bookworm
Components: main
Architectures: amd64 arm64
EOF
reprepro includedeb bookworm /path/to/*.deb
客户端配置:
bash复制echo "deb http://your-repo/ bookworm main" | sudo tee /etc/apt/sources.list.d/custom.list
sudo apt update
