编程 NixOS 26.05 "Yarara" 深度实战:Linux 世界最硬核的声明式操作系统——从 Nix 包管理哲学到生产级部署的完全指南(2026)

2026-06-02 10:12:15 +0800 CST views 4

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"。它声明了三个核心信息:

  1. 输入:源代码 URL、依赖的其他 derivations、构建脚本
  2. 输出:构建产物安装到哪个 store 路径
  3. 构建器:用什么程序来执行构建(通常是 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 时:

  1. Nix 计算新系统的 closure(所有需要的 store 路径)
  2. 构建所有缺失的 derivations
  3. 创建一个新的 generation 链接,指向新系统
  4. 切换到新系统

旧系统并不会被删除。每个 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;  # 默认启用

好处:

  1. 统一启动日志:Stage 1 和 Stage 2 的日志都由 journald 管理
  2. 更可靠的依赖管理:systemd 的单元依赖机制替代脚本隐式顺序
  3. 与上游更接近:可以复用 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声明式操作系统
Nixpkgs80,000+ 软件仓库
Home Manager用户级配置
Deploy-rs远程部署
Attic二进制缓存服务器
nix-direnv项目级环境

未来方向:Flakes 正式稳定化、Rust 重写 Nix 核心(Tvix)、更好的 ARM 支持云原生集成、AI 开发环境可重复构建。

特性NixOSAnsibleDockerGuix
声明级别系统级推送式容器级系统级
可重复性Hash 级依赖工具镜像级Hash 级
原子回滚原生需额外工具镜像回滚原生
包数量80,000+N/AHub20,000+

十、总结

NixOS 不是完美的。它的学习曲线确实陡峭,Nix 语言虽然函数式但不讨喜,某些软件的 Nix 表达式可能需要自己写。

但如果你是以下类型的程序员,NixOS 26.05 值得认真尝试:

  1. 对系统可重复性有执念的人——同一配置在任何地方产出相同系统
  2. 管理多台机器的人——NixOS 的多主机配置管理是顶级的
  3. 喜欢声明式基础设施的人——Terraform/Kubernetes 用户会感到亲切
  4. 经常搞坏系统的人——NixOS 的原子回滚是救命的
  5. 追求不可变基础设施的人——Docker/K8s 理念应用到整个操作系统

2026 年,NixOS 已经不再是小众玩具。Tailscale 用它管理全球节点,Fly.io 用它构建容器平台。如果你还没试过,NixOS 26.05 是最好的起点——Linux 6.18 LTS、GNOME 50、systemd Stage 1,一个稳定、现代、有大量社区支持的基础设施平台。

去试试吧。你的系统配置文件,值得被 Git 管理。

复制全文 生成海报 NixOS Linux Nix 声明式配置 DevOps

推荐文章

Vue3中的Scoped Slots有什么改变?
2024-11-17 13:50:01 +0800 CST
一个有趣的进度条
2024-11-19 09:56:04 +0800 CST
使用Rust进行跨平台GUI开发
2024-11-18 20:51:20 +0800 CST
Go的父子类的简单使用
2024-11-18 14:56:32 +0800 CST
虚拟DOM渲染器的内部机制
2024-11-19 06:49:23 +0800 CST
Golang - 使用 GoFakeIt 生成 Mock 数据
2024-11-18 15:51:22 +0800 CST
小技巧vscode去除空格方法
2024-11-17 05:00:30 +0800 CST
CSS 媒体查询
2024-11-18 13:42:46 +0800 CST
一键配置本地yum源
2024-11-18 14:45:15 +0800 CST
Go 开发中的热加载指南
2024-11-18 23:01:27 +0800 CST
软件定制开发流程
2024-11-19 05:52:28 +0800 CST
程序员茄子在线接单