【免费下载链接】nix-cachyos-kernel
CachyOS kernel for NixOS
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):
- 先打两个 nixpkgs 的辅助补丁(
bridge_stp_helper、request_key_helper) - 再按变体参数条件化追加 CachyOS 补丁:选了
bore/rt-bore调度器才打调度器补丁,开启hardened才打加固补丁,handheld则打掌机优化补丁 - 最后把 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.makeFlagsltoMakeflags(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 的每个变体参数,都对应表中一个子集:
| 参数 | 可选项 | 默认值 | 效果 |
|---|---|---|---|
cpusched | eevdf / bore / bmq / rt / rt-bore | eevdf | 选择 CPU 调度器(bore 对应SCHED_BORE = yes) |
lto | none / thin / full | none | Clang 链接期优化级别 |
processorOpt | x86_64-v1~v4 / zen4 / native | x86_64-v1 | 目标 CPU 微架构级别 |
hzTicks | 100 ~ 1000 | 1000 | 定时器中断频率 |
preemptType | full / lazy / voluntary / none | full | 抢占粒度 |
tickrate | full / idle / periodic | full | NO_HZ 高精度定时器策略 |
hugepage | always / madvise | always | 透明大页策略 |
ccHarder | true / false | true | -O3级别优化 |
bbr3 | true / false | false | 默认启用 BBR TCP 拥塞控制 |
kcfi | true / false | false | 内核控制流完整性 |
所有选项都以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 个设计
- 薄封装哲学:mkCachyKernel 不重写内核构建,只在
buildLinux外围做补丁、配置、工具链三处增强,其余全部委托——与上游 nixpkgs 保持同步的成本极低。 - 参数即变体:60 多个内核变体共用同一套构建逻辑,差异全部收敛为 10 来个语义化参数(
lto、cpusched、processorOpt……),新增变体只需复制一段 5 行的 Nix 表达式。 - 元数据驱动同步:版本信息集中在两份 version.json,由 update.py 自动刷新,用户
nix flake update一条命令就能拿到最新 CachyOS 内核。
如果你想深度定制(比如换掉cpusched或叠加自己的structuredExtraConfig),直接阅读 kernel-cachyos/mkCachyKernel.nix 即可,README 中也提供了完整的参数清单与override示例。
【免费下载链接】nix-cachyos-kernel
CachyOS kernel for NixOS
相关推荐
ADR 团队协作实践指南:从 "decisions" 命名到可变式活文档(architecture-decision-record 项目经验)
ADR 团队协作实践指南:从 "decisions" 命名到可变式活文档(architecture decision record 项目经验) 导读 架构决策记
nix-cachyos-kernel 如何修复 LTO 内核的树外模块编译:kernelModuleLLVMOverride 实现原理
nix cachyos kernel 如何修复 LTO 内核的树外模块编译:kernelModuleLLVMOverride 实现原理 nix cachyos
CachyOS Linux 内核项目教程
CachyOS Linux 内核项目教程 项目介绍 CachyOS 是一个基于 Arch Linux 的优化内核项目,旨在提供高性能和改进的系统体验。该项目通过
操作系统
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考