老赵写字的地方

NixOS:声明式、可复现的 Linux 发行版

NixOS 是一套基于 Nix 包管理器 构建的 Linux 发行版1). 与传统的 Linux 发行版不同,NixOS 使用一种函数式语言来描述整个系统的配置,生成完整的系统配置文件(profile),从而实现可复现的部署2).

NixOS 使用 Nixpkgs 软件包集合和 Nix 表达式语言 来声明软件包和系统选项。它是 MIT 许可证下的自由开源软件。

NixOS 的特色总结:可复现(隔离构建)、声明式(配置即代码)、可靠(原子升级与回滚)。

历史

Nix 包管理器最初于 2003 年由 Eelco Dolstra 在乌得勒支大学作为研究项目发起。Dolstra 在 2006 年的博士论文 《The Purely Functional Software Deployment Model》3) 中描述了一种声明式、函数式的软件部署模型,奠定了 Nix 包管理器的设计基础。

首个 NixOS 原型由 Armijn Hemel 于 2006 年在其硕士论文 《NixOS: The Nix Based Operating System》 中创建4), 探索了将 Nix 原理应用于 Linux 发行版的可能性。经过持续开发后,NixOS 于 2013 年发布了第一个稳定版本 13.10。

NixOS 基金会 成立于 2015 年,是一家荷兰非营利组织,负责支持 NixOS 及相关 Nix 项目的开发和社区基础设施建设5).

自 2021 年起,NixOS 每年发布两个稳定版本(五月和十一月)。最新稳定版为 NixOS 26.056).

声明式配置模型

在 NixOS 中,整个操作系统——包括内核、应用程序、系统包和配置文件——都由 Nix 包管理器根据 Nix 语言的定义进行构建。构建新版本不会覆盖之前的版本。

NixOS 系统的配置通过编辑一个 Nix 表达式文件来完成(通常位于 /etc/nixos/configuration.nix)7).

配置示例:

  • 安装 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 中8). 每个包通过其所有构建输入的加密哈希来标识:

  • 同一软件的不同版本可以共存,不会冲突
  • 配置文件的旧版本不会被覆盖
  • 彻底避免“依赖地狱(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)锁定精确的依赖版本,确保评估结果随时间可复现9).

Nix 命令

新的 nix 命令提供了重新设计的命令行界面,统一了传统的 nix-env、nix-build 等命令,引入了一致的语法:

  • nix build — 构建包
  • nix develop — 进入开发环境
  • nix run — 直接运行包

Nixpkgs 软件包集合

Nixpkgs 是 Nix 包管理器的软件包集合,提供了超过 14 万个软件包10). 从日常桌面应用到服务器软件、开发工具,几乎应有尽有。

Nix 的构建语言指定了如何从源代码构建所有包,但同时 Nix 会自动从缓存服务器下载预编译的二进制文件,兼顾了源码包管理的灵活性和二进制包管理的效率。

评价与采用

NixOS 获得了业界和用户的好评:

  • Jesse Smith(DistroWatch, 2015):「NixOS 消除了升级的忧虑,每个变更都独立为独立的世代」
  • Liam Proven(The Register, 2022):「NixOS 安装简单,工具日趋成熟,这不是传统发行版,但它确实好用」
  • Jesse Smith(DistroWatch, 2023):「NixOS 是罕见的珍宝——使用期间没有遇到任何错误,尤其适合需要多台机器部署相同配置的系统管理员」11)

实际应用

法国政府的 DINUM(跨部门数字事务局) 正在基于 NixOS 开发 Sécurix——一个安全、可复现的操作系统基础12)。这是法国计划要求所有部委在 2026 年秋季前采用非美国技术战略的一部分,涵盖 PC 操作系统、协作工具、防病毒软件、AI 和数据库等领域。

总结

NixOS 以其声明式配置、原子升级、可复现构建三大核心特性,在 Linux 发行版中独树一帜。虽然学习曲线较为陡峭,但它为系统管理员和 DevOps 工程师提供了一种前所未有的系统管理方式。对于那些需要在多台机器上维护一致、可复现的系统环境的人来说,NixOS 是一个非常值得投入学习的发行版。

zh/nixos/nixos.txt · 最后更改: 由 dsbot