DEB包解包与打包笔记
一、DEB包结构
package.deb
├── debian-binary # 版本号文件(内容: 2.0)
├── control.tar.xz # 控制信息(元数据)
│ ├── control # 包描述信息
│ ├── postinst # 安装后脚本
│ ├── prerm # 卸载前脚本
│ ├── postrm # 卸载后脚本
│ └── preinst # 安装前脚本
└── data.tar.xz # 实际要安装的文件
├── usr/
├── etc/
└── ...
二、解包方法
2.1 完整解包(推荐用于修改重打包)
bash
# 方法1:使用 -R 参数(最推荐)解压所有文件(数据+控制信息)到同一目录
dpkg-deb -R package.deb extract_dir
# 方法2:使用 --raw-extract
dpkg-deb --raw-extract package.deb extract_dir
解包后目录结构:
extract_dir/
├── DEBIAN/ # 控制信息
│ ├── control
│ ├── postinst
│ └── ...
└── usr/bin/... # 实际文件
2.2 分别解包
bash
# 只解压数据文件
dpkg-deb -x package.deb data_dir
# 只解压控制信息
dpkg-deb -e package.deb control_dir
# 组合使用(完整解包)
mkdir mypackage
dpkg-deb -x package.deb mypackage
dpkg-deb -e package.deb mypackage/DEBIAN
2.3 手动解包(底层方法)
bash
# 创建工作目录
mkdir -p deb-extract && cd deb-extract
# 使用 ar 解包
ar x ../package.deb
# 解压控制信息
mkdir DEBIAN
tar -xf control.tar.xz -C DEBIAN
# 解压数据文件
tar -xf data.tar.xz
# 查看包内容(不解压)
ar t package.deb
dpkg-deb -c package.deb
三、打包方法
3.1 基本打包
bash
# 基本打包
dpkg-deb -b source_dir output.deb
# 指定输出目录
dpkg-deb -b source_dir /path/to/output.deb
3.2 指定压缩方式
bash
# 使用 xz 压缩(推荐,压缩比最高)
dpkg-deb -Zxz -b source_dir output.deb
# 使用 gzip 压缩(兼容性最好)
dpkg-deb -Zgzip -b source_dir output.deb
# 使用 bzip2 压缩
dpkg-deb -Zbzip2 -b source_dir output.deb
# 不压缩
dpkg-deb -Znone -b source_dir output.deb
3.3 指定压缩级别
bash
# 压缩级别 0-9(9最高)
dpkg-deb -Zxz -z9 -b source_dir output.deb
3.4 使用 --build 参数
bash
# 等同于 -b
dpkg-deb --build source_dir output.deb
四、完整工作流程
4.1 修改现有DEB包
bash
#!/bin/bash
ORIGINAL="original.deb"
WORK_DIR="mypackage"
OUTPUT="modified.deb"
# 1. 解包
dpkg-deb -R "$ORIGINAL" "$WORK_DIR"
# 2. 修改文件
vim "$WORK_DIR/DEBIAN/control"
vim "$WORK_DIR/usr/bin/somefile"
# 3. 修改版本号(可选)
sed -i 's/Version: .*/Version: 1.0.1-modified/' "$WORK_DIR/DEBIAN/control"
# 4. 重新打包
dpkg-deb -Zxz -b "$WORK_DIR" "$OUTPUT"
# 5. 验证
dpkg-deb -I "$OUTPUT"
dpkg-deb -c "$OUTPUT"
# 6. 清理
rm -rf "$WORK_DIR"
4.2 从头创建DEB包
bash
# 创建目录结构
mkdir -p myapp/DEBIAN
mkdir -p myapp/usr/bin
mkdir -p myapp/usr/share/doc/myapp
# 创建 control 文件
cat > myapp/DEBIAN/control << 'EOF'
Package: myapp
Version: 1.0.0
Section: utils
Priority: optional
Architecture: amd64
Maintainer: Your Name <your@email.com>
Description: My application
Long description here
Second line
EOF
# 添加程序文件
cp my_binary myapp/usr/bin/
chmod 755 myapp/usr/bin/my_binary
# 创建安装后脚本(可选)
cat > myapp/DEBIAN/postinst << 'EOF'
#!/bin/bash
echo "Installation completed"
EOF
chmod 755 myapp/DEBIAN/postinst
# 打包
dpkg-deb -Zxz -b myapp myapp_1.0.0_amd64.deb
五、常用查看命令
bash
# 查看包信息
dpkg-deb -I package.deb
dpkg-deb --info package.deb
# 查看包内文件列表
dpkg-deb -c package.deb
dpkg-deb --contents package.deb
# 查看 control 文件
dpkg-deb -f package.deb
dpkg-deb --field package.deb
# 查看特定字段
dpkg-deb -f package.deb Package Version
六、DEBIAN/control 文件示例
Package: myapp
Version: 1.0.0-1
Section: utils
Priority: optional
Architecture: amd64
Essential: no
Depends: libc6 (>= 2.27), libssl1.1
Recommends: curl
Suggests: wget
Conflicts: oldapp
Replaces: oldapp
Installed-Size: 1024
Maintainer: Your Name <your@email.com>
Homepage: https://example.com
Description: Short description (one line)
Long description here. Must be indented with a space.
Each paragraph separated by a line with single dot.
.
Another paragraph.
七、维护脚本说明
bash
DEBIAN/
├── preinst # 安装前执行
├── postinst # 安装后执行
├── prerm # 卸载前执行
└── postrm # 卸载后执行
脚本模板:
bash
#!/bin/bash
set -e
case "$1" in
configure)
# 配置逻辑
;;
abort-upgrade|abort-remove|abort-deconfigure)
;;
*)
echo "postinst called with unknown argument \`$1'" >&2
exit 1
;;
esac
exit 0
八、注意事项
-
权限问题
bash# DEBIAN目录下的脚本必须可执行 chmod 755 myapp/DEBIAN/postinst chmod 755 myapp/DEBIAN/prerm # control文件不需要执行权限 chmod 644 myapp/DEBIAN/control -
文件所有者
bash# 确保文件属于 root(打包时会自动处理) sudo chown -R root:root myapp/ dpkg-deb -b myapp -
命名规范
包名_版本号_架构.deb 例如: myapp_1.0.0-1_amd64.deb -
验证包完整性
bash# 检查包是否正确 lintian package.deb # 测试安装 sudo dpkg -i package.deb # 卸载测试 sudo dpkg -r package-name
九、常见问题排查
bash
# 1. 查看打包错误
dpkg-deb -b myapp 2>&1 | tee build.log
# 2. 检查 control 文件格式
dpkg-deb -f myapp.deb
# 3. 验证依赖关系
dpkg-deb -f myapp.deb Depends
# 4. 检查文件权限
tar -tvf data.tar.xz
十、快速参考
| 操作 | 命令 |
|---|---|
| 完整解包 | dpkg-deb -R pkg.deb dir |
| 打包 | dpkg-deb -b dir pkg.deb |
| 查看信息 | dpkg-deb -I pkg.deb |
| 查看内容 | dpkg-deb -c pkg.deb |
| 安装 | sudo dpkg -i pkg.deb |
| 卸载 | sudo dpkg -r package-name |