Nixpkgs 平台支持分级(Platform Support Tiers)全面解析:从 Tier 1 到 Tier 7 的支持矩阵与源码落地
【免费下载链接】nixpkgsNix Packages collection & NixOS项目地址: https://gitcode.com/GitHub_Trending/ni/nixpkgs
Nixpkgs 为不同平台提供差异化的支持力度,并将这些差异显式化为 7 个支持等级(Support Tier)。本文基于 doc/using/platform-support.chapter.md 展开,完整讲解各等级的定义、官方平台支持矩阵中每一项指标的含义,并结合仓库内 flake 暴露列表、Hydra 发布配置与交叉编译测试等源码证据,说明这套分级体系是如何落地执行的。读完本文,你将能读懂 nixpkgs 平台支持表,判断自己所使用的平台处于哪一档支持级别,并知道如何在本仓库源码中找到对应证据。
为什么 Nixpkgs 需要平台支持分级
不同平台在 Nixpkgs 中获得的关注度和资源并不相同,这主要体现在三个方面:维护者投入(是否有人持续修复该平台的专属问题)、安全团队关注(安全修复是否及时到达该平台)、以及CI 计算资源(Hydra 等持续集成设施是否为该平台构建和验证软件包)。正因如此,Nixpkgs 定义了 7 个平台支持等级(Tier),用于描述每个平台获得的支持程度。开发者只需查看某个平台所属的 Tier,就能快速评估"在这个平台上用 Nixpkgs 是否靠谱、遇到问题能得到什么程度的帮助"。
Tier 1 到 Tier 7:七级支持的官方定义
Tier 1(最高支持等级)
Tier 1 平台获得最高级别的支持:问题可以阻塞更新(即关键软件包在该平台构建失败会阻止发布)、安全修复被视为紧急事项、平台专属补丁可以被自由应用,并且大多数软件包被期望正常工作。
在官方支持矩阵中,目前仅有x86_64-unknown-linux-gnu一个平台处于 Tier 1。
Tier 2
Tier 2 平台在更新后保持功能正常与安全,按需接收平台专属补丁,并且大量软件包由 Hydra 构建,获得完整的 OfBorg 支持(OfBorg 是 nixpkgs 用于自动化审查与测试 PR 的基础设施)。
当前属于 Tier 2 的平台包括:
aarch64-unknown-linux-gnuarm64-apple-darwin
Tier 3
Tier 3 平台可能接收非侵入式的平台专属修复,拥有可用的原生引导工具(bootstrap tools),且二进制缓存中提供交叉编译工具链,但更新可能会破坏这些平台上的构建——换句话说,Tier 3 平台通常"能用"但不保证"不倒退"。
绝大多数 Linux 平台(如 musl 变体、i686、FreeBSD、ARMv5/6/7、MIPS、PowerPC、s390x、LoongArch 等)都属于 Tier 3。
Tier 4 至 Tier 7
平台 Tier 4 到 Tier 7 表示从"仅接收有限修复"到"完全没有支持、但保留通往支持的路径"之间的不同级别。其中 Tier 4 平台(如riscv32-unknown-linux-gnu)在矩阵中仍被列出,说明其已被显式登记为"最低限度支持"状态,而不是被遗忘的角落。
平台支持矩阵(完整 Breakdown)
下表完整复刻自 平台支持章节,涵盖了当前 Nixpkgs 正式登记的全部平台及其各项支持指标:
| Triple | Support Tier | Channel Blockers | Hydra Support | Security Support | Ofborg Support | Bootstrap Tarballs | Cross Compiling Support |
|---|---|---|---|---|---|---|---|
x86_64-unknown-linux-gnu | Tier 1 | Many | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
aarch64-unknown-linux-gnu | Tier 2 | Some | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
x86_64-unknown-linux-musl | Tier 3 | None | Limited | ❌ | ❌ | ✔️ | ✔️ |
aarch64-unknown-linux-musl | Tier 3 | None | Limited | ❌ | ❌ | ✔️ | ✔️ |
x86_64-unknown-unknown-freebsd | Tier 3 | None | ❌ | ❌ | ❌ | ✔️ | ✔️ |
arm64-apple-darwin | Tier 2 | Some | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
i686-unknown-linux-gnu | Tier 3 | None | Limited | ❌ | ❌ | ✔️ | ✔️ |
riscv32-unknown-linux-gnu | Tier 4 | None | ❌ | ❌ | ❌ | ❌ | ✔️ |
riscv64-unknown-linux-gnu | Tier 3 | None | ❌ | ❌ | ❌ | ✔️ | ✔️ |
loongarch64-unknown-linux-gnu | Tier 3 | None | ❌ | ❌ | ❌ | ✔️ | ✔️ |
armv6l-unknown-linux-gnueabihf | Tier 3 | None | ❌ | ❌ | ❌ | ✔️ | ✔️ |
armv6l-unknown-linux-musleabihf | Tier 3 | None | ❌ | ❌ | ❌ | ✔️ | ✔️ |
armv7l-unknown-linux-gnueabihf | Tier 3 | None | ❌ | ❌ | ❌ | ✔️ | ✔️ |
armv5tel-unknown-linux-gnueabi | Tier 3 | None | ❌ | ❌ | ❌ | ✔️ | ✔️ |
mips64el-unknown-linux-gnuabi64 | Tier 3 | None | ❌ | ❌ | ❌ | ✔️ | ✔️ |
mips64el-unknown-linux-gnuabin32 | Tier 3 | None | ❌ | ❌ | ❌ | ✔️ | ✔️ |
mipsel-unknown-linux-gnu | Tier 3 | None | ❌ | ❌ | ❌ | ✔️ | ✔️ |
powerpc64-unknown-linux-gnuabielfv2 | Tier 3 | None | ❌ | ❌ | ❌ | ✔️ | ✔️ |
powerpc64le-unknown-linux-gnu | Tier 3 | None | ❌ | ❌ | ❌ | ✔️ | ✔️ |
s390x-unknown-linux-gnu | Tier 3 | None | ❌ | ❌ | ❌ | ✔️ | ✔️ |
解读矩阵:每个维度代表什么
Triple:平台的三元组/四元组标识
表中的Triple列使用 LLVM 目标三元组格式标识平台。根据 交叉编译章节 的说明,该格式在四段形式下对应[cpu]-[vendor]-[os]-[abi],例如:
x86_64-unknown-linux-gnu:CPU 为x86_64,vendor 为unknown,OS 为linux,ABI 为gnu;armv7l-unknown-linux-gnueabihf:ABI 为gnueabihf(EABI + hard-float);arm64-apple-darwin:CPU 为arm64,OS 为 Darwin。
在 Nixpkgs 内部,每个平台除了config(即此处的 triple)外,还有一个两段的system简写(如aarch64-linux),二者之间的解析与互转逻辑位于 lib/systems/parse.nix 与 lib/systems/doubles.nix。
Channel Blockers:频道阻塞者
该列描述平台在多大程度上会"阻塞"Nixpkgs 渠道(channel)的发布:
- Many(Tier 1 的 x86_64-linux):大量软件包的构建状态会直接影响渠道更新能否发布;
- Some(Tier 2 的 aarch64-linux 与 arm64-darwin):部分软件包会参与阻塞判断;
- None(其余平台):不参与渠道发布阻塞判断。
从矩阵中可以推断,该指标直接与 Tier 挂钩——只有 Tier 1/2 平台才在发布流程中扮演阻塞者角色,这是"Tier 1 问题可以阻塞更新"定义在发布机制上的体现。
Hydra Support:持续构建支持
Hydra 是 Nix 生态的持续集成系统。该列表示平台在 Hydra 上的构建覆盖程度:
- ✔️:由 Hydra 完整构建;
- Limited:有限构建(对应 x86_64-linux-musl、aarch64-linux-musl、i686-linux 三个平台);
- ❌:不在 Hydra 正式构建范围内。
矩阵中 Tier 3 平台几乎全部为 ❌ 或 Limited,说明多数 Tier 3 平台的软件包需要由社区或用户自行构建。
Security Support 与 Ofborg Support
- Security Support:该平台是否纳入安全团队维护范围(安全修复是否覆盖该平台)。只有 x86_64-linux、aarch64-linux、arm64-darwin 三个平台为 ✔️。
- Ofborg Support:该平台是否获得完整的 OfBorg(PR 自动化测试与评审机器人)支持。有趣的是,表格原文在 Tier 2 定义中写作 "full ofBorg support",而矩阵中对应列写作 "Ofborg Support",二者指向同一套 PR 自动化基础设施;同样只有三个高 Tier 平台为 ✔️。
Bootstrap Tarballs:原生引导工具链
该列表示平台是否具备可用的引导 tarball(bootstrap tools),即"在没有现成 Nix 环境的条件下,能否从零开始引导出 Nix 工具链"。矩阵中除riscv32-unknown-linux-gnu为 ❌ 外,其余平台均为 ✔️。这与 release.nix 中的bootstrapConfigs参数高度对应——该参数列出了当前发布流程实际构建引导工具的三元组:
bootstrapConfigs ? [ "arm64-apple-darwin" "aarch64-unknown-linux-gnu" "aarch64-unknown-linux-musl" "i686-unknown-linux-gnu" "x86_64-unknown-linux-gnu" "x86_64-unknown-linux-musl" ],Cross Compiling Support:交叉编译支持
该列表示该平台是否可以作为交叉编译的目标平台被构建。绝大多数平台均为 ✔️,唯一例外是arm64-apple-darwin(❌)。这一现象可以结合仓库中的交叉编译测试配置来理解:见下文。
支持分级在 Nixpkgs 源码中的落地
平台支持分级不仅是文档中的一张表,它在仓库中有多处直接对应的实现与配置。
flake 暴露的系统列表
lib/systems/flake-systems.nix 定义了 nixpkgs flake 对外暴露软件包集合的系统列表,文件头部注释明确引用 RFC 46(即平台支持分级规范的来源),并按 Tier 标注:
[ # Tier 1 "x86_64-linux" # Tier 2 "aarch64-linux" # Tier 3 "armv6l-linux" "armv7l-linux" "i686-linux" # "mipsel-linux" is excluded because it is not bootstrapped # Other platforms with sufficient support in stdenv which is not formally # mandated by their platform tier. "aarch64-darwin" # "armv5tel-linux" is excluded because it is not bootstrapped "powerpc64le-linux" "riscv64-linux" "x86_64-freebsd" ]这段代码有两层信息值得注意:
- Tier 与 flake 暴露列表并不完全等同:Tier 1/2 平台全部被暴露,但 Tier 3 平台中只有
armv6l-linux、armv7l-linux、i686-linux三个被暴露,其余如riscv64-linux、powerpc64le-linux、x86_64-freebsd、aarch64-darwin则因"stdenv 中有足够支持"而被额外加入; - 引导状态影响暴露:
mipsel-linux与armv5tel-linux因"尚未完成引导(not bootstrapped)"被排除。这与支持矩阵中两平台 Bootstrap Tarballs 列为 ✔️ 存在细微出入,说明文档矩阵描述的是登记的支持目标,而 flake 列表反映的是当前可用的实际状态,二者以源码为准。
Hydra 发布构建配置
release-supported-systems.json 定义了 Nixpkgs 发布(channel)实际为其构建软件包的三个系统:
[ "aarch64-linux", "aarch64-darwin", "x86_64-linux" ]这正是矩阵中 Hydra Support 为 ✔️ 的三个平台(与 Security Support、Ofborg Support 的 ✔️ 集合完全一致)。该文件同时被 CI 脚本读取,例如 ci/github-script/supportedSystems.js 会从仓库中抓取并解析该 JSON,用于 GitHub Actions 中对目标 SHA 的支持系统判断。
而 release.nix 中supportedSystems的默认值即来自该 JSON 文件,且文件头部的注释给出了本地验证方式:
$ nix-build pkgs/top-level/release.nix -A <jobname>.<system> # 例如: $ nix-build pkgs/top-level/release.nix -A coreutils.x86_64-linux交叉编译冒烟测试:release-cross.nix
release-cross.nix 为交叉编译提供了系统的冒烟测试任务,其覆盖面与支持矩阵中的 Cross Compiling Support 列直接呼应。文件头注释说明了测试方法:
$ nix-build pkgs/top-level/release-cross.nix -A <jobname>.<package> --arg supportedSystems '[builtins.currentSystem]' # 例如: $ nix-build pkgs/top-level/release-cross.nix -A crossMingw32.nix --arg supportedSystems '[builtins.currentSystem]'该文件定义了大量以交叉编译目标平台命名的 job,例如riscv64、riscv32、loongarch64-linux、armv5tel、armv7l-hf、aarch64、aarch64-musl、x86_64-musl、i686-gnu、ppc64-elfv1、ppc64le、s390x,以及mips64el-nixCrossStatic、powerpc64le-nixCrossStatic(为"已启用但未正式支持"的平台提供 Hydra 构建的nixStatic引导二进制)。此外还覆盖了 Android、WASM、iOS、各类嵌入式目标(AVR、MSP430、RISC-V bare metal 等)以及 FreeBSD/NetBSD/OpenBSD/Cygwin 等。
值得注意的是,文件中所有交叉编译 job 都以x86_64-linux、aarch64-linux、aarch64-darwin等作为**构建平台(buildPlatform)**来源,而矩阵中arm64-apple-darwin的 Cross Compiling 列为 ❌,这可以从 release.nix 的supportDarwin = elem "aarch64-darwin" supportedSystems;相关逻辑以及交叉编译章节"build/host/target 三平台"模型推断:支持矩阵中的 Cross Compiling 指标衡量的是"能否作为交叉编译目标平台",而 Darwin 平台的交叉编译支持相对有限,因此在矩阵中被标记为 ❌。
平台描述的解析与扩充:lib/systems
所有平台标识最终都会进入 lib/systems/default.nix 的elaborate函数(约 L88 起)进行"扩充":从system简写或config三元组解析出parsed结构,再推导出libc(glibc/musl/libSystem 等)、linker、is*系列谓词、qemuArch、darwinArch等一系列派生属性。此外 lib/systems/examples.nix 为常见交叉编译目标提供了命名好的平台示例(如raspberryPi、remarkable2、riscv64、loongarch64-linux等),release-cross.nix 中的 job 正是通过systems.examples.*引用这些定义。这意味着:平台支持矩阵中的每一行,最终都会在lib/systems中找到对应的类型化描述,而lib/systems/flakeExposed与 flake-systems.nix 则决定了哪些平台能在不显式设置allowUnsupportedSystem的情况下直接使用。
开发者视角:如何确认自己平台的等级
结合以上内容,可以从三个层次快速确认某个平台在 Nixpkgs 中的支持等级:
- 查矩阵:在 平台支持章节 的 Breakdown 表中找到自己的平台 triple,确定所属 Tier 与各项支持指标。表中没有列出的平台(如 Windows、NetBSD、嵌入式 bare-metal 目标)属于更低的登记状态,通常仅在
lib/systems/examples.nix中有定义、用于交叉编译场景。 - 看 flake 暴露:检查 lib/systems/flake-systems.nix,被列出的系统(
x86_64-linux、aarch64-linux、armv6l-linux、armv7l-linux、i686-linux、aarch64-darwin、powerpc64le-linux、riscv64-linux、x86_64-freebsd)属于"原生编译与使用体验经过验证"的平台。 - 看发布与 CI:只有 release-supported-systems.json 中的三个系统(
x86_64-linux、aarch64-linux、aarch64-darwin)享有 Hydra 完整构建、安全支持与 OfBorg 支持——这与矩阵中三个全 ✔️ 的行完全对应。
对于 Tier 3 及以下平台的使用者,矩阵中的 "Cross Compiling Support ✔️" 意味着你可以通过 Nixpkgs 的交叉编译机制(crossSystem参数)在 x86_64 等强构建平台上为这些平台产出软件包,交叉编译章节 提供了完整的理论框架与使用说明。
小结
Nixpkgs 的平台支持分级是一套"文档承诺 + 源码落实"的体系:Tier 1 到 Tier 7 定义了支持力度的语义,支持矩阵给出了每个平台的具体承诺,而 flake-systems.nix、release-supported-systems.json、release.nix 与 release-cross.nix 则分别从 flake 暴露、发布构建、交叉编译测试三个维度把这些承诺变成了可验证的工程事实。理解这套分级,是评估平台可用性、规划平台支持工作、以及正确使用 Nixpkgs 交叉编译能力的第一步。
【免费下载链接】nixpkgsNix Packages collection & NixOS项目地址: https://gitcode.com/GitHub_Trending/ni/nixpkgs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考