什么是 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 reboot4. 可靠的包管理 (Reliable Package Management)
Nix 包管理器的特性:
- 隔离的包路径:不同包及版本不会互相覆盖;激活和程序运行仍可能产生副作用
- 多版本共存:同一软件的不同版本可以同时存在
- 垃圾回收:自动清理不再使用的包
- 二进制缓存:预编译的包可以快速安装
NixOS 适用场景#
| 场景 | NixOS 的优势 |
|---|---|
| 开发环境 | 快速创建可复现的开发环境 |
| 服务器部署 | 声明式配置,易于管理和回滚 |
| 嵌入式系统 | 定制化构建,只包含必需的组件 |
| CI/CD | 一致的构建环境 |
| 桌面系统 | 可选择稳定分支或 unstable,并保留代际回滚 |
NixOS 的架构#
┌─────────────────────────────────────┐
│ 用户空间应用层 │
│ (桌面环境、浏览器、编辑器等) │
├─────────────────────────────────────┤
│ 系统服务层 │
│ (systemd 服务、网络服务等) │
├─────────────────────────────────────┤
│ NixOS 配置层 │
│ (configuration.nix) │
├─────────────────────────────────────┤
│ Nix 包管理器 │
│ (nixpkgs、flakes) │
├─────────────────────────────────────┤
│ Linux 内核 │
└─────────────────────────────────────┘学习建议#
学习 NixOS 需要掌握以下内容:
- Nix 语言基础 - 用于编写配置文件
- NixOS 模块系统 - 理解配置选项的工作原理
- nixpkgs - Nix 包集合的使用方法
- Flakes - Nix 的新一代项目管理工具
与其他 Linux 发行版的对比#
| 特性 | NixOS | Ubuntu | Arch Linux |
|---|---|---|---|
| 配置方式 | 声明式 | 命令式 | 命令式 |
| 包管理 | Nix | APT | Pacman |
| 可复现性 | 原生支持 | 需额外工具 | 需额外工具 |
| 版本回滚 | 原生支持 | 有限支持 | 有限支持 |
| 学习曲线 | 陡峭 | 平缓 | 中等 |
参考资源#
参考与延伸
根据技术笔记重新整理,示例使用通用名称。