OFFSET偏移
← 文章目录OFFSET / FIELD NOTESNO. 013

NixOS:声明式系统的基础

从配置、构建结果和代际理解 NixOS 的基本工作方式。

所在专题NixOS 系统基础与配置 ↗
约 6 分钟阅读开始阅读

什么是 NixOS?#

NixOS 是一个基于 Nix 包管理器的 Linux 发行版,由 NixOS 基金会开发和维护。它采用了独特的声明式配置方式,让整个系统都可以通过配置文件来定义和管理。

核心特性#

1. 声明式配置 (Declarative Configuration)

传统的 Linux 发行版通常需要手动安装软件包、修改配置文件、启用服务等操作。而在 NixOS 中,所有这些操作都通过统一的 configuration.nix 文件来定义:

{ config, pkgs, ... }:

{
  # 启用 OpenSSH 服务
  services.openssh.enable = true;
  
  # 安装软件包
  environment.systemPackages = with pkgs; [
    vim
    git
    htop
  ];
  
  # 配置用户
  users.users.alice = {
    isNormalUser = true;
    extraGroups = [ "wheel" ];
  };
}

2. 可复现性 (Reproducibility)

固定配置、依赖 revision 和构建输入,可以重复构建声明描述的系统环境;可写数据、硬件差异和非确定性构建仍需单独处理。这意味着:

  • 你可以在不同的机器上部署相同的声明式环境
  • 团队开发环境可以保持一致
  • 生产环境和开发环境可以共享相同的依赖与配置定义

3. 原子升级与回滚 (Atomic Upgrades & Rollbacks)

NixOS 的系统更新是原子操作:

  • 新产物不会覆盖旧产物,系统 profile 切换支持原子更新
  • 激活脚本、服务重启、启动加载器和可写数据仍可能失败,回滚也不能代替备份
  • 随时可以回滚到之前的工作版本
# 查看可回滚的系统版本
sudo nixos-rebuild list-generations

# 切换到特定版本
sudo nix-env --profile /nix/var/nix/profiles/system --switch-generation 42
sudo /nix/var/nix/profiles/system/bin/switch-to-configuration switch
参数 当前系统立即切换 写入默认启动项 重启后生效
switch 是 是 是
boot 否 是 是
test 是 否 否,重启回滚

switch 会立即激活并设为启动默认项;boot 只构建并设为启动默认项,不改当前运行系统;test 立即激活但不加入启动菜单。NixOS Manual

更换登录管理器或关键服务时,switch 与 test 都可能中断当前会话。若目标是在下次启动采用新配置,可以先选择 boot:

sudo nixos-rebuild boot --flake .#workstation
# 确认工作已保存后才重启
sudo systemctl reboot

4. 可靠的包管理 (Reliable Package Management)

Nix 包管理器的特性:

  • 隔离的包路径:不同包及版本不会互相覆盖;激活和程序运行仍可能产生副作用
  • 多版本共存:同一软件的不同版本可以同时存在
  • 垃圾回收:自动清理不再使用的包
  • 二进制缓存:预编译的包可以快速安装

NixOS 适用场景#

场景 NixOS 的优势
开发环境 快速创建可复现的开发环境
服务器部署 声明式配置,易于管理和回滚
嵌入式系统 定制化构建,只包含必需的组件
CI/CD 一致的构建环境
桌面系统 可选择稳定分支或 unstable,并保留代际回滚

NixOS 的架构#

┌─────────────────────────────────────┐
│          用户空间应用层              │
│    (桌面环境、浏览器、编辑器等)       │
├─────────────────────────────────────┤
│          系统服务层                  │
│    (systemd 服务、网络服务等)         │
├─────────────────────────────────────┤
│          NixOS 配置层                │
│    (configuration.nix)               │
├─────────────────────────────────────┤
│          Nix 包管理器                │
│    (nixpkgs、flakes)                 │
├─────────────────────────────────────┤
│          Linux 内核                  │
└─────────────────────────────────────┘

学习建议#

学习 NixOS 需要掌握以下内容:

  1. Nix 语言基础 - 用于编写配置文件
  2. NixOS 模块系统 - 理解配置选项的工作原理
  3. nixpkgs - Nix 包集合的使用方法
  4. Flakes - Nix 的新一代项目管理工具

与其他 Linux 发行版的对比#

特性 NixOS Ubuntu Arch Linux
配置方式 声明式 命令式 命令式
包管理 Nix APT Pacman
可复现性 原生支持 需额外工具 需额外工具
版本回滚 原生支持 有限支持 有限支持
学习曲线 陡峭 平缓 中等

参考资源#



参考与延伸

  1. NixOS 手册 ↗
  2. Nix 语言手册 ↗

根据技术笔记重新整理,示例使用通用名称。

沿专题继续阅读

NixOS 系统基础与配置

  1. 01NixOS:声明式系统的基础
  2. 02安装 NixOS:介质、分区与初始配置
  3. 03NixOS 配置基础:选项与模块
  4. 04用 Flake 与 Home Manager 管理系统
  5. 05NixOS 命令行:新旧接口与日常维护
  6. 06NixOS 世代管理与垃圾回收
  7. 07Specialisation:一个世代的多个配置变体
  8. 08配置可重现,应用为什么还会“失忆”?
CONTINUE READING / 下一篇安装 NixOS:介质、分区与初始配置

按图形安装与手动安装两条路径理解安装前提和操作步骤。