deb 包里面装的是什么?

格式解析

根据维基百科,deb 包是一个标准的 ar 归档。

因此,对于 Modern CMake for C++ 中示例代码用 CPack 创建的包 CPackPackage-1.2.3-Linux.deb,可以直接解压。

ar x CPackPackage-1.2.3-Linux.deb

解压可以得到三个东西:

.
├── control.tar.gz
├── data.tar.gz
└── debian-binary

其中 debian-binary 是个文本文件,我这里里面填写的信息是字符串 2.0

control.tar.gz 解压之后有两个文件:control 和 md5sums,前者记录了包的基本信息:

Architecture: amd64
Description: Simple Calculator
Maintainer: email@example.com
Package: cpackpackage
Priority: optional
Section: devel
Version: 1.2.3
Installed-Size: 33

后者记录了 data.tar.gz 中每个文件的校验和。

data.tar.gz 解压之后:

$ mkdir data && tar -C data -zxf data.tar.gz
$ tree data
data
└── usr
    ├── include
    │   └── calc
    │       └── calc.h
    └── lib
        ├── calc
        │   └── cmake
        │       ├── CalcConfig.cmake
        │       ├── CalcTargets.cmake
        │       └── CalcTargets-debug.cmake
        └── libcalc.a

说明 data.tar.gz 里面放的是标准的压缩数据,和以压缩文件方式导出是一样的。

用工具查看

在不解压、不安装的情况下查看 deb 包的文件可以使用 dpkg-c 选项。

dpkg 提供了一个 --fsys-tarfile 选项,这个选项可以将 deb 包输出为 tar 包,从而允许将 deb 包提取到文件(提取之前肯定是要用 -c 选项去看有哪些文件的),或者和 tar 程序建立管道执行文件提取等功能。比如:

dpkg --fsys-tarfile somepackage.deb | tar -xO ./usr/include/a/b/c.hpp | less