====== NixOS:声明式、可复现的 Linux 发行版 ======
NixOS 是一套基于 **Nix 包管理器** 构建的 Linux 发行版(([[https://nixos.org/|NixOS 官方网站]])). 与传统的 Linux 发行版不同,NixOS 使用一种函数式语言来描述整个系统的配置,生成完整的系统配置文件(profile),从而实现可复现的部署(([[https://en.wikipedia.org/wiki/NixOS|Wikipedia: NixOS]])).
NixOS 使用 **Nixpkgs** 软件包集合和 **Nix 表达式语言** 来声明软件包和系统选项。它是 MIT 许可证下的自由开源软件。
NixOS 的特色总结:**可复现**(隔离构建)、**声明式**(配置即代码)、**可靠**(原子升级与回滚)。
===== 历史 =====
Nix 包管理器最初于 2003 年由 Eelco Dolstra 在乌得勒支大学作为研究项目发起。Dolstra 在 2006 年的博士论文 **《The Purely Functional Software Deployment Model》**(([[https://edolstra.github.io/pubs/phd-thesis.pdf|Eelco Dolstra 博士论文]])) 中描述了一种声明式、函数式的软件部署模型,奠定了 Nix 包管理器的设计基础。
首个 NixOS 原型由 Armijn Hemel 于 2006 年在其硕士论文 **《NixOS: The Nix Based Operating System》** 中创建(([[https://en.wikipedia.org/wiki/NixOS|Wikipedia: NixOS History]])), 探索了将 Nix 原理应用于 Linux 发行版的可能性。经过持续开发后,NixOS 于 2013 年发布了第一个稳定版本 13.10。
**NixOS 基金会** 成立于 2015 年,是一家荷兰非营利组织,负责支持 NixOS 及相关 Nix 项目的开发和社区基础设施建设(([[https://nixos.org/governance|NixOS Governance]])).
自 2021 年起,NixOS 每年发布两个稳定版本(五月和十一月)。最新稳定版为 **NixOS 26.05**(([[https://nixos.org/blog|NixOS Release Announcements]])).
===== 声明式配置模型 =====
在 NixOS 中,整个操作系统——包括内核、应用程序、系统包和配置文件——都由 Nix 包管理器根据 Nix 语言的定义进行构建。构建新版本不会覆盖之前的版本。
NixOS 系统的配置通过编辑一个 Nix 表达式文件来完成(通常位于 **/etc/nixos/configuration.nix**)(([[https://nixos.org/manual/nixos/stable/#sec-configuration-file|NixOS Manual: Configuration]])).
配置示例:
* 安装 Firefox 和 VSCode
* 启用 SSH 服务
* 配置网络和用户
修改配置后,运行以下命令即可应用更改:
* ''sudo nixos-rebuild switch'' — 构建并切换至新配置
* ''sudo nixos-rebuild test'' — 测试配置但不设为默认
* ''sudo nixos-rebuild boot'' — 仅构建下次启动生效
===== 原子升级与回滚 =====
NixOS 最强大的特性之一是其事务性升级机制:
* 每次系统变更会产生一个新的 **generation(系统世代)**
* 新世代会**原子地**激活,之前的所有世代保留并可回滚
* 如果升级被中断(如断电),系统保持一致性,启动时会回到旧配置或新配置
* 回滚简单轻量:''nixos-rebuild switch --rollback''
* 所有世代自动添加到引导菜单,可在开机时选择
这种方式彻底解决了传统 Linux 发行版中常见的"升级后系统损坏"问题。
===== Nix 存储(Nix Store)=====
NixOS 将已安装的包存储在只读目录 **/nix/store** 中(([[https://nixos.org/manual/nix/stable/#sec-nix-store|Nix Manual: Nix Store]])). 每个包通过其所有构建输入的**加密哈希**来标识:
* 同一软件的不同版本可以共存,不会冲突
* 配置文件的旧版本不会被覆盖
* 彻底避免"依赖地狱(dependency hell)"
* NixOS **不遵循**文件系统层次结构标准(FHS),仅保留 /bin/sh 的符号链接
例如,bash 的路径可能是 ''/nix/store/5rnfzla9kcx4mj5zdc7nlnv8na1najvg-bash-4.3.43/bin/bash''——版本号嵌入路径中,多版本共存成为可能。
===== 多用户包管理 =====
除了系统级配置外,NixOS 中的每个普通用户都拥有自己的 profile,可以在不需要特殊权限的情况下安装软件包:
* 多版本共存,不同用户可使用同一软件的不同版本
* Nix 的安全模型限制非特权用户的操作范围
* 预编译二进制文件从受信任的缓存(binary cache)获取
* 没有特殊权限的用户不能引入不纯净的构建选项
**nix-shell** 命令允许开发者启动一个基于 Nix 表达式的交互式 shell,在隔离的依赖环境中工作,不影响系统全局。
===== 实验性功能 =====
==== Flakes ====
Flakes 为 Nix 表达式提供了标准化的结构,明确声明依赖关系和输出。每个 flake 包含一个 **flake.nix** 文件,指定其输入(依赖、外部 flakes、仓库)和输出(包、NixOS 配置、开发环境)。Flakes 使用锁文件(lock file)锁定精确的依赖版本,确保评估结果随时间可复现(([[https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-flake.html|Nix Manual: Flakes]])).
==== Nix 命令 ====
新的 **nix** 命令提供了重新设计的命令行界面,统一了传统的 ''nix-env''、''nix-build'' 等命令,引入了一致的语法:
* ''nix build'' — 构建包
* ''nix develop'' — 进入开发环境
* ''nix run'' — 直接运行包
===== Nixpkgs 软件包集合 =====
**Nixpkgs** 是 Nix 包管理器的软件包集合,提供了超过 **14 万个软件包**(([[https://search.nixos.org/packages|NixOS Package Search]])). 从日常桌面应用到服务器软件、开发工具,几乎应有尽有。
Nix 的构建语言指定了如何从源代码构建所有包,但同时 Nix 会自动从缓存服务器下载预编译的二进制文件,兼顾了源码包管理的灵活性和二进制包管理的效率。
===== 评价与采用 =====
NixOS 获得了业界和用户的好评:
* Jesse Smith(DistroWatch, 2015):「NixOS 消除了升级的忧虑,每个变更都独立为独立的世代」
* Liam Proven(The Register, 2022):「NixOS 安装简单,工具日趋成熟,这不是传统发行版,但它确实好用」
* Jesse Smith(DistroWatch, 2023):「NixOS 是罕见的珍宝——使用期间没有遇到任何错误,尤其适合需要多台机器部署相同配置的系统管理员」(([[https://en.wikipedia.org/wiki/NixOS#Reception|Wikipedia: NixOS Reception]]))
==== 实际应用 ====
法国政府的 **DINUM(跨部门数字事务局)** 正在基于 NixOS 开发 **Sécurix**——一个安全、可复现的操作系统基础(([[https://en.wikipedia.org/wiki/NixOS#French_government|Wikipedia: NixOS - French government]]))。这是法国计划要求所有部委在 2026 年秋季前采用非美国技术战略的一部分,涵盖 PC 操作系统、协作工具、防病毒软件、AI 和数据库等领域。
===== 总结 =====
NixOS 以其**声明式配置、原子升级、可复现构建**三大核心特性,在 Linux 发行版中独树一帜。虽然学习曲线较为陡峭,但它为系统管理员和 DevOps 工程师提供了一种前所未有的系统管理方式。对于那些需要在多台机器上维护**一致、可复现**的系统环境的人来说,NixOS 是一个非常值得投入学习的发行版。