从零开始的 NixOS 体验
2026/3/16
我已经将手上大部分服务器迁移到了 NixOS。NixOS 是一个以 Nix 配置文件为中心的 Linux 发行版,主要卖点是声明式的系统管理,用户只需要通过某些配置声明好期望的环境状态,然后 Nix 包管理器就会负责达成这个目标。
然而,NixOS 有不算低的使用门槛,其使用思路与传统的 Linux 发行版有很大的区别。因此,我决定写一篇文章来记录我从零开始安装和配置 NixOS,并最终将手上大部分服务器迁移到 NixOS 后的一些使用体验。
为什么是 NixOS?
不知道在座的各位现在手上有多少 Linux 环境呢?对我来说早已超出一只手可以数的过来的数目了。就算排除掉 Proxmox VE、OpenWRT、RouterOS 这种基于 Linux 深度定制、高度专用化的发行版,我的环境也包括了:
- 家里 Proxmox VE 上的 Linux 虚拟机
- 分布在不同云服务商的 4 台云服务器
- 主力笔记本上的 WSL2 环境
而在这些环境之间,有许多共通配置,比如 SSH 端口/密钥配置、防火墙配置等。之前,我一般会在初始化每个环境时,手动配置这些共通配置。
然而,随着我使用的愈发深入,我对环境配置的复杂度也越来越高。最开始,我只需要修改 root 用户密码、创建并配置自己的普通用户、配置好 SSH 端口/密钥、设置防火墙只开放 SSH 和 HTTP/HTTPS 服务端口、使用一键脚本安装一些常用软件(比如 Nginx、MySQL、PostgreSQL 等)。而现在,我还需要逐一配置各种 Prometheus Exporter、Docker Network 等等。以上流程至少会花去我 1-2h/每台服务器,而且由于这个流程完全依赖我的手动进行,我每次都需要担心“我是不是遗漏了哪一步”。
在很久之前,我阅读了 Axton 写的 更新到下一代服务器架构 这篇文章。文章中介绍了 ta 通过自己编写、构建了一套结合了 Docker 等技术的服务器集群管理架构。当时属实令我眼馋了一把。其中我最希望,也是当时最有可能落地的是 Setup.sh,一套可以快速在新的服务器环境下进行无人值守的、快速的环境部署的脚本。
然而,由于我当时的技术力低下,我试图自己实现的 Setup.sh 脚本,在完成度达到最低可用限度前,就堆成了一套史山。因此,我就这么放弃了这套方案,抱着“又不是不能用”的心态继续采用手动的方法维护我的服务器环境。
而 NixOS 解决了这个问题。
实际上,现在我要在一台新的服务器上快速初始化我的 NixOS 环境可以说轻而易举。我只要完成以下步骤即可:
- 先在服务器上引导到 NixOS Installer,完成分区、格式化、挂载等必要的操作后,使用
nixos-generate-config生成新的配置文件。 - 在这套配置文件的基础上修改,启用 git 和 Nix Flake 特性,复制进去我自己的个人用户信息(基本只要在默认配置文件的基础上改一下用户名)。
- 运行 nixos-install 进行安装,然后通过 nixos-enter 进入新系统。
- 生成 SSH 主机密钥和用户密钥,添加到 GitHub SSH Keys中,随后 clone 我的 NixOS 配置仓库,复制一份新的主机配置,修改一些必要的设置项(主要是
hardware-configuration.nix中关于分区挂载的配置),提交并 Switch 到新的配置,然后重启。
看起来很繁杂,实际上这其中大部分的工作都可以由 Nix 包管理器在无人值守的条件下自主完成。
同时,这还带来了一个额外的好处:
之前的模式里,我对服务器的配置是手动进行的。这就代表,服务器当前的状态对我来说是“不可知”的。如果我想要进行迁移或者重装,就要凭印象手动遍历整个服务器环境,找到所有的配置文件、脚本、服务、容器。
而使用 NixOS,我对系统的所有修改都记录在 NixOS 配置仓库中。这就代表,我可以随时查看、回溯、恢复任何之前的系统状态,在不同的服务器之间迁移也变得极为轻松。
当然,由于 NixOS 不负责管理应用生产的数据,因此这部分数据我还是需要手动备份和迁移的。
综上所述,NixOS 看上去是一个能解决我面临问题的选择。因此我决定将手上大部分服务器迁移到 NixOS。
安装 NixOS
NixOS 的安装并不复杂。如果你是 Arch Linux 用户,那你一定会觉得非常亲切。
具体来说,如果要从零开始安装 NixOS,你需要以下几步:
引导 NixOS Installer
说来好笑,这步反而是我花最多时间的。
- 理论上,最简单的方法是直接挂在官方的 NixOS Installer ISO 到服务器上,然后引导到 Installer 环境。(需要注意不要选成 noninteractive 的!)
- 如果你的服务器厂商不给你挂载自定义 ISO,那你可以尝试使用 NixOS 官方的 kexec Installer 进行安装——前提是你的服务器有 2GB 以上的物理内存。经过测试,如果物理内存小于 2G,那么 kexec Installer 会直接报错退出,根本进不去 Installer 环境。
- 如果以上两种方法都不能用,那就只能用 netboot.xyz 引导进入系统,通过远程 dd 的方法直接覆写一个 NixOS 系统到服务器上。
是的,这三种方法我都用过一遍了……
分区
先不提 WSL2(直接导入 NixOS-WSL 就行)和远程 dd 的安装方法(远程 dd 的是完整磁盘镜像,不太好调整分区了)。
分区本身不难,我参考了 NixOS-CN 社区的安装教程,采用了 Btrfs 文件系统,给 /、/var、/home 、/nix 分别创建了一个独立的子卷。
非常需要注意的是,NixOS 构建系统时需要消耗大量内存,因此建议配置至少 4GB(我配置了 8GB)的 Swap 分区 / Swapfile 并启用。
创建配置文件
在分区、挂载完成的情况下,运行 nixos-generate-config --root /mnt 即可生成新的配置文件。需要注意的是,如果你在挂载时指定了一些额外参数(比如 Btrfs 的压缩选项),那么在生成的配置文件中不会含有这些参数,需要手动在 /mnt/etc/nixos/hardware-configuration.nix 中添加。
接下来,就是修改 /mnt/etc/nixos/configuration.nix,配置即将安装的新系统了。
这里我建议是尽量少修改,只修改必要的配置项。比如,我只修改了用户名、时区、网络配置、Boot Loader 配置,并给新系统启用了 vim、git 软件包和 Nix Flake 特性。其他的配置项,我都直接使用默认值。
接下来,就是安装 NixOS 了。一行 nixos-install 就能完成工作。
安装完之后,需要用 nixos-enter 进入新系统。这时可以用 passwd 手动设置一下密码。
All in a Nix Configuration
安装好之后,我们就可以开始配置 NixOS 了。
NixOS 的配置文件全部由 Nix Lang 写成,这是一个函数式的编程语言,配置文件中定义了系统的所有属性和行为。
比如,如果我们要在系统中启用 OpenSSH 服务端,只需要在配置文件中添加以下内容:
services.openssh = {
enable = true;
openFirewall = true;
};保存之后,运行 sudo nixos-rebuild switch 即可应用新的配置。此时,Nix 包管理器会替你完成安装 OpenSSH 软件包、生成配置、启动服务、开放防火墙等一系列工作。
而要给用户添加 SSH 公钥,只需要在配置文件中添加以下内容:
users.users.allenyou = {
openssh.authorizedKeys.keys = [
"ssh-ed25519 <some-public-key> allenyou@lap-fallom"
];
};同样应用配置,你的用户就可以通过 SSH 密钥登录了。
软件打包,从入门到入土
虽然 NixOS 算是个比较小众的 Linux 发行版,但是它的软件包仓库 nixpkgs 有非常多的软件包可以直接引用,同时还有对应的 module(即在配置文件中可以方便引用的配置项)使用。
nixpkgs 的工作机制有点类似 AUR,本身只是一个保存了所有软件包打包脚本的 Git 仓库。每个软件包都有一个对应的 Nix 文件,定义了如何从源代码构建该软件包。安装时,会先根据该 Nix 文件计算出包的 Input Hash,然后在 Binary Cache 中查找有没有已经构建好的二进制包可以复用,没有的话就会在本地重新构建。
如果你要用的包不在 nixpkgs 里,你可以尝试找找有没有其他用户的 NUR 软件源包含了这个包,或者自己打一个。
这里就不再赘述了,详情请参考 Lan Tian 大佬的文章。
总结
经过简单的上手体验,我发现 NixOS 的确是个非常方便的 Linux 发行版。至少,它几乎完美地解决了我的几个主要痛点。
如果你已经对 Linux 有了一定了解,又希望以更声明式的方法管理系统,那么 NixOS 绝对是个不错的选择。
参考 & 推荐阅读:
- NixOS 官方文档:官方手册,不必多说。
- Nix 官方文档:Nix 包管理器的官方手册,包含了很多 Nix CLI / Nix Lang 的详细说明。
- NixOS Search:NixOS 软件包搜索,方便查找你需要的软件包或者配置项。
- NixOS and Flakes Book:由 Ryan Yin 大佬编写的 NixOS 与 Flakes 入门教程,包含了很多有用的经验。
- NixOS-CN 社区:有一些中文的安装教程和 Nix Lang 简要入门参考。
- Lan Tian 大佬的 NixOS 系列文章:由 Lan Tian 大佬编写的 NixOS 系列文章,包含了安装、软件打包和一些进阶话题。
加载评论中……