Loading... # NixOS:声明式、可重现的 Linux 发行版 # 一、概述 ## 1. 简介 ### A. 是什么 NixOS 是一个基于 Nix 包管理器构建的 Linux 发行版。它的核心特点是采用声明式配置和函数式包管理,使得整个系统可以从配置文件重建、变更和回滚。 ### B. 为什么关注 - 解决传统 Linux 系统状态累积问题 - 提供真正的可重现性和确定性 - 支持原子性升级和回滚 - 跨平台统一的包管理体验 ### C. 学完能了解 - Nix 包管理器的核心思想 - 声明式系统配置的优势 - 如何在 LLM 时代使用 Nix 管理工具链 - NixOS 与传统发行版的本质区别 ## 2. 前置知识 ### A. 必备技能 - 基本 Linux 命令操作 - 了解配置文件概念 ### B. 推荐知识 - 函数式编程基础(有助于理解 Nix 语言) - 其他 Linux 发行版使用经验 # 二、核心概念 ## 1. 基本术语 - Nix:纯函数式包管理器 - NixOS:基于 Nix 的 Linux 发行版 - Derivation:构建过程的描述单元 - Nix expression:Nix DSL(领域特定语言) - Channel:软件包来源渠道 - Flake:Nix 项目的现代组织方式 ## 2. 工作原理 Nix 的核心思想是将所有软件包和配置视为纯函数的输出。给定相同的输入,总是产生相同的输出。每个包都存储在独立的路径下,路径由其内容哈希决定。 ```mermaid graph TD A[Nix DSL 配置] -->|nix-build| B[Derivation] B -->|构建| C[软件包] C -->|哈希计算| D[/nix/store/哈希-包名/] D -->|符号链接| E[用户环境] F[系统配置] -->|nixos-rebuild| G[新一代系统] G -->|启动失败| H[自动回滚] G -->|启动成功| I[新系统运行] ```  传统包管理器与 Nix 的对比: ```mermaid graph LR subgraph 传统包管理 A1[/usr/bin/python3] --> A2[系统级共享] A3[包A更新] --> A4[影响其他包] end subgraph Nix B1[/nix/store/哈希1-python] --> B2[独立存储] B3[/nix/store/哈希2-python] --> B4[多版本共存] end ```  ## 3. 架构特点 ### A. 纯函数式 - 每个包的构建只依赖声明的输入 - 相同输入永远产生相同输出 - 构建过程可缓存和复用 ### B. 原子性操作 - 系统升级是全有或全无 - 失败时自动回滚到之前状态 - 不会留下半升级状态 ### C. 声明式配置 - 在一个地方定义整个系统 - 配置即代码 - 可版本控制和审查 # 三、核心优势 ## 1. 可重现性 传统 Linux 系统会逐渐变成一个状态堆:安装包、修改设置、尝试工具、删除部分、持续升级。最终得到一个能工作但无法从第一性原理解释的系统。 NixOS 完全不同:不需要信任一堆状态,可以定义系统并构建它。 ```mermaid graph LR A[传统系统] -->|使用| B[状态累积] B --> C[配置漂移] C --> D[难以复现] E[NixOS] -->|声明| F[配置文件] F -->|重建| G[确定结果] G --> H[完全可重现] ```  ## 2. 声明式配置 在单一配置文件中指定整个系统,包括所需软件包和配置。这种"单一事实来源"的优势远超表面价值。 **GNOME 扩展配置示例**: ```nix environment.systemPackages = with pkgs; [ gnomeExtensions.dash-to-dock gnomeExtensions.unite gnomeExtensions.appindicator libappindicator ]; services.desktopManager.gnome.extraGSettingsOverrides = '' [org.gnome.shell] enabled-extensions=['dash-to-dock@gnome-shell-extensions.gcampax.github.com', 'unite@hardpixel.eu', 'appindicatorsupport@rgcjonas.gmail.com'] [org.gnome.shell.extensions.dash-to-dock] dock-position='BOTTOM' autohide=true dock-fixed=false extend-height=false transparency-mode='FIX' ''; ``` **按键盘的键位映射配置示例**: ```nix services.keyd = { enable = true; keyboards = { usb_keyboard = { ids = [ "usb:kb" ]; settings.main = { leftcontrol = "leftmeta"; leftmeta = "leftcontrol"; rightalt = "rightmeta"; rightmeta = "rightalt"; }; }; laptop_keyboard = { ids = [ "laptop:kb" ]; settings.main = swapLeftAltLeftControl; }; }; }; ``` 这些是工作机器的普通细节,但正是重点所在:可以声明式地描述它们,重建系统并继续工作。购买新电脑时,不需要记住一长串手动设置步骤或散落各处的半成品脚本,可以从单一事实来源重建系统。 ## 3. 稳定性与可预测性 NixOS 已存在很长时间,经验表明非常稳定。它有可预测的每六个月发布周期。可以设置为自动更新,无需通常伴随操作系统升级的恐惧。 不需要过多考虑升级提示、桌面通知或后台随机的系统漂移。它大多不会干扰工作。如果想更冒险,也可以启用不稳定通道进行实验并获得更新的软件。 ## 4. 安全的实验性 可以尝试软件包而不改变基础系统。可以为从一次性脚本到成熟项目的任何内容构建完全隔离的包环境。如果想进一步加强,可以使用 Nix DSL 声明式地指定依赖、构建步骤和最终产物。 ```mermaid graph TD A[基础系统] -->|nix shell| B[临时隔离环境] A -->|nix develop| C[项目开发环境] B -->|退出| D[无残留] C -->|完成| E[flake.nix 记录] D --> A E --> F[完全可重现] ```  这比慢慢污染日常驱动并希望以后能重建所做之事的方式要好得多。 ## 5. 跨平台一致性 可以在 macOS 和 Linux 上使用相同的包管理器。还有社区维护的 FreeBSD 支持,虽然我没有亲自使用过。 这是一个巨大的实际好处,因为开发工具和依赖管理可以在这些系统间基本保持一致。这意味着 Nix 的价值不仅限于 NixOS。NixOS 恰好是它最完整的表达,但底层模型在跨平台时对我有用。 # 四、LLM 时代的优势 ## 1. 工具快速迭代 工具变化非常快。AI 编程代理通常需要非常特定版本的实用程序、编译器和运行时。它们需要安装某些东西、使用它、丢弃它、尝试另一个版本并继续,而不会将 PC 变成冲突状态的垃圾场。 Nix 自然地适合这种模型。如果告诉编程代理我使用 Nix,它通常足够聪明,会使用 nix shell 或 nix develop 将所需工具带入隔离环境并在那里执行。 ## 2. 隔离环境执行 Nix 将工具视为声明的输入,而不是系统的意外副作用。 **具体案例**:最近用 Rust 构建了一个语音转文字代理。系统上没有安装 Rust 工具链。只是告诉编程代理我使用 Nix,它就想出了如何通过 Nix 引入整个 Rust 工具链,在隔离 shell 中编译项目并生成可工作的二进制文件。 基础系统从未被触及: - 没有 ~/.cargo - 没有 ~/.rustup - 没有留下突变的 PATH 条目 没有 Nix,代理会使用 curl | sh 安装 rustup,悄悄改变环境,永远让系统略有不同。有了 Nix,这些都没有发生。 ```mermaid sequenceDiagram participant AI as AI 编程代理 participant Nix as Nix 包管理器 participant Sys as 基础系统 AI->>Nix: nix shell rustc cargo Nix->>Nix: 计算依赖哈希 Nix->>Sys: /nix/store (只读添加) Sys-->>AI: 隔离环境 PATH AI->>AI: 编译项目 AI->>Nix: 退出环境 Nix->>Sys: 清除环境引用 Note over Sys: 基础系统无变化 ```  ## 3. 可重现的代理实验 Nix 将代理的实验变成可以实际提交和重现的东西。一旦代理有了可工作的设置,可以在 flake.nix 中捕获确切的依赖并运行 nix flake check 验证它从头干净构建。 这将临时的代理会话转换为可重现的、可验证的产物。这是在生产环境中可靠交付工作的更强基础,而不是希望环境恰好处于下一台机器上的正确状态。 ## 4. 通用模式 每次代理需要 Python 3.11 vs 3.12、特定版本的 ffmpeg、冷门的 CLI 工具或特定编译器时,Nix 都为它提供了一种干净和可逆的方式来获得它需要的东西。 代理不必猜测工具是否已安装或版本错误。它只声明需要什么,Nix 以沙箱方式处理其余部分。 # 五、部署优势 ## 1. 超越 Docker 从来不是 Docker 作为"在我机器上能跑"问题的最终答案的粉丝。它无疑为行业解决了重要问题,但总觉得整体模型不如真正确定性的模型令人满意。 Nix 提供了更好的方案:可以使用 dockerTools.buildLayeredImage 以确定性和分层方式构建更小的 Docker 镜像。 ```mermaid graph LR A[Nix 配置] -->|dockerTools| B[分层镜像] B --> C[基础层] B --> D[依赖层] B --> E[应用层] C --> F[可复用] D --> F E --> G[确定产物] ```  ## 2. 确定性构建 如果可以在一台具有适当配置的计算机上构建它,只要 Nix 支持该架构,就可以在另一台计算机上构建相同的产物。经验表明这非常可靠。 ## 3. 统一模型 这种一致性是 NixOS 最看重的价值之一。相同的底层模型帮助处理: - 笔记本电脑 - Shell 环境 - 项目依赖 - CI 流水线 - 部署产物 这是一种软件思维方式,而不是无关工具和习惯的松散集合。 # 六、实际应用 ## 1. 新硬件支持 最近购买了一台 HP 笔记本电脑(HP EliteBook X G1a 14 英寸,64 GiB RAM,AMD Ryzen AI 9 HX PRO 375),NixOS 在开箱即用方面效果很好。 不需要与硬件斗争就能达到合理的基线。这正是从个人电脑想要的:一个可以声明式配置然后基本忽略的稳定系统,专注于实际工作。 ## 2. 系统重建流程 ```mermaid graph TD A[新机器] --> B[安装 NixOS] B --> C[复制配置文件] C --> D[nixos-rebuild switch] D --> E{系统正常?} E -->|是| F[完成] E -->|否| G[修改配置] G --> D ```  ## 3. 自动更新配置 NixOS 支持自动更新和原子性升级: ```nix system.autoUpgrade = { enable = true; allowReboot = false; dates = "daily"; }; ``` # 七、社区与生态 ## 1. 官方资源 - Nix 手册:完整的包管理和配置参考 - NixOS Wiki:社区维护的知识库 - Nixpkgs:超过 80,000 个软件包 ## 2. 发布渠道 - nixos-unstable:最新软件包 - nixos-XX.XX:稳定版本通道 - 每六个月一个新版本 ## 3. 跨平台支持 - Linux(NixOS 和其他发行版) - macOS - FreeBSD(社区支持) # 八、总结 当说喜爱 NixOS 时,真正喜爱的是它代表的东西。喜爱一个声明式的、可重现的、可逆的和稳定的系统。 喜爱能够无惧地实验和没有戏剧性地升级。喜爱它帮助专注于构建和实验快速变化的工具(包括 LLM 编程代理),而不必担心在此过程中搞乱系统。 NixOS 是我认为软件系统应该是什么样子的最完整的日常表达。 *** ## 参考资料 1. [Why I love NixOS - Birkey Consulting](https://www.birkey.co/2026-03-22-why-i-love-nixos.html) 2. [Nix 官方文档](https://nix.dev/manual/nix/latest/) 3. [NixOS 手册](https://nixos.org/manual/nixos/stable/) 4. [Nix: Better way for fun and profit](https://www.birkey.co/2025-04-15-nix:-better-way-for-fun-and-profit.html) 最后修改:2026 年 03 月 23 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏