惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
J
Java Code Geeks
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
H
Hackread – Cybersecurity News, Data Breaches, AI and More
V
Visual Studio Blog
G
Google Developers Blog
V
V2EX
The Register - Security
The Register - Security
博客园 - 三生石上(FineUI控件)
云风的 BLOG
云风的 BLOG
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
博客园_首页
S
SegmentFault 最新的问题
博客园 - Franky
Martin Fowler
Martin Fowler
Stack Overflow Blog
Stack Overflow Blog
A
About on SuperTechFans
人人都是产品经理
人人都是产品经理
aimingoo的专栏
aimingoo的专栏
罗磊的独立博客
C
Check Point Blog
MyScale Blog
MyScale Blog
T
The Blog of Author Tim Ferriss
MongoDB | Blog
MongoDB | Blog
The GitHub Blog
The GitHub Blog
Last Week in AI
Last Week in AI
Microsoft Azure Blog
Microsoft Azure Blog
IT之家
IT之家
F
Fortinet All Blogs
Jina AI
Jina AI
P
Proofpoint News Feed
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
阮一峰的网络日志
阮一峰的网络日志
B
Blog
L
LangChain Blog
月光博客
月光博客
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
宝玉的分享
宝玉的分享
博客园 - 【当耐特】
T
Tailwind CSS Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Microsoft Security Blog
Microsoft Security Blog
WordPress大学
WordPress大学
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
B
Blog RSS Feed
博客园 - 聂微东
Hugging Face - Blog
Hugging Face - Blog
M
MIT News - Artificial intelligence
GbyAI
GbyAI

秋实-Allenyou 的小窝

【教程】使用 Keyd 将 Copilot 键映射为可用的组合键并修复触摸板防误触失效问题 机械革命无界 15X 的 Arch Linux 开荒指南 我在用什么?(2026 版) - 秋实-Allenyou 的小窝 关于 Next.js SSG 生成 RSS Feed 文件的另一思路 2025:迷茫中转向 - 秋实-Allenyou 的小窝 我在用什么?(2025 版) - 秋实-Allenyou 的小窝 【杂谈】关于 AIGC 的一些思考 - 秋实-Allenyou 的小窝 【记录】一种在主机通过 Docker 容器名解析容器 IP 的方法 【记录】如何在 Next.js 中优雅的调用 Matomo 统计 从信号与系统角度看 OI/XCPC 中的傅里叶变换运用 - 秋实-Allenyou 的小窝 【杂谈】答《博客作者呀,我想采访你这 9 个问题!》 - 秋实-Allenyou 的小窝 使用 Golang 重写 gh-proxy - 秋实-Allenyou 的小窝 FurryCTF 2024 寒假赛 调试窗口 题解 2024:“我”的大学生活 - 秋实-Allenyou 的小窝 【游记】CCPC 2024 重庆站尾杀记 - 秋实-Allenyou 的小窝 【游记】ICPC 2024 亚洲区域赛南京站打铁记 - 秋实-Allenyou 的小窝 【杂谈】这次 Furrygooo 结束后我的一些体验 - 秋实-Allenyou 的小窝 【教程】使用阿里云 OSS + CDN 加速 Gravatar 【记录】 一次罗技鼠标驱动冲突问题的排查经历 - 秋实-Allenyou 的小窝 【记录】我是如何用 Next.js 重构我的博客的 - 秋实-Allenyou 的小窝 【教程】如何用 Git 快速搭建简单的 CI - 秋实-Allenyou 的小窝 我的DN42 Peering信息 - 秋实-Allenyou 的小窝 【进度】博客重构计划 - 秋实-Allenyou 的小窝 这是一个正经的2023总结 - 秋实-Allenyou 的小窝 【题解】Luogu P9769 [HUSTFC 2023] 简单的加法乘法计算题 2023新年谜题总结 - 秋实-Allenyou 的小窝 【教程】浅谈Linux服务器的一些基础安全技巧 - 秋实-Allenyou 的小窝 Goodbye, 2022~ - 秋实-Allenyou 的小窝 【教程】使用 Docker 开服,优雅地隔离不同版本JDK - 秋实-Allenyou 的小窝 【旧文补档】2020年终总结 & 2021新年计划 - 秋实-Allenyou 的小窝 【旧文补档】写个脚本监控你的VPS SolusVM面板适用 - 秋实-Allenyou 的小窝 【旧文补档】建立自己的私人网盘!在CentOS VPS上安装NextCloud - 秋实-Allenyou 的小窝 【旧文补档】2019,再见!2020,你好! - 秋实-Allenyou 的小窝 【旧文补档】新一代USB来袭,一起捋一捋USB的“前世今生” - 秋实-Allenyou 的小窝 【旧文补档】矩阵学习笔记 - 秋实-Allenyou 的小窝
从零开始的 NixOS 体验 - 秋实-Allenyou 的小窝
2026-03-16 · via 秋实-Allenyou 的小窝

我已经将手上大部分服务器迁移到了 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 系列文章,包含了安装、软件打包和一些进阶话题。