NixOS 26.05 "Yarara" 深度实战:Linux 世界最硬核的声明式操作系统——从 Nix 包管理哲学到生产级部署的完全指南(2026)
NixOS 26.05 "Yarara" 已于 2026-05-31 正式发布,搭载 Linux 6.18 LTS、GNOME 50、systemd Stage 1 启动革命、新增 85 个系统模块与 1547 个配置选项。本文从零开始,用程序员的视角把这个"写了配置就等于部署"的操作系统拆到骨头里。
一、为什么 NixOS 值得你认真关注
在 Linux 发行版的世界里,大多数发行版遵循一个古老的传统:用命令配置系统,改完之后祈祷不要忘记——因为没有人知道你是怎么配出来的。Ubuntu 用 apt,CentOS 用 yum,Arch 用 pacman,但无论是哪个,配置文件散落在 /etc 的各个角落,服务依赖关系隐含在 systemd 的编排中,软件版本冲突靠运气解决。
NixOS 站在了这个传统的对立面。它的核心理念只有一个:系统的全部状态,由一份声明式配置文件定义。
这不是"自动化配置管理"——Puppet、Ansible、Chef 做的是"把现有系统推到期望状态",而 NixOS 的做法更彻底:不存在"现有系统"这个概念,你写的配置文件就是系统本身。
具体来说,NixOS 有三个让程序员无法拒绝的特性:
1. 真正的可重复构建
在 NixOS 上,不存在"我本地能跑,你那边不行"这种事。同一个配置文件,在任何机器上构建出来就是完全相同的系统。不是"类似",是 hash 级别的相同——因为 Nix 的包管理器对每个依赖都做了内容寻址存储。
2. 原子化升级与回滚
NixOS 的每次系统变更都是原子的。要么全部成功,要么全部回滚。升级翻车了?在启动菜单选上一代配置,30 秒恢复。没有"滚回去改配置文件"这种操作。
3. 不可变的基础设施
系统一旦构建,所有包和配置都是只读的。没有 pip install 污染全局环境这种事,没有某个包覆盖另一个包的共享库这种地狱。每个版本的应用都依赖自己的那棵依赖树,互不干扰。
听起来很理想主义?但在 2026 年,当 Docker、Kubernetes、GitOps 已经把"声明式基础设施"变成云原生的共识时,NixOS 的理念其实已经不再小众。事实上,越来越多的公司(Tailscale、Fly.io、Scene Shift 等)正在生产环境使用 NixOS 或 Nix。
NixOS 26.05 是这个系统的最新稳定版,代号 "Yarara"(一种南美跳兔)。让我们一起深入拆解。
二、Nix 包管理器的底层哲学
要理解 NixOS,必须先理解 Nix 这个包管理器。NixOS 是 Nix 的"操作系统级应用",而 Nix 是基础。
2.1 内容寻址存储:告别 /usr/lib 地狱
传统的包管理器安装软件时,会把文件散布到系统目录里:/usr/bin、/usr/lib、/etc……不同版本的库会互相覆盖。这就是经典的"依赖地狱"。
Nix 的做法完全不同:每个包的每个版本都安装到独立的目录,路径里包含 hash 值。
/nix/store/x8v...-bash-5.2/bin/bash
/nix/store/p9k...-bash-5.1/bin/bash
/nix/store/m7q...-gcc-14.2.0/bin/gcc
/nix/store/r2w...-openssl-3.3.0/lib/libssl.so
/nix/store/s5t...-openssl-3.2.1/lib/libssl.so
路径中的 hash(如 x8v...)是由包的所有输入(源代码、编译器、依赖、构建脚本)计算出来的。任何一个输入变了,hash 就变,就会安装到一个新路径。
这意味着:
- 同一包的两个版本可以共存,因为路径不同,不会冲突
- 构建是可判定的(deterministic),相同输入永远产生相同输出
- 垃圾回收是安全的,如果没有任何包引用某个路径,删掉就不会破坏任何东西
2.2 Derivation:Nix 的构建描述
在 Nix 中,一个包的构建描述叫做"Derivation"。它声明了三个核心信息:
- 输入:源代码 URL、依赖的其他 derivations、构建脚本
- 输出:构建产物安装到哪个 store 路径
- 构建器:用什么程序来执行构建(通常是
bash)
一个简化版的 derivation 长这样(Nix 表达式语言):
# 一个 Go 开发环境的 derivation
{ pkgs ? import <nixpkgs> {}, ... }:
pkgs.mkShell {
nativeBuildInputs = with pkgs; [
go_1_22
gopls
go-tools
];
shellHook = ''
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
echo "Go development environment ready"
'';
}
# 一个 Python 应用的 derivation
{ pkgs ? import <nixpkgs> {} }:
pkgs.python3Packages.buildPythonApplication {
pname = "my-web-service";
version = "1.0.0";
src = ./src;
propagatedBuildInputs = with pkgs.python3Packages; [
fastapi
uvicorn
sqlalchemy
redis
];
pyproject = ./pyproject.toml;
}
2.3 Nixpkgs:80,000+ 软件的声明式仓库
NixOS 的软件仓库叫 Nixpkgs。这不是一个传统的"包列表",而是一个用 Nix 语言编写的、包含 80,000+ 软件定义的代码仓库。每个软件都是一段 Nix 表达式,描述了如何从源代码构建。
NixOS 26.05 中的 Nixpkgs 统计:
- 新增 20,442 个软件包
- 更新 20,641 个现有软件包
- 移除 17,532 个过时软件包
2.4 Profile 与 Generation:多版本共存的秘密
Nix 使用"Profile"(个人环境)和"Generation"(代际快照)来管理系统变更。
当你执行 nixos-rebuild switch 时:
- Nix 计算新系统的 closure(所有需要的 store 路径)
- 构建所有缺失的 derivations
- 创建一个新的 generation 链接,指向新系统
- 切换到新系统
旧系统并不会被删除。每个 generation 都是一个完整的系统快照,可以随时回滚。
# 查看所有 generation
nixos-rebuild --list-generations
# 回滚到上一个 generation
nixos-rebuild switch --rollback
三、NixOS 26.05 核心变更深度解析
3.1 Linux 6.18 LTS 内核
NixOS 26.05 默认搭载 Linux 6.18 LTS 长期支持内核,将获得至少 2 年的维护。关键特性包括:更好的硬件支持(Intel Ultra 300、AMD 新显卡、NPU)、EEVDF 调度器改进、EXT4 写入性能优化、改进的 TPM 2.0 支持。
# configuration.nix - 内核配置
{ config, pkgs, ... }:
{
boot.kernelPackages = pkgs.linuxPackages; # LTS(默认)
# boot.kernelPackages = pkgs.linuxPackages_latest; # 主线
boot.kernelParams = [ "quiet" "splash" "nvdimm=force" ];
}
3.2 systemd Stage 1 启动革命
这是 NixOS 26.05 最值得关注的架构变更。以前 Stage 1(早期用户空间)由 bash 脚本实现,现在首次默认启用 systemd-based Stage 1:
boot.initrd.systemd.enable = true; # 默认启用
好处:
- 统一启动日志:Stage 1 和 Stage 2 的日志都由 journald 管理
- 更可靠的依赖管理:systemd 的单元依赖机制替代脚本隐式顺序
- 与上游更接近:可以复用 systemd 上游的相关工作
# 查看 Stage 1 日志
journalctl -b -u initrd.target
systemd-analyze # 启动时间分析
systemd-analyze blame # 哪个服务最慢
3.3 GNOME 50 桌面环境
NixOS 26.05 搭载 GNOME 50:Wayland 原生(彻底移除 Xorg 会话)、默认开启 VRR 可变刷新率、分数缩放改进。
services.xserver.enable = true;
services.xserver.displayManager.gdm.enable = true;
services.xserver.desktopManager.gnome.enable = true;
dconf.settings = {
"org/gnome/desktop/interface" = {
color-scheme = "prefer-dark";
clock-show-seconds = true;
};
};
3.4 新增 85 个系统模块与 1547 个配置选项
# 新模块示例
services.mullvad-vpn.enable = true; # VPN 客户端
services.ollama = { # 本地 LLM
enable = true;
acceleration = "cuda"; # 或 "rocm"
};
virtualisation.podman = { # 容器
enable = true;
dockerSocket.enable = true;
};
system.autoUpgrade = { # 自动更新
enable = true;
dates = "weekly";
};
四、NixOS 配置实战:从零搭建开发工作站
4.1 基础系统配置
# /etc/nixos/configuration.nix
{ config, pkgs, ... }:
{
imports = [
./hardware-configuration.nix
./modules/network.nix
./modules/desktop.nix
./modules/development.nix
];
networking.hostName = "dev-workstation";
time.timeZone = "Asia/Shanghai";
i18n.defaultLocale = "en_US.UTF-8";
i18n.extraLocaleSettings = {
LC_TIME = "zh_CN.UTF-8";
};
users.users.developer = {
isNormalUser = true;
extraGroups = [ "wheel" "docker" "networkmanager" "video" "audio" ];
initialPassword = "changeme";
shell = pkgs.zsh;
};
networking.firewall = {
enable = true;
allowedTCPPorts = [ 22 80 443 3000 5432 6379 ];
};
nix.settings = {
experimental-features = [ "nix-command" "flakes" ];
auto-optimise-store = true;
substituters = [
"https://cache.nixos.org"
"https://nix-community.cachix.org"
];
};
nix.gc = {
automatic = true;
dates = "weekly";
options = "--delete-older-than 30d";
};
environment.systemPackages = with pkgs; [
git wget curl htop tmux ripgrep fd bat eza jq fzf tree
nmap tcpdump dnsutils wireshark
gnupg pass age
btop iotop ncdu
];
boot.loader = {
systemd-boot.enable = true;
efi.canTouchEfiVariables = true;
};
system.stateVersion = "26.05";
}
4.2 网络模块
# /etc/nixos/modules/network.nix
{ config, pkgs, ... }:
{
networking.networkmanager.enable = true;
services.openssh = {
enable = true;
settings = {
PasswordAuthentication = false;
PermitRootLogin = "no";
};
};
services.tailscale.enable = true;
}
4.3 开发环境模块
# /etc/nixos/modules/development.nix
{ config, pkgs, ... }:
{
virtualisation.podman = {
enable = true;
dockerSocket.enable = true;
};
environment.systemPackages = with pkgs; [
# Go
go gopls go-tools delve
# Rust
rustc cargo rust-analyzer clippy rustfmt
# Python
python3 ruff
# Node.js
nodejs_22 nodePackages.pnpm nodePackages.typescript
# C/C++
gcc13 clang_18 cmake gdb
# Java
jdk21 maven gradle
# DevOps
kubectl kubernetes-helm terraform
# Git 增强
gh delta lazygit
];
services.postgresql = {
enable = true;
package = pkgs.postgresql_16;
ensureDatabases = [ "myapp_dev" ];
};
services.redis = {
enable = true;
servers.default = {
port = 6379;
appendOnly = true;
maxmemory = "512mb";
};
};
programs.zsh.enable = true;
programs.starship.enable = true;
programs.direnv.nix-direnv.enable = true;
}
4.4 桌面模块
# /etc/nixos/modules/desktop.nix
{ config, pkgs, ... }:
{
security.rtkit.enable = true;
services.pipewire = {
enable = true;
alsa.enable = true;
pulse.enable = true;
};
services.xserver.enable = true;
services.xserver.displayManager.gdm.enable = true;
services.xserver.desktopManager.gnome.enable = true;
hardware.graphics.enable = true;
environment.systemPackages = with pkgs; [
firefox google-chrome
alacritty kitty
vscode neovim
flameshot obs-studio
];
fonts.packages = with pkgs; [
noto-fonts noto-fonts-cjk-sans noto-fonts-emoji
jetbrains-mono fira-code
];
}
4.5 一键部署
# 测试配置
sudo nixos-rebuild test
# 构建并切换
sudo nixos-rebuild switch
# 升级所有软件
sudo nixos-rebuild switch --upgrade
# 回滚
sudo nixos-rebuild switch --rollback
五、Flakes:NixOS 的现代工作流
5.1 Flake 入口配置
# flake.nix
{
description = "My NixOS Workstation";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-26.05";
home-manager = {
url = "github:nix-community/home-manager/release-26.05";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs = { self, nixpkgs, home-manager, ... }@inputs: {
nixosConfigurations.workstation = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
./hosts/workstation/configuration.nix
home-manager.nixosModules.home-manager
{ home-manager.users.developer = ./hosts/workstation/home.nix; }
];
};
};
}
5.2 Home Manager:用户级配置
# hosts/workstation/home.nix
{ config, pkgs, ... }:
{
home.username = "developer";
home.homeDirectory = "/home/developer";
home.stateVersion = "26.05";
programs.git = {
enable = true;
userName = "Developer";
userEmail = "dev@example.com";
aliases = { lg = "log --oneline --graph --decorate"; };
extraConfig = { core.editor = "nvim"; pull.rebase = true; };
};
programs.zsh = {
enable = true;
autosuggestion.enable = true;
syntaxHighlighting.enable = true;
initExtra = ''
eval "$(starship init zsh)"
eval "$(zoxide init zsh)"
alias ll='eza -la'
alias cat='bat'
'';
};
home.packages = with pkgs; [ zoxide starship ];
}
5.3 多主机管理
nixos-config/
├── flake.nix
├── hosts/
│ ├── workstation/ # 开发机
│ ├── server/ # 服务器
│ └── pi/ # 树莓派
└── modules/ # 共享模块
# 远程部署
nixos-rebuild switch --flake .#server --target-host root@server.example.com
六、NixOS 在生产环境中的实践
# 生产级 Web 服务器
{ config, pkgs, ... }:
{
services.nginx = {
enable = true;
recommendedProxySettings = true;
virtualHosts."app.example.com" = {
enableACME = true;
forceSSL = true;
locations."/".proxyPass = "http://127.0.0.1:3000";
};
};
services.postgresql = {
enable = true;
settings = { max_connections = "200"; shared_buffers = "1GB"; };
ensureDatabases = [ "production" ];
};
networking.firewall.allowedTCPPorts = [ 22 80 443 ];
system.autoUpgrade = {
enable = true;
operation = "switch";
dates = "02:00";
};
}
NixOS 在生产环境的核心价值:不可变基础设施。同一个配置文件在任何机器上构建结果完全相同,升级出问题 30 秒回滚,配置在 Git 中可审计,系统状态永远等于配置文件状态。
七、NixOS 26.05 性能优化
7.1 Store 优化与垃圾回收
# 磁盘使用分析
nix path-info -ShS /nix/store/* | sort -h | tail -20
# 垃圾回收
nix-collect-garbage --delete-older-than 30d
# 硬链接去重
nix store optimise
# 查看系统 closure 大小
nix path-info -rS $(readlink -f /run/current-system) | tail -1
7.2 构建缓存
nix.settings = {
substituters = [
"https://cache.nixos.org"
"https://nix-community.cachix.org"
];
trusted-public-keys = [
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7iBJ4oL8Q9H8stqFmrDh4k="
];
max-jobs = "auto";
};
配置缓存后,大部分包直接下载预编译二进制,构建时间从小时级降到分钟级。
7.3 启动速度优化
systemd.services.NetworkManager-wait-online.enable = false;
boot.kernelParams = [ "quiet" "loglevel=3" ];
boot.tmp.cleanOnBoot = true;
fileSystems."/".options = [ "noatime" "discard" ];
boot.swappiness = 10;
八、常见问题与排障
Q:NixOS 学习曲线很陡吗?
A:Nix 语言的基本语法半天能上手,真正的挑战在于理解 derivation、store、closure 等概念。
Q:NixOS 能运行 Docker 吗?
A:完全可以。virtualisation.podman.enable = true 即可,还可以用 Nix 直接构建 OCI 镜像。
Q:从 Ubuntu 迁移?
A:保留数据盘,全新安装 NixOS,用配置文件重建环境。配置在 Git 中,迁移反而容易。
调试命令:
nix-store --query --tree $(which bash) # 依赖树
nix log /nix/store/xxx-bash-5.2 # 构建日志
nix develop # 进入开发环境
nix search firefox # 查找包
nix eval nixpkgs#firefox.version # 查看版本
九、NixOS 生态与未来
| 项目 | 用途 |
|---|---|
| Nix | 包管理器 |
| NixOS | 声明式操作系统 |
| Nixpkgs | 80,000+ 软件仓库 |
| Home Manager | 用户级配置 |
| Deploy-rs | 远程部署 |
| Attic | 二进制缓存服务器 |
| nix-direnv | 项目级环境 |
未来方向:Flakes 正式稳定化、Rust 重写 Nix 核心(Tvix)、更好的 ARM 支持云原生集成、AI 开发环境可重复构建。
| 特性 | NixOS | Ansible | Docker | Guix |
|---|---|---|---|---|
| 声明级别 | 系统级 | 推送式 | 容器级 | 系统级 |
| 可重复性 | Hash 级 | 依赖工具 | 镜像级 | Hash 级 |
| 原子回滚 | 原生 | 需额外工具 | 镜像回滚 | 原生 |
| 包数量 | 80,000+ | N/A | Hub | 20,000+ |
十、总结
NixOS 不是完美的。它的学习曲线确实陡峭,Nix 语言虽然函数式但不讨喜,某些软件的 Nix 表达式可能需要自己写。
但如果你是以下类型的程序员,NixOS 26.05 值得认真尝试:
- 对系统可重复性有执念的人——同一配置在任何地方产出相同系统
- 管理多台机器的人——NixOS 的多主机配置管理是顶级的
- 喜欢声明式基础设施的人——Terraform/Kubernetes 用户会感到亲切
- 经常搞坏系统的人——NixOS 的原子回滚是救命的
- 追求不可变基础设施的人——Docker/K8s 理念应用到整个操作系统
2026 年,NixOS 已经不再是小众玩具。Tailscale 用它管理全球节点,Fly.io 用它构建容器平台。如果你还没试过,NixOS 26.05 是最好的起点——Linux 6.18 LTS、GNOME 50、systemd Stage 1,一个稳定、现代、有大量社区支持的基础设施平台。
去试试吧。你的系统配置文件,值得被 Git 管理。