Oasis – 一个小型、静态链接的 Linux 系统

一个名为 Oasis 的极简 Linux 系统,围绕静态链接和常见工具的更小替代品构建,正在吸引那些希望获得体积极小、可复现、自包含二进制文件的开发者,适用于嵌入式设备、不可变镜像以及调试恶劣环境等用途。讨论的焦点很大程度上集中在静态与动态链接之间的取舍——简洁性、可移植性和减少依赖地狱 versus 内存占用、更新机制和插件支持——以及 musl 与 glibc 在体积、正确性和性能上的差异。评论者还指出了 GPU 驱动、TLS 库和依赖管理文化方面的挑战,并认为当前容器化实践在一定程度上是对共享库生态系统长期弱点的回应。

项目目标与设计选择

  • Oasis 是一个小型、静态链接的 Linux 系统,偏好对常见工具采用简单、最小化的实现:用 musl 代替 glibc,用 sbase/ubase 代替 coreutils/util-linux,用 oksh 代替 bash,用 mandoc 代替 man-db,用 netbsd-curses 代替 ncurses,用 Netsurf 代替重量级浏览器,以及更小的 init/build 工具。
  • 它被视为 sta.li 以及其他受“suckless”启发系统的精神继承者。

使用场景

  • 建议的用途包括不可变镜像、嵌入式设备和 Kubernetes 节点,在这些场景中,完全自包含、静态链接的二进制文件很有吸引力。
  • 有些人认为,它非常适合把工具直接放到性能较弱或异构的嵌入式 Linux 设备上,而不必担心本地库版本。
  • 也有人会问,相较于更主流的发行版或动态链接,它提供了什么;对一些人来说,除了小众/嵌入式场景之外,它“有意思但不明确”。

构建系统与可复现性

  • Oasis 使用 Samurai(一个与 Ninja 兼容的构建工具),并强调快速、可复现的全系统构建。
  • 有评论者表示,使用 Bazel 构建 Oasis 取得了成功,从而获得了分布式、增量式、可复现的 OS 构建;这也引出了对 Bazel 与 Nix 的更广泛比较。
  • Nix 因其基于哈希、内容寻址的构建和分布式缓存而受到赞赏,但也因构建粒度较粗、在项目内部每个 derivation 的开销更高而受到批评。

静态链接 vs 动态链接的争论

  • 支持静态链接:
    • 简化部署,避免“依赖地狱”;适合便携二进制、容器和受限系统。
    • 配合 musl 和 LTO,每个二进制的体积仍可保持较小;链接器可以丢弃未使用的代码。
    • 在库更新时重新构建/重新链接全部内容是可以接受的,尤其是在单树构建中。
  • 支持动态链接:
    • 更好的内存共享、更容易进行安全补丁更新(更新一个共享库即可),以及更成熟的工具链。
    • 静态链接有一些怪癖:构造函数顺序、ABI/版本不匹配,以及在某些工作负载下更大的总内存占用。
  • 也有几位指出,现代容器实践本就会复制整套 OS 镜像,因此对一些人来说静态“臃肿”问题并不那么令人担忧,但并非所有人都如此认为。

musl、BearSSL 与替代库

  • musl 因其体积小、可移植、语义更简单以及对静态链接友好而受到赞赏;批评者则提到过去的 DNS bug、较弱的 malloc 性能,以及相较于 glibc 更怪异的行为。
  • 许可证也是一个因素:musl 的宽松许可证让静态链接比 glibc 的 LGPL 更简单。
  • BearSSL 之所以受到质疑,是因为它自称为“beta”且缺少 TLS 1.3;另一些人则认为版本号并不能可靠地表明生产就绪程度,并指出其他地方也有广泛使用的 <1.0 库。

实际问题与局限

  • 据报告,一个旧的 Oasis QEMU 镜像大约有 360MB;当前官方镜像链接暂时不可用。
  • GPU 驱动被强调为完全静态 OS 的一个主要未解决问题:大多数现实可行的设计仍然需要动态组件或基于 IPC 的 GPU 栈。
  • Netsurf 因其极简主义而受到喜爱,但其文档链接似乎已经过时;其渲染覆盖范围也被认为有限。