DEB(Debian 软件包)归档格式是一种广泛用于在 Debian 和基于 Debian 的 Linux 发行版(如 Ubuntu)上分发软件的打包系统。它提供了一种标准化方法,用于将软件与其依赖项、配置文件和元数据捆绑在一 起,使用户可以轻松安装、升级和删除软件包。
DEB 归档本质上是一个压缩归档文件,具有特定的结构和命名约定。它通常具有 `.deb` 文件扩展名,并使用 `ar` 归档实用程序创建。该归档包含三个主要组件:`debian-binary` 文件、`control.tar.gz` 归档和 `data.tar.gz` 归档。
`debian-binary` 文件是一个纯文本文件,用于指定归档中使用的 DEB 格式的版本。它通常包含一行版本号,例如 `2.0`。
`control.tar.gz` 归档包含包元数据和控制信息。它是一个 gzip 压缩的 tar 归档,其中包含多个文件和目录。此归档中最重要的文件是 `control` 文件,其中包含有关包的基本信息,例如其名称、版本、架构、依赖项、维护者和说明。
`control.tar.gz` 归档中的其他文件可能包括: - `preinst`:在安装包之前执行的脚本。 - `postinst`:在安装包之后执行的脚本。 - `prerm`:在删除包之前执行的脚本。 - `postrm`:在删除包之后执行的脚本。 - `conffiles`:属于该包的配置文件列表。 - `shlibs`:共享库依赖项列表。 - `triggers`:定义包触发器的文件。
`data.tar.gz` 归档包含构成软件包的实际文件和目录。它也是一个 gzip 压缩的 tar 归档。安装包时,此归档的内容将解压缩到文件系统的根目录。
DEB 归档格式对生成的包文件使用特定的命名约定。包文件名由几个部分组成:`<name>_<version>-<revision>_<architecture>.deb`。`<name>` 表示包名称,`<version>` 是软件的版本号,`<revision>` 是打包修订版(在同一软件版本多次打包时使用),`<architecture>` 指定目标架构(例如 amd64、i386、arm64)。
安装 DEB 包时,包管理器(例如 `apt` 或 `dpkg`)会执行几个步骤。它将 `data.tar.gz` 归档的内容解压缩到文件系统,执行 `control.tar.gz` 归档中定义的任何预安 装脚本,并更新包数据库以记录安装。包管理器还会解析并安装包所需的任何依赖项。
DEB 归档格式的一个主要优点是它处理依赖项的能力。`control.tar.gz` 归档中的 `control` 文件指定了包的依赖项,包括必需的包及其版本约束。在安装 DEB 包时,包管理器会自动解析并安装必要的依赖项,确保软件具有正常运行所需的所有组件。
DEB 归档格式还支持包版本控制和升级。每个包都有 `control` 文件中指定的一个版本号。当发布新版本的包时,它可以安装在现有版本之上。包管理器处理升级过程,执行任何必要的预删除和后安装脚本,并相应地更新包数据库。
除了主要组件之外,DEB 包还可以包含其他文件和目录,例如文档、示例和本地化文件。这些文件通常放置在 `data.tar.gz` 归档内的特定目录中,遵循文件系统层次标准 (FHS)。
DEB 归档格式拥有丰富的工具和实用程序生态系统,用于创建、管理和分发包。`dpkg-deb` 命令行工具通常用于从源代码或二进制文件创建 DEB 包。它自动执行生成必要的控制文件并将数据压缩到 DEB 归档格式的过程。
其他工具,例如 `dh_make` 和 `debhelper`,为构建 DEB 包提供了更高级别的抽象和自动化。它们通过生成模板文件、处理常见任务和强制执行打包最佳实践来简化打包过程。
DEB 归档格式还支持数字签名和包认证。可以使用私钥对包进行签名以确保其完整性和真实性。包管理器在安装期间验证签名以防止篡改并确保包来自受信任的来源。
总之,DEB 归档格式是一个功能强大且广泛用于基于 Debian 的 Linux 发行版的打包系统。它提供了一种标准化的方法来分发软件、处理依赖项以及管理包安装和升级。通过了解 DEB 包的结构和组件,开发人员和系统管理员可以有效地打包和分发他们的 软件,以可靠且高效的方式提供给用户。
文件压缩通过减少冗余,让相同的信息占用更少的比特。可压缩的上限受信息论约束:对于无损压缩,上界是信源熵(参见香农的信源编码定理及其 1948 年的原始论文《通信的数学理论》)。对于有损压缩,码率与感知质量之间的权衡由率失真理论描述。
大多数压缩器分两步。首先,模型预测或揭示数据中的结构。然后,编码器把这些预测变成近乎最优的比特模式。一个经典的建模家族是 Lempel–Ziv:LZ77 (1977)和 LZ78 (1978) 会检测重复子串并输出引用而不是原始字节。在编码端,霍夫曼编码(见原始论文1952)会为更常见的符号分配更短的代码。算术编码和范围编码能更贴近熵极限,而现代的非对称数值系统(ANS)用查表实现获得相似的压缩率。
DEFLATE(被 gzip、zlib 与 ZIP 采用)结合了 LZ77 和霍夫曼编码。其规范完全公开:DEFLATERFC 1951、zlib 封装RFC 1950以及 gzip 文件格式RFC 1952。Gzip 面向流式传输并明确不提供随机访问。PNG 图像标准化将 DEFLATE 作为唯一的压缩方法(窗口最多 32 KiB),可见 PNG 规范“Compression method 0… deflate/inflate… at most 32768 bytes”和W3C/ISO PNG 第二版。
Zstandard (zstd): 面向高压缩率与快速解压的通用压缩器。格式记录在RFC 8878(还有HTML 镜像)以及 GitHub 上的参考规范文档。与 gzip 类似,基本帧不追求随机访问。zstd 的拿手好戏是字典:从语料中抽取的小样本能显著改善大量小文件或相似文件的压缩(参见python-zstandard 字典文档与Nigel Tao 的示例)。各实现同时支持“无结构”和“有结构”字典(讨论)。
Brotli: 为网页内容(例如 WOFF2 字体、HTTP)优化,混合静态字典与类似 DEFLATE 的 LZ+熵编码核心。规范见RFC 7932,其中也指出滑动窗口大小为 2WBITS-16,WBITS 取值 [10, 24](1 KiB-16 B 到 16 MiB-16 B),并且不尝试随机访问。Brotli 常在网页文本上优于 gzip,同时保持快速解码。
ZIP 容器: ZIP 是一种文件归档格式,可存储使用多种压缩算法(deflate、store、zstd 等)的条目。事实标准是 PKWARE 的 APPNOTE(参见APPNOTE 门户、托管副本以及美国国会图书馆的概览ZIP File Format (PKWARE)/ZIP 6.3.3)。
文件压缩是一种减小文件或文件集大小的过程,通常用于节省存储空间或加速网络传输。
文件压缩通过识别和删除数据中的冗余来工作。它使用算法在更小的空间中编码原始数据。
文件压缩的两种主要类型是无损压缩和有损压缩。无损压缩允许完美恢复原始文件,而有损压缩则以损失部分数据质量为代价,实现更大的大小减小。
文件压缩工具的一个流行例子是WinZip,它支持包括ZIP和RAR在内的多种压缩格式。
对于无损压缩,质量保持不变。然而,对于有损压缩,由于它消除了较不重要的数据以更大程度地减小文件大小,因此可能会有明显的质量下降。
是的,就数据完整性而言,文件压缩是安全的,尤其是无损压缩。然而,像任何文件一样,压缩的文件可能会被恶意软件或病毒攻击,因此总是必要的有安装可靠的安全软件。
几乎所有类型的文件都可以被压缩,包括文本文件、图像、音频、视频和软件文件。然而,可达到的压缩水平可以在文件类型之间大大变化。
ZIP文件是一种使用无损压缩来减小一个或多个文件大小的文件格式。ZIP文件中的多个文件有效地被捆绑在一起成为一个单一的文件,这也使得分享变得更容易。
技术上,是的,尽管额外的减小大小可能是微不足道的甚至适得其反。压缩一个已经压缩的文件有时可能会增加它的大小,由于压缩算法添加的元数据。
要解压文件,你通常需要一个解压或解压缩工具,如WinZip或7-Zip。这些工具可以从压缩格式提取原始文件。