ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

拆解 nix-cachyos-kernel 核心实现:mkCachyKernel 如何在 buildLinux 之上打造 CachyOS 内核

拆解 nix-cachyos-kernel 核心实现:mkCachyKernel 如何在 buildLinux 之上打造 CachyOS 内核

【免费下载链接】nix-cachyos-kernel

CachyOS kernel for NixOS

项目地址:https://gitcode.com/gh_mirrors/ni/nix-cachyos-kernel
点击查看免费下载

nix-cachyos-kernel 是一个为 NixOS 提供 CachyOS 内核与 ZFS 模块的 Nix 包集合。它通过核心函数mkCachyKernel,在 nixpkgs 官方buildLinux构建系统之上叠加了 CachyOS 补丁、cachyos_defconfig配置和 LTO 编译优化,最终一次性生成 60 多个不同调度器、不同 CPU 架构、不同 LTO 级别的内核变体。本文带你完整拆解它的实现思路。

📦 nix-cachyos-kernel 是什么?

CachyOS 是一套以性能著称的 Linux 发行版,其内核在官方 Linux 之上加入了 BORE/BMQ 调度器、Adios IO 调度器、Clang+LTO 编译、大页内存等深度调优。而 NixOS 用户过去很难用上这些内核。

nix-cachyos-kernel 正是补齐这块短板的"桥梁项目":

  • CachyOS 补丁集:自动抓取 CachyOS 官方 kernel-patches 并打入源码
  • CachyOS 调优配置:将上游 PKGBUILD 中的性能选项翻译为声明式的 Nix 选项
  • ZFS 模块:为每个内核变体提供匹配版本的zfs_cachyos内核模块
  • 二进制缓存:配合 Hydra CI 预构建,nix flake show即可看到全部可用版本

目前仓库同步的 latest 内核为 7.3.0(LTS 为 6.18.x),可通过 kernel-cachyos/version.json 查看每个变体的精确版本、下载地址与哈希。

🗂️ 仓库结构:核心实现在哪里

整个仓库结构非常精炼,核心逻辑集中在 4 个文件:

├── flake.nix # Flake 入口,定义 overlay 与 CI 任务 ├── loadPackages.nix # 汇总内核与内核模块包 ├── helpers.nix # Clang/LTO 工具链与编译修复 ├── update.py # 自动同步上游版本的脚本 ├── kernel-cachyos/ │ ├── mkCachyKernel.nix # ⭐ 核心:mkCachyKernel 实现 │ ├── cachySettings.nix # ⭐ 核心:性能调优选项表 │ ├── default.nix # 生成全部内核变体 │ ├── packages.nix # 生成 linuxPackages-* 模块集 │ └── version.json # 版本与哈希元数据 └── zfs-cachyos/ ├── default.nix # ZFS 内核模块构建 └── version.json

下面逐层拆解这条"流水线"是如何工作的。

🧩 核心机制:mkCachyKernel 的四步改造

mkCachyKernel定义在 kernel-cachyos/mkCachyKernel.nix,它用lib.makeOverridable包裹,返回一个可被override的函数。它并不重复造轮子,而是对 nixpkgs 的buildLinux做了四步关键改造:

第一步:打补丁——patchedSrc 提前注入 CachyOS 补丁

buildLinux只接受kernelPatches一个补丁入口,无法表达"CachyOS 补丁要按变体条件化选取"的需求。于是 mkCachyKernel 先用applyPatches自己构建了一个patchedSrc(见 kernel-cachyos/mkCachyKernel.nix#L91-L106):

  1. 先打两个 nixpkgs 的辅助补丁(bridge_stp_helper、request_key_helper)
  2. 再按变体参数条件化追加 CachyOS 补丁:选了bore/rt-bore调度器才打调度器补丁,开启hardened才打加固补丁,handheld则打掌机优化补丁
  3. 最后把 CachyOS 的config文件安装为arch/x86/configs/cachyos_defconfig,供后续构建使用

这样,补丁的"选取逻辑"被从构建阶段前移到了 Nix 表达式求值阶段,完全声明式。

第二步:组配置——structuredExtraConfig 三层合并

内核配置不是简单拷贝 defconfig,而是由三层合并而成(见 kernel-cachyos/mkCachyKernel.nix#L111-L159):

层级内容作用
基础层NR_CPUS = 8192、LOCALVERSION、overlayfs 等保证与 NixOS 生态兼容、修复链接错误
CachyOS 层来自 cachySettings.nix 的调优项全部加lib.mkForce强制覆盖 defconfig
用户层args.structuredExtraConfig留给你自定义的逃生舱

LOCALVERSION会自动设置为-cachyos或-cachyos-lto(见 kernel-cachyos/mkCachyKernel.nix#L108),让uname -r一眼就能看出内核变体。

第三步:换编译器——Clang + LTO 工具链

当lto设为"thin"或"full"时,构建工具链从 GCC 切换为 Clang。这一步依赖 helpers.nix 中的两个关键构造:

  • stdenvLLVM(helpers.nix#L37-L57):用pkgs.overrideCC把整个构建环境换成 Clang,并把 LTO 编译参数注入linux-kernel.makeFlags
  • ltoMakeflags(helpers.nix#L17-L35):显式指定LLVM=1、CC=clang、LD=ld.lld、AR=llvm-ar等全套 LLVM 工具

同时在 mkCachyKernel 内部(kernel-cachyos/mkCachyKernel.nix#L177-L188):

  • 若processorOpt = "native",则叠加impureUseNativeOptimizations做本机优化
  • AutoFDO 模式下追加CLANG_AUTOFDO_PROFILE标志

lto与processorOpt的具体映射关系都写在 cachySettings.nix#L45-L102 中,例如thin对应LTO_CLANG_THIN = yes,zen4对应MZEN4 = yes。

第四步:委托构建——把一切交给 buildLinux

经过前三步准备后,mkCachyKernel 才真正调用buildLinux(见 kernel-cachyos/mkCachyKernel.nix#L161-L213),传入四个"成品":

  • src = patchedSrc:已打好全部补丁的源码
  • stdenv:按 LTO 选项选定的 GCC 或 Clang 环境
  • defconfig = "cachyos_defconfig":指向第一步安装的配置
  • structuredExtraConfig:第二步合并出的配置覆盖

此外还有两个贴心细节:modDirVersion统一为版本号+cachyos后缀,保证内核模块目录命名一致;ignoreConfigErrors默认开启,容忍 CachyOS 配置中针对旧内核的残留选项。

整个设计可以概括为一句话:mkCachyKernel = 补丁前置 + 配置分层 + 工具链替换 + buildLinux 委托,四步各司其职。

⚡ cachySettings.nix:把 PKGBUILD 调优翻译成 Nix 选项

cachySettings.nix 是项目的"调优字典",它把 CachyOS 上游 PKGBUILD 里散落的内核选项,重组为按主题分组的表结构。mkCachyKernel 的每个变体参数,都对应表中一个子集:

参数可选项默认值效果
cpuschedeevdf / bore / bmq / rt / rt-boreeevdf选择 CPU 调度器(bore 对应SCHED_BORE = yes)
ltonone / thin / fullnoneClang 链接期优化级别
processorOptx86_64-v1~v4 / zen4 / nativex86_64-v1目标 CPU 微架构级别
hzTicks100 ~ 10001000定时器中断频率
preemptTypefull / lazy / voluntary / nonefull抢占粒度
tickratefull / idle / periodicfullNO_HZ 高精度定时器策略
hugepagealways / madvisealways透明大页策略
ccHardertrue / falsetrue-O3级别优化
bbr3true / falsefalse默认启用 BBR TCP 拥塞控制
kcfitrue / falsefalse内核控制流完整性

所有选项都以lib.kernel的yes / no / module / freeform值表达,因此可以直接塞进structuredExtraConfig,与 NixOS 的lib.kernel体系无缝对接。例如 server 变体只需hzTicks = "300"+preemptType = "none"两个参数,就完成了低中断频率、不抢占的服务器化调优。

🚀 一次声明,60 多个变体

有了 mkCachyKernel 这个"生成器",kernel-cachyos/default.nix 就变成了一份纯粹的变体清单:

  • latest / lts 系列:各 10 个变体(基础版 + v2/v3/v4/zen4 架构变体 × 普通/LTO 两条线)
  • 特色变体:bore(BORE 调度器)、bmq、deckify(掌机)、eevdf、hardened(加固)、rc(预发布)、rt-bore(实时)、server

每个变体就是一段mkCachyKernel { pname = "..."; lto = "thin"; processorOpt = "x86_64-v3"; ... }的调用,差异完全由参数表达。源码、defconfig 和补丁集则统一从version.json按fetchurl/fetchgit获取,版本与哈希一一锁定,保证了可复现性。

而版本同步交给 update.py:它由每日 GitHub Action 触发(也可通过 flake appupdate-cachyos手动运行),浅克隆上游两个仓库,解析各变体 PKGBUILD 提取版本号、下载链接、配置与补丁哈希,批量写入两份 version.json,实现"上游一更新,本仓库自动跟上"。

🔌 生态扩展:linuxPackages 与 ZFS 模块

内核编译出来后,驱动模块(NVIDIA、VirtualBox 等)也要能跟上 LTO 内核。这部分由 kernel-cachyos/packages.nix 完成:

  • 对每个内核调用linuxKernel.packagesFor生成完整的linuxPackages-cachyos-*集合
  • 通过 helpers.nix#L59-L81 的kernelModuleLLVMOverride修复树外模块在 Clang/LTO 环境下的编译问题(如把模块 Makefile 中的gcc替换为cc)
  • 额外修复 VirtualBox/VMware 模块未传递内核 makeFlags、NVIDIA 开源驱动头文件不兼容等问题

ZFS 方面,zfs-cachyos/default.nix 复用 nixpkgs 的zfs/generic.nix,用overrideAttrs换掉源码为 CachyOS 打过补丁的 ZFS 归档(版本记录在 zfs-cachyos/version.json),并按内核是否启用LLVM=1智能调整CC=标志,确保模块与 LTO 内核匹配。

最终,loadPackages.nix 将内核、模块集与 8 个zfs-cachyos-*顶层属性汇总输出,由 flake.nix 暴露为cachyosKernelsoverlay(分pinned与default两种,前者锁定 nixpkgs 版本以保证命中二进制缓存)。在 NixOS 配置里只需两行即可启用:

nixpkgs.overlays = [ nix-cachyos-kernel.overlays.pinned ]; boot.kernelPackages = pkgs.cachyosKernels.linuxPackages-cachyos-latest;

✅ 总结:这套实现值得借鉴的 3 个设计

  1. 薄封装哲学:mkCachyKernel 不重写内核构建,只在buildLinux外围做补丁、配置、工具链三处增强,其余全部委托——与上游 nixpkgs 保持同步的成本极低。
  2. 参数即变体:60 多个内核变体共用同一套构建逻辑,差异全部收敛为 10 来个语义化参数(lto、cpusched、processorOpt……),新增变体只需复制一段 5 行的 Nix 表达式。
  3. 元数据驱动同步:版本信息集中在两份 version.json,由 update.py 自动刷新,用户nix flake update一条命令就能拿到最新 CachyOS 内核。

如果你想深度定制(比如换掉cpusched或叠加自己的structuredExtraConfig),直接阅读 kernel-cachyos/mkCachyKernel.nix 即可,README 中也提供了完整的参数清单与override示例。

【免费下载链接】nix-cachyos-kernel

CachyOS kernel for NixOS

项目地址:https://gitcode.com/gh_mirrors/ni/nix-cachyos-kernel
点击查看免费下载
上一篇:如何解读GNM Head技术报告:从SotA 3DMM到生成式人体测量模型(arXiv 2607.23687)
下一篇:evo Dashboard 实战指南:如何实时监控 AI 实验、看懂评分散点图并配置 Frontier 策略

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

返回列表