装 NixOS 通常要做安装 U 盘,进安装环境,手动分区,手动装。云主机更麻烦,很多厂商没有 NixOS 镜像,只给 Debian、Ubuntu。
nixos-anywhere 解决的就是这件事。只要一台机器能 SSH 登录,它就能远程把机器上的 Linux 换成 NixOS。不用 U 盘,不用控制台,不用厂商支持。
它怎么做到的
靠的是 Linux 的 kexec。kexec 能跳过硬件重启,直接把内存里正在跑的内核换成另一个。nixos-anywhere 用它做四步:
- SSH 登进目标机器,下载一个很小的 NixOS 安装环境,用 kexec 切换过去。原来的系统被踢出内存,机器现在跑在一个纯内存的 NixOS 安装盘里。
- 按你写的分区文件给硬盘分区、格式化、挂载。这一步交给 disko 做,disko 是一个用配置文件描述磁盘布局的工具。
- 把你定义好的 NixOS 系统传到机器上,装进硬盘。
- 重启。机器起来就是 NixOS。
要准备什么
本机:
- 装了 Nix,开了 flakes
- 一个 flake,里面定义了目标机器的 NixOS 配置
- 一个 disko 分区文件
目标机器:
- 跑着任意 Linux,x86_64 或 aarch64
- 能用 root 或免密 sudo 的用户 SSH 登录
- 内存 1GB 以上,安装环境要在内存里跑
- 支持 kexec。多数虚拟机和物理机都支持,OpenVZ、LXC 这类容器不支持
一个完整的例子
flake.nix: