上篇文章主要谈了 NixOS 的高可复现性、可维护性和原子化更新特性如何恰到好处地解决了我的需求。如果你还没有看过,请参考 本系列上一篇文章

从这篇文章开始,我们将开始提一些学习配置 NixOS 开发机时更具体的建议。


1. NixOS 真的对新手很不友好吗?

首先,我想要回答一个问题:NixOS 真的对新手很不友好吗?

实际上,我觉得起码从系统安装的角度来看,其实并不难,想要尝鲜体验一下的难度远低于大多数人想象。

NixOS 官网提供了包含图形化界面的安装镜像,以及命令行安装的最小安装镜像。其中,图形化镜像的安装过程和那些公认新手友好的 Linux 发行版并无太大区别,且图形化安装界面会引导你选择你喜欢的桌面环境。

也就是说,如果你拿不准主意不知道 NixOS 是否适合你,我的建议就是从官网上下载一个 ISO 镜像在虚拟机内安装试试,亲自尝试过才知道适不适合。不论后续配置困难与否,至少安装过程是很丝滑的,可以进入系统以后再慢慢体验和斟酌。

事实上,对于下定决心要学习使用 NixOS 的朋友而言,我仍然建议在虚拟机内先尝试一下,并做一些基本的配置工作。不同于其他发行版,我们在虚拟机内做的所有配置调整,未来都是可以迁移到物理机上的,不必担心有重复劳动的问题。

也就是说,我们完全可以想在虚拟机内尝试多久就尝试多久,直到觉得系统达到相对比较顺的时候再考虑真正在物理机上安装。

系统安装的流程很直观,如有任何问题,或者你是 Linux 资深用户并想尝试无图形界面镜像的最小化安装,请查阅官方手册的对应部分


2. NixOS 在当下的正确打开方式

在这篇文章写成的时间点而言 (2025 年 8 月),即便 Nix Flakes 仍然是测试阶段,我建议一定要从开始就使用 Flakes 和 home-manager 来管理自己的配置。这两个工具分别解决了不同方向的问题,配合起来使用才可以实现真正高可复现性的 NixOS 环境。

Flakes 作为新一代 Nix 工具链的重要一环,即便现在名义上还没有完全稳定,也已经具备了极佳的可用性和开发者体验。向 NixOS 配置中引入 Flakes,才可以真正实现精确到 commit 级的软件源。

这主要是因为,引入 Flakes 后系统会自动生成并维护一个 flake.lock 文件,这个 lockfile 本质上和 JavaScript 项目中的 packages.lock,Rust 项目中的 cargo.lock 的功能是一致的。这个由系统自动维护的文件会详细记录软件源 (如 nixpkgs) 的 commit 值并锁定,这在根本上避免了重新构建时可能出现的版本漂移的问题。

也就是说,只有引入了 Flakes,才真正实现了系统层面近乎完美的可复现性

而 home-manager,解决的是用户层软件配置可复现性差的问题。按照原来的配置模式,所有软件均为系统层全局安装,而配置文件和传统 Linux 系统一样放在用户 home 目录下软件指定的文件夹中,这就意味着需要用户自己想办法处理软件配置文件的备份和版本管理问题。

引入 home-manager 后,一方面,一部分软件可以为具体用户安装而不是全局安装,对于有多用户管理需求的使用场景要友好很多,可以实现严格的用户间开发环境隔离。

另一方面,由于 home-manager 源软件在打包的时候往往提供了一些 API,用于把原先 YAML、TOML、JSON 或者其他配置文件类型,转化为 Nix 语言配置 (当然用户也可以选择使用原版配置文件),并在新配置 rebuild 过程中自动在 home 目录下对应位置创建指向 /nix/store 目录的软链接。这使得用户层一些软件的配置信息也可以方便地使用 git 进行版本管理。

简单来说,home-manager 让我们对于终端模拟器、shell 等很多用户层配置也可以轻松进行版本管理和跨设备配置精确复刻。配合 Flakes,从系统层到用户层的几乎全部细节,都被一套配置文件定义了,用户可以轻松实现备份、版本管理、迁移等工作。

关于 Flakes 和 home-manager 的具体使用和配置,我非常推荐知友 @於清樂 写的 NixOS & Flakes Book。全文使用清晰流畅的中文,用深入浅出的方式介绍了许多稍显复杂的概念。

我自己基本就是看这套教程入门的,哪怕只是把基础部分看完,对于 NixOS 终端用户而言就完全够用了,在知识上就具备了定制化 NixOS 开发环境的条件。


3. 遇到问题怎么办?

当然,考虑到 NixOS 的复杂性,我想我们在使用过程中不可避免会遇到一些问题。

NixOS 被人诟病的一点就是文档混乱分散,质量比 Arch wiki 确实存在差距。但是,当你掌握了一定的检索技巧后,我觉得很多问题实际上还是能找到解决办法的 ── 文档只是分散,并非完全不存在

首先,对于想要找“保姆级教程”的朋友,追求文章的可读性和逻辑性,首先推荐的就是上文提到的NixOS & Flakes Book,此外使用英语创作的 Nix Pills

对于 Nix 语言本身,建议先从 官方 Nix 语言入门教学 看起,先学一下基本的数据结构,有这些基本知识,做简单的系统配置完全够用。

至于后续其他深入的 Nix 语言特性,比如柯里化、高阶函数等函数式语言特性,可以等需要的时候慢慢研究,或者移步我目前正在撰文的另一个专栏:《函数式心法》

对于具体软件的配置问题,首先还是建议先查 NixOS Wiki。但是,需要注意的是,Wiki 的各个页面良莠不齐,有的页面事无巨细基本配置抄了就能用;有的页面语焉不详,令人不知所云。所以,我们在使用的时候应当好好甄别。

而且 NixOS Wiki 实际上还有两个版本,这是 官方版本,这是 用户维护的非官方版本

对于 NixOS Wiki 没有覆盖的软件配置,通常下一步是查阅 Arch Wikimankier 看有没有信息供参考。

当然,查到非 NixOS Wiki 上的配置指引,想要翻译成 Nix 配置还是需要再转化一下的。这时候就可以查官方的 NixOS SearchMyNixOS

到这一步,绝大多数问题都基本可以解决。官方提供的 NixOS Search 是一个兜底性工具,毕竟所有的软件包、系统全局配置选项、home-manager 配置选项以及 Flakes 配置选项等信息都可以查到,并且一般伴有比较详细的说明和示例。

如果你仍然有疑问,也欢迎到知乎上提问并邀请我,我非常乐意回答大家的问题。


这篇文章主要谈了 NixOS 安装、Flakes 和 home-manager 的必要性以及遇到问题时的正确解决思路三点。后续几篇文章,我将深入谈一些 NixOS 使用时的技巧,并开始展示如何定制适合自己工作流的桌面环境 (Niri 窗口管理器) 和其他开发工具。