首页
/ NixOS远程机器部署实战教程:使用nixos-anywhere和disko

NixOS远程机器部署实战教程:使用nixos-anywhere和disko

2025-07-10 03:06:15作者:冯爽妲Honey

前言

在现代基础设施管理中,远程部署操作系统配置是一项关键技能。NixOS社区提供的工具链使这一过程变得异常简单和可靠。本教程将详细介绍如何使用nixos-anywhere和disko工具在运行的Linux系统上远程部署NixOS配置。

技术背景

NixOS是一个基于Nix包管理器的Linux发行版,其独特的声明式配置管理方式使得系统部署和复制变得极为高效。nixos-anywhere和disko是NixOS生态中的两个重要工具:

  • nixos-anywhere:允许在任何运行的Linux系统上远程安装NixOS
  • disko:提供声明式的磁盘分区和文件系统配置

这两个工具的结合使用,可以实现完全自动化的远程系统部署。

准备工作

环境要求

目标机器需要满足以下条件

  • 运行Linux的QEMU虚拟机或物理机
  • 支持kexec快速重启机制
  • x86-64或aarch64架构
  • 至少1GB内存
  • 通过DHCP自动配置IP地址
  • 可通过SSH访问(推荐使用公钥认证)

本地机器需要

  • 可用的Nix安装

项目初始化

首先创建项目目录并初始化环境:

mkdir remote-deployment
cd remote-deployment
nix-shell -p npins

初始化依赖管理并添加必要的工具:

npins init
npins add nix-community/disko
npins add nix-community/nixos-anywhere

创建shell.nix文件定义开发环境:

let
  sources = import ./npins;
  pkgs = import sources.nixpkgs {};
in

pkgs.mkShell {
  nativeBuildInputs = with pkgs; [
    npins
    nixos-anywhere
    nixos-rebuild
  ];
  shellHook = ''
    export NIX_PATH="nixpkgs=${sources.nixpkgs}:nixos-config=$PWD/configuration.nix"
  '';
}

配置NixOS系统

磁盘布局配置

创建single-disk-layout.nix文件定义磁盘分区方案:

{ ... }:

{
  disko.devices.disk.main = {
    type = "disk";
    content = {
      type = "gpt";
      partitions = {
        MBR = {
          priority = 0;
          size = "1M";
          type = "EF02";
        };
        ESP = {
          priority = 1;
          size = "500M";
          type = "EF00";
          content = {
            type = "filesystem";
            format = "vfat";
            mountpoint = "/boot";
          };
        };
        root = {
          priority = 2;
          size = "100%";
          content = {
            type = "filesystem";
            format = "ext4";
            mountpoint = "/";
          };
        };
      };
    };
  };
}

这个配置定义了一个包含MBR、EFI系统分区和根分区的磁盘布局,兼容BIOS和UEFI系统。

系统主配置

创建configuration.nix文件:

{ modulesPath, ... }:

let
  diskDevice = "/dev/sda";  # 根据实际情况修改
  sources = import ./npins;
in
{
  imports = [
    (modulesPath + "/profiles/qemu-guest.nix")
    (sources.disko + "/module.nix")
    ./single-disk-layout.nix
  ];

  disko.devices.disk.main.device = diskDevice;

  boot.loader.grub = {
    devices = [ diskDevice ];
    efiSupport = true;
    efiInstallAsRemovable = true;
  };

  services.openssh.enable = true;

  users.users.root.openssh.authorizedKeys.keys = [
    "ssh-rsa AAAAB3NzaC1yc2E..."  # 替换为你的SSH公钥
  ];

  system.stateVersion = "24.11";
}

关键配置说明:

  1. diskDevice指定目标磁盘设备
  2. 导入disko模块和磁盘布局配置
  3. 配置GRUB引导加载器
  4. 启用SSH服务并设置root用户的SSH公钥

部署流程

验证配置

在部署前验证磁盘布局配置:

nix-build -E "((import <nixpkgs> {}).nixos [ ./configuration.nix ]).installTest"

这个命令会在虚拟环境中测试完整的安装过程。

执行远程部署

使用以下命令进行远程部署:

toplevel=$(nixos-rebuild build --no-flake)
diskoScript=$(nix-build -E "((import <nixpkgs> {}).nixos [ ./configuration.nix ]).diskoScript")
nixos-anywhere --store-paths "$diskoScript" "$toplevel" root@target-host

部署过程会:

  1. 登录目标机器
  2. 执行磁盘分区和格式化
  3. 安装NixOS配置
  4. 自动重启系统

如果使用密码认证,可以设置环境变量:

export SSH_PASS="yourpassword"
nixos-anywhere --env-password --store-paths "$diskoScript" "$toplevel" root@target-host

系统更新

部署完成后,更新系统配置非常简单:

npins update nixpkgs
nixos-rebuild switch --no-flake --target-host root@target-host

高级主题

自定义磁盘布局

disko支持多种复杂的磁盘布局场景,包括:

  • 多磁盘配置
  • RAID阵列
  • LVM逻辑卷管理
  • 加密分区

可以参考disko项目提供的示例配置进行扩展。

生产环境建议

在生产环境中部署时,建议:

  1. 先在测试环境验证配置
  2. 使用更细粒度的分区方案
  3. 考虑添加交换分区
  4. 实现配置的版本控制
  5. 设置监控和回滚机制

总结

本教程详细介绍了使用NixOS工具链实现远程系统部署的全流程。这种方法的优势在于:

  • 完全声明式的配置管理
  • 可重复的部署过程
  • 支持复杂的磁盘布局
  • 简化了系统更新和维护

通过掌握这些技术,你可以实现基础设施的代码化管理,大大提高系统部署的效率和可靠性。