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";
}
关键配置说明:
diskDevice
指定目标磁盘设备- 导入disko模块和磁盘布局配置
- 配置GRUB引导加载器
- 启用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
部署过程会:
- 登录目标机器
- 执行磁盘分区和格式化
- 安装NixOS配置
- 自动重启系统
如果使用密码认证,可以设置环境变量:
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项目提供的示例配置进行扩展。
生产环境建议
在生产环境中部署时,建议:
- 先在测试环境验证配置
- 使用更细粒度的分区方案
- 考虑添加交换分区
- 实现配置的版本控制
- 设置监控和回滚机制
总结
本教程详细介绍了使用NixOS工具链实现远程系统部署的全流程。这种方法的优势在于:
- 完全声明式的配置管理
- 可重复的部署过程
- 支持复杂的磁盘布局
- 简化了系统更新和维护
通过掌握这些技术,你可以实现基础设施的代码化管理,大大提高系统部署的效率和可靠性。