四大 BSD 不约而同的选择了 ports 这种形式管理第三方软件包:

  • 在一个集中的版本控制系统里维护第三方源码包的构建脚本,包括下载源码、编译、打包、安装,这个目录树被称为 ports 或者 ports collection 或者 ports tree 或者 ports repository
  • 用户直接从 ports 里构建软件包并安装,也可能操作系统维护者提供编译好的二进制软件包

在 ports 系统里,源代码一般从各个软件包的官网下载,也可能操作系统维护者为了便利以及避免下载链接失效而自行缓存一份源码包。

FreeBSD 最早采用这种方式,然后是 NetBSD 参考 FreeBSD 搞出了支持不同操作系统的 pkgsrc,OpenBSD 源自 NetBSD,搞出了自己的 ports,DragonflyBSD 派生自 FreeBSD,一开始采用 pkgsrc,后来从 FreeBSD ports 抄袭了下,形成了自己的 dports。

Ports 形式的软件包管理方式不需要存放二进制包,也不需要存放软件包原始代码,节约空间;软件包构建脚本编写简单,方便定制,四个BSD都是采用 Makefile,简单情况下只需要定义几个变量,然后 include ports 系统的 common makefile就搞定了,因此很利于大家贡献;软件包构建脚本存放在同一个库里,整体感强,便于统一维护软件包依赖关系。

Ports 的这些优点被一些 Linux 发行版继承了:

  1. Gentoo Linux 的作者有一段时间因为 Gentoo 出了 bug 而临时用了下 FreeBSD,然后受启发创造了 Gentoo 的 Portage 系统,这可能是至今最高级的 ports 系统了,Gentoo 做的很决绝,所有软件包都要用户自行编译,哪怕是在安装系统时,导致安装时间很久,所以是否成功安装过 Gentoo 就成了表明 Linux 使用能力的一个标志(另两个公认标志是 LFS 和 Arch Linux)。
  2. Void Linux的作者曾经是 NetBSD 开发者,受 pkgsrc 启发创造了 Void Linux 的 ports 系统 xbps-src(Github 仓库叫 void-packages),Void Linux 用户一般使用 Void Linux 维护者构建好的二进制包,非常方便。Void Linux 与 Gentoo、CRUX 和 Arch 一样是个滚动发行版, 特别的是 Void Linux 使用 runit 管理服务。八卦一下,Gentoo 原作者与核心团队不和,出走后又做了不太火的 Funtoo,而 Void Linux 原作者在 2018 年一声不吭消失了一年,被核心团队怒踢出局……
  3. Chimera Linux 受 Void Linux 启发,但是采用 Python 重写了 xbps 包构建工具,而二进制包采用源自 Alpine Linux 的 apk 来管理,Bash 脚本写的 xbps-src 也被改写为 Python 脚本的 cports,其它软件选择也很有个性,dinit 管理服务,clang + musl libc + libc++ 组合替代了 gcc + glibc + libstdc++ 组合,使用 BSD 实用工具替代 GNU 实用工具例如 grep/diff/coreutils等,桌面系统使用 Gnome + Pipewire + Wayland。截止 2023 年 1 月,Chimera Linux 还处于早期,不适合日常使用。八卦一下,Chimera 是狮头羊身蛇尾的怪物,这个名字非常幽默的契合了 Chimera Linux 的软件组件选择,另外,有个 GamerOS Linux发行版在 Chimera Linux 公布一个月后恰好则改名叫 ChimeraOS,注意两者没有关系,不是一回事。
  4. CRUX Linux 没有考证受哪个 BSD 启发,反正也采用了 ports 系统以及 BSD 风格的 init 系统,CRUX 基本每年发布一个版本,安装光盘里提供了编译好的软件包,只有 Linux 内核需要自己编译,但安装完后,安装其他软件或者升级都是源码编译,所以 CRUX 很像是简化版的 Gentoo。另外提一句 CRUX handbook 写的很简洁,安装起来比 Arch Linux 还简单。
  5. Arch Linux 派生自 CRUX Linux,但很大的区别是 Arch Linux 官方维护的类 ports 系统 ABS 里的软件包都是已经编译好的,所以不再是源码型的 Linux 发行版了,用户贡献的软件放在 AUR 库里,有一部分是预先编译好的二进制包,而另一部分需要非官方工具 yay 或者 paru 来帮助安装。可以说虽然 Arch 的软件包管理内在是 ports,但给用户的外在使用体验看,已经不太像 ports 了。另一个重要区别是 Arch Linux 会非常及时的跟进每个软件的最新版本,基本就是个 Linux 社区的无私白鼠试验场,而其它 ports 系统包括四大 BSD、Gentoo、Void、CRUX、NixOS 和 Guix都或多或少会区分 ports 的 stable 版本与 latest 版本,收录软件包时尽量采用稳定版,所以相比之下,理论上都要比 Arch Linux 稳定点。
  6. NixOSGuix 也采用了 ports 方式维护第三方软件包,而跟 Void Linux类似,官方提供了编译好的二进制包,方便用户快速安装,用户也可以方便的定制源码包,这点跟 Arch 不一样,Arch 并不希望用户去定制和编译 ABS 里的源码包。
  7. Venom Linux 受 CRUX Linux 启发,也使用 Bash 编写了一个包管理器,提供了极简主义的软件包集合。
  8. KISS Linux 自称元发行版,只提供了一百多个包,可以供感兴趣的人在此基础上开发自己的发行版。KISS Linux 提供了一个使用 Bash 编写的包管理器,打包格式非常简单。
  9. Carbs Linux 派生自 KISS Linux,提供了使用 Bash 编写的包管理器 cpt,以及组成完成桌面系统的软件仓库。
  10. Bonsai 使用 Bash 编写的微小包管理器,使用 ports 系统组织软件仓库。
  11. NuTyX 基于 LFS 和 BLFS 的发行版,采用 CRUX 的 ports 管理工具,提供预编译的二进制包。

另外,SpackMacPortsHomebrew 也采用了 ports 形式管理软件包。Slackware 是个二进制发行版,第三方用户贡献的软件包放在 SlackBuilds 看起来像 ports collection,但 SlackBuilds 的使用方式是推荐去 SlackBuilds.org下载文件(有 sbopkg 和 slpkg 辅助),并没有 ports 系统的使用体验。 

总结一下,虽然 Gentoo 和 Arch 作为 ports 系 Linux 发行版里源码包派别和二进制包派别的两面旗帜,但 CRUX 可看作简化的 Gentoo,而 Void、NixOS、Guix 则看作更稳更高级的 Arch,处在早期阶段的 Chimera Linux 也很有意思,建议 Linux 发行版选择困难症患者轮流服用下……

备注:仅限桌面使用,最好在虚拟机里服用,在服务端还是推荐用 Debian 和 Ubuntu。


参考: