pacman的一些玩法
Alexander Hou

哈哈,这也是大多数 Linux 用户接触 Arch 时的直觉!因为 pacman 实在是太快、太紧凑了,输出的信息也总是整整齐齐的进度条,让人觉得它像个无所不能的“黑盒”,默默包揽了一切。

但正如 Unix 哲学所说:“做一件事,并把它做好。” pacman 的强大,恰恰在于它绝不重复造轮子。它没有自己去手写一套复杂的 TCP 套接字(Socket)和 HTTP/FTP 协议栈,而是极其优雅地把网络下载、甚至解压这些脏活累活,全部“外包”给了系统里最成熟的原生工具。

我们可以把这个黑盒彻底拆开,看看它到底调用了哪些底层的功臣:

一、 网络外包:底层的下载引擎

当你看到终端里刷刷刷闪过下载进度条时,pacman 底层默认调用的是一个叫 libfetch 的库(在其它发行版或旧版本中,可能是基于 libcurl 重新封装的内部下载引擎)。

但最硬核的是,pacman 允许你直接剥夺它的下载权,把它彻底踢下台,换上你指定的专业下载工具。

狂热爱好者的硬核配置:/etc/pacman.conf

如果你打开你的 /etc/pacman.conf,你会发现有几行被注释掉的神秘代码:

Ini, TOML

1
2
#XferCommand = /usr/bin/curl -GJ -O %u
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u

如果你把 curl 那一行的注释拿掉(删掉 #),你猜会发生什么?

下一次你再运行 pacman -S 的时候,pacman 在拼接出 URL 后,自己就完全袖手旁观了。它会在后台直接 fork 一个新进程,调用系统里的 curl 命令,并把 URL 作为参数传给它(这里的 %u 就是 URL)。

很多 Arch 老鸟为了追求极致的下载速度,甚至会把它改成多线程下载神器 aria2

Ini, TOML

1
XferCommand = /usr/bin/aria2c --allow-overwrite=true -c --file-allocation=none --log-level=error -m=2 -p=true --max-connection-per-server=5 %u

这时候,pacman 的黑盒就被彻底戳破了——它变成了一个纯粹的“指挥官”,只负责算账和发号施令,真正的下载全是由 aria2 在前线冲锋陷阵。

二、 解压外包:底层的压缩大师

当软件包下载好之后,进入 Checking keyring...Installing... 阶段,pacman 需要把 .pkg.tar.zst 解压并释放到你的根目录。

它同样没有自己去写 Zstd 解压算法,而是直接链接并调用了系统的:

  • libarchive:Linux 下处理 tar 归档的顶级 C 语言库。
  • libzstd:FaceBook 开源的、目前工业界速度最快的压缩/解压库。

由于 libzstd 拥有极其恐怖的多核解压性能,配合 libarchive 的高效内存映射,pacman 才能在几毫秒内把一个几百兆的 gcc 压缩包解压并平铺到你的 /usr 目录下。

三、 为什么说这很 Unix?

如果 pacman 把网络协议、下载引擎、解压算法全部自己写一遍,会发生什么?

  1. 体积臃肿: 它的体积会暴增,不再是那个轻量级的、纯粹的包管理器。
  2. 安全隐患: 网络协议(比如 OpenSSL 漏洞、HTTP 漏洞)经常需要安全更新。如果 pacman 内置了这些,它就必须频繁更新自己。而现在,只要系统更新了本地的 curlopensslpacman 就能免费享受最安全、最快的网络性能。

通过这一层层拆解,你会发现 pacman 的黑盒其实非常具有透明的美感。它在底层就是个精通图论和文本解析的 C 语言指挥官,用管道和系统调用熟练地操纵着 curltarzstd 这些各路高手,在你的 Arch Linux 舞台上完成一场场丝滑的软件安装大秀。