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

将 NixOS 配置迁移到 Flakes

从已有配置建立 Flake 入口,分别完成检查、构建和激活。

所在专题Flakes:项目与依赖管理 ↗
约 5 分钟阅读开始阅读

"让你的配置‘现代且可移植’。" 手把手带你完成从传统的 /etc/nixos/configuration.nix 到 Flakes 的迁移。


第一步:创建项目目录#

创建一个专门存放配置的目录(比如 ~/nixos-config),千万不要直接在 /etc/nixos 目录下乱搞。

mkdir ~/nixos-config
cd ~/nixos-config
# 复制原有的硬件配置
cp /etc/nixos/hardware-configuration.nix .
# 复制原有的系统配置
cp /etc/nixos/configuration.nix .

第二步:编写 flake.nix#

在项目根目录创建 flake.nix。

{
  description = "我的 2026 版 NixOS 配置";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
  };

  outputs = { self, nixpkgs, ... }@inputs: {
    nixosConfigurations.my-host = nixpkgs.lib.nixosSystem {
      system = "x86_64-linux";
      # 传递参数给子模块
      specialArgs = { inherit inputs; };
      modules = [
        ./configuration.nix
      ];
    };
  };
}

第三步:调整 configuration.nix#

由于我们在 Flake 里使用了 nixpkgs.lib.nixosSystem,原本 configuration.nix 顶层的参数可能需要调整:

# 修改前:
# { config, pkgs, ... }:

# 修改后:
{ config, pkgs, inputs, ... }: {
  imports = [
    ./hardware-configuration.nix
  ];

  # 启用 Flakes 和新的 Nix CLI
  nix.settings.experimental-features = [ "nix-command" "flakes" ];

  # 其他配置项...
  system.stateVersion = "24.11"; # 示例初装版本;迁移时保留原值
}

第四步:构建并应用#

注意:在 Flake 模式下,当 Flake 通过本地 Git 工作树读取时,所引用的文件需要纳入 Git 跟踪(新文件可先 git add);显式 path: 来源的行为不同。先检查暂存内容,避免加入私钥和无关文件。

git init
git add flake.nix configuration.nix hardware-configuration.nix
nix flake check --no-build
nixos-rebuild dry-build --flake .#my-host
nixos-rebuild build --flake .#my-host
# 检查构建结果、恢复路径与变更后,手动激活:
sudo nixos-rebuild switch --flake .#my-host
  • .:表示当前目录。
  • #my-host:匹配 outputs.nixosConfigurations 中定义的名称。

迁移后的好处#

  • 不再依赖全局 Channel:系统版本完全由 flake.lock 决定。
  • 易于备份:只需要把这个目录推送到 GitHub。
  • 模块化:可以轻松拆分出 desktop.nix, user.nix 等子文件并在 configuration.nix 的 imports 里引用。

激活后的确认#

构建成功只能证明构建层。激活后仍需检查当前系统代际、服务状态与桌面行为,再继续集成 Home Manager。

参考与延伸

  1. Nix Flake 手册 ↗
  2. Nix flake update ↗
  3. Nix flake check ↗

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

沿专题继续阅读

Flakes:项目与依赖管理

  1. 01Flake 结构:inputs 与 outputs
  2. 02flake.lock 与可复现性
  3. 03Flake Utils 与项目模板
  4. 04外部 Flake 引用与协作
  5. 05将 NixOS 配置迁移到 Flakes
  6. 06Flakes 项目与依赖管理教程
  7. 07Flake 更新机制
  8. 08flake.lock 回退与手动编辑
CONTINUE READING / 下一篇Flakes 项目与依赖管理教程

从输入语法到多主机组织,完整梳理 Flake 命令和项目结构。