DEB包解包与打包笔记

DEB包解包与打包笔记

一、DEB包结构

package.deb
├── debian-binary          # 版本号文件(内容: 2.0)
├── control.tar.xz        # 控制信息(元数据)
│   ├── control           # 包描述信息
│   ├── postinst          # 安装后脚本
│   ├── prerm             # 卸载前脚本
│   ├── postrm            # 卸载后脚本
│   └── preinst           # 安装前脚本
└── data.tar.xz           # 实际要安装的文件
    ├── usr/
    ├── etc/
    └── ...

二、解包方法

2.1 完整解包(推荐用于修改重打包)

# 方法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 分别解包

# 只解压数据文件
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 手动解包(底层方法)

# 创建工作目录
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 基本打包

# 基本打包
dpkg-deb -b source_dir output.deb

# 指定输出目录
dpkg-deb -b source_dir /path/to/output.deb

3.2 指定压缩方式

# 使用 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 指定压缩级别

# 压缩级别 0-9(9最高)
dpkg-deb -Zxz -z9 -b source_dir output.deb

3.4 使用 --build 参数

# 等同于 -b
dpkg-deb --build source_dir output.deb

四、完整工作流程

4.1 修改现有DEB包

#!/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包

# 创建目录结构
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

五、常用查看命令

# 查看包信息
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.

七、维护脚本说明

DEBIAN/
├── preinst      # 安装前执行
├── postinst     # 安装后执行
├── prerm        # 卸载前执行
└── postrm       # 卸载后执行

脚本模板:

#!/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

八、注意事项

  1. 权限问题

    # DEBIAN目录下的脚本必须可执行
    chmod 755 myapp/DEBIAN/postinst
    chmod 755 myapp/DEBIAN/prerm
    
    # control文件不需要执行权限
    chmod 644 myapp/DEBIAN/control
    
  2. 文件所有者

    # 确保文件属于 root(打包时会自动处理)
    sudo chown -R root:root myapp/
    dpkg-deb -b myapp
    
  3. 命名规范

    包名_版本号_架构.deb
    例如: myapp_1.0.0-1_amd64.deb
    
  4. 验证包完整性

    # 检查包是否正确
    lintian package.deb
    
    # 测试安装
    sudo dpkg -i package.deb
    
    # 卸载测试
    sudo dpkg -r package-name
    

九、常见问题排查

# 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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值