====== 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 是一个非常值得投入学习的发行版。