Packaging Formats Compared: .deb, .rpm, .pkg.tar.zst, .apk
Packaging Formats Compared: .deb, .rpm, .pkg.tar.zst, .apk
The package format is the fundamental currency of a distribution. Stripped of branding, a package is simply an archive containing: 1. The compiled files to be installed into the filesystem (/usr/bin, /usr/lib, /etc). 2. Declarative metadata (package name, version, architecture, license, dependencies). 3. Optional maintainer hook scripts (pre-install, post-install, pre-removal, post-removal).
+-------------------------------------------------------------+
| Package Anatomy Comparison |
| |
| Debian (.deb): Standard Unix `ar` archive |
| ├── debian-binary (format version 2.0) |
| ├── control.tar.xz (metadata + hooks) |
| └── data.tar.xz (payload filesystem) |
| |
| Red Hat (.rpm): Custom binary lead + header + cpio payload
| ├── Lead & Signature block (GPG) |
| ├── RPM Header (metadata tags) |
| └── CPIO archive (payload compressed) |
| |
| Arch (.pkg.tar.zst): Standard tarball compressed with Zstandard
| ├── .PKGINFO (plaintext metadata) |
| ├── .INSTALL (optional shell hooks) |
| ├── .MTREE (file checksums & perms) |
| └── usr/... (payload directly at root) |
| |
| Alpine (.apk): Gzip/Zstd tarball with custom tar headers
| ├── .PKGINFO |
| ├── .INSTALL |
| └── data files with SHA1 checksums |
+-------------------------------------------------------------+
Deconstructing Debian’s .deb Format
Debian .deb packages use the standard UNIX ar archive utility, ensuring they can be inspected on any UNIX system without special tools:
# Extracting a .deb package manually using standard binutils:
$ ar -x curl_7.88.1-10_amd64.deb
$ ls -l
-rw-r--r-- 1 user user 4 debian-binary
-rw-r--r-- 1 user user 2144 control.tar.xz
-rw-r--r-- 1 user user 289412 data.tar.xz
# Inspecting the control metadata:
$ tar -xf control.tar.xz
$ cat control
Package: curl
Version: 7.88.1-10
Architecture: amd64
Maintainer: Debian curl team
Depends: libc6 (>= 2.34), libcurl4 (= 7.88.1-10), zlib1g (>= 1:1.1.4)
Description: command line tool for transferring data with URL syntaxDeconstructing Arch Linux’s .pkg.tar.zst
Arch Linux packages prioritize raw speed and simplicity. Instead of nesting archives, an Arch package is a single tar archive compressed using Facebook’s high-speed Zstandard (zstd) algorithm:
# Decompressing and inspecting an Arch package:
$ tar --zstd -tf ripgrep-14.1.0-1-x86_64.pkg.tar.zst
.PKGINFO
.BUILDINFO
.MTREE
usr/
usr/bin/
usr/bin/rg
usr/share/man/man1/rg.1.gzBecause .pkg.tar.zst contains the actual filesystem tree directly at the root of the archive, package installation is as fast as unpacking a tarball directly into /!
Deconstructing Alpine’s .apk Format
Alpine’s apk packages are designed for high-density, low-latency container environments: - Compact headers and SHA1/SHA256 control hashes embedded directly in extended tar header fields. - Extremely rapid decompression with minimal CPU overhead. - No heavy Python or Perl runtime dependencies for package management: apk-tools is written in pure, static C.