5 月初的时候我在 v2ex, reddit, twitter, 0xffff.one 等渠道分享过一份当时写的 NixOS 新手笔记。相关的部分帖子如下:
https://www.reddit.com/r/NixOS/comments/13dxw9d/nixos_nix_flakes_a_guide_for_beginners/
https://0xffff.one/d/1521-nixos-yu-nix-flakes-xin-shou-ru-men
这篇笔记在我一个多月来的持续更新下有了中英双语,在 Reddit 上收到了许多感谢,内容也膨胀到了两万多字,被人吐槽文章太长,不适合当成一篇文章看待。
除此之外也收到了一些批评,主要原因是我表述比较随意,确实可能会误导新人。 为了解决这些问题,我优化了一波内容,并且专门整了个文档站,也更方便大家帮助完善它。
也再次在这里将最新的站点分享给对 NixOS 感兴趣的朋友:
1
amber0317 2023-06-24 14:12:11 +08:00 1
感谢,反复入坑 nix 好几次了,一直苦于没有成体系的文档 = = 最近正好有点时间,按 OP 的教程捡起来再试一次
|
2
wtl 2023-06-24 14:58:26 +08:00 1
点赞
|
3
lairdnote 2023-06-24 15:21:04 +08:00 1
不錯。。我測試 nixos 的時候好像看過這個文檔
|
4
vitovan 2023-06-24 17:42:48 +08:00 1
有人说 Flakes 的出现把 NixOS 搞成了 Python 2 和 Python 3 ,我感到非常担忧,于是仍处于观望阶段。
|
5
darksword21 2023-06-24 18:10:34 +08:00 via iPhone 1
太好了!
|
6
zzzsy 2023-06-24 19:00:33 +08:00 1
|
7
ryan4yin OP @vitovan Flakes 跟 Python3 一样,确实都是不兼容变更,但是 NixOS 社区很喜欢 Flakes ,实际上拒官方调查,目前已经有超过半数的用户在使用 Flakes ,GitHub 上创建的新 Nix 包也大多数都是 Flakes.
从这个方面讲,Flakes 的推广要比 Python3 成功非常多,要知道 Flakes 至今都还是实验性特性,官方文档中甚至极少包含 Flakes 相关的文档,这么“艰苦”的条件下就已经获得了如此广泛的响应,可见整个社区都是非常欢迎它的。 所以如果你是担心 Flakes 推出后,社区生态跟不上的话,我觉得你完全可以打消这个顾虑。 |
8
Pangurban 2023-06-24 22:01:19 +08:00 1
太赞了,LZ 的文章帮我克服了恐惧~
|
9
IndieCreator 2023-06-25 08:51:50 +08:00
break change 的软件都是垃圾
|
10
tywtyw2002 2023-07-09 11:25:23 +08:00 1
NIX 最大的坑就是什么东西都叫 NIX ,网上很大一部分的 Q&A/文档/BLOG 的标题都是 NIX 如何做 xxxx ,省略了 NIX 什么如何做 XXX ,其实 NIX 是一个错综复杂的系统。(就类似于说 Debian 系统,下面的 apt 也 Debian Package ,cloud-init 叫 Debian XXX 一样,大家最后都简写成了 Debian 一样。)
## NIX VANILLA VS NIX FLAKE 如果按照 FLAKE 对 NIX 进行版本分割,那么总体来说,FLAKE 之前的 NIX 可以叫 NIX VANILLA ,后面叫 NIX FLAKE 。 - NIX Commands 中,用`-`在分割的(`nix-build`, `nix-env`。。。)是 NIX VANILLA 的命令。 - NIX Commands 中,用`空格`在分割的(`nix build`, `nix store`。。。)是 NIX FLAKE 的命令。 然后一个坑就是做一件事情,可以用 n 中方式去实现(可为条条大路通罗马),但是如果你做事情`A`用了一种方式`X`,然后去做事情`B`要用其他方式(非`X`),那么就有可能冲突了。 Note:网上看 NIX 的文章,如果`command`是用`空格`分割的,那么就是 NIX FLAKE 时代的东西了。 ## NIXPKGS VS NIXOS 这个也是个大坑,不过没有那么的坑。 - `NIXPKGS` 是个包管理系统,类似于`debian`的`apt`,在任何`NIXPKGS`支持的系统都可以安装`NIX`( NIXPKGS 包管理器,但是命令是`nix`。。。。坑) - 在 VANILLA 时代用`nix-env`去装,FLAKE 时代用`nix profile`去装,他们的结果是一样的,就是安装完,可以直接用软件了,但是问题是他们安装的方式不同,支不支持回滚。(具体不展开说了) - `NIXPKGS`使用了`NIX`语言去描述这个包如何编译,如何安装。 - `NIXPKGS`中有个叫`nix channel`的东西,在这里定义了`NIXPKGS`中都包括了那些软件包,和这些软件包的版本。 - `NIXOS`就是默认集成了`NIXPKGS`的系统,并且内核(?)和 init 是经过 nix patch 过的。 - 在`nixos`中你可以用上面提到的那种方式,使用`nix-env`或者`nix profile`去装软件,但是这样就失去了,`nixos`最核心的功能,用 config file 定制系统(类似于`ansible playbook`/`saltstack`)。 - `nixos`中比较核心的概念是`nixos-rebuild`了,`nixos`中你写一个系统 config 文件`/etc/nixos/configuration.nix`,然后就可以用`nixos-rebuild switch`去把系统修改成了你所定制的样子。当然,你也可以向其他软件 config 一样,去指定 config 文件的位置。(`nixos`也支持回滚之类的骚操作) - `nixos`的 config (`/etc/nixos/configuration.nix`)的语言也是`nix`,内容是`nixos options`。。。。 ## FLAKE 挖坑 |
11
ryan4yin OP @tywtyw2002 确实,官方没有文档明确说清楚了 Nix, NixOS, Nixpkgs, 以及新旧 CLI 之间的关系。
|
12
tywtyw2002 2023-07-10 00:28:05 +08:00 via iPhone 1
@ryan4yin nixpkgs 的官方文档基本上都是渣渣。就类似于想看下 mkderivation 支持什么 arg ,每个 arg 什么意思,不如直接去读源码。
|
13
ZedRover 2023-07-12 17:51:08 +08:00
老哥能不能讲一下如何根据 github 上的 nix-config 从 0 部署一台机器捏,看到 modules overlays hosts 什么的文件夹感觉有点无从下手
|
14
ryan4yin OP @ZedRover 大多数人的 nix-config 仓库 README 都写得挺清楚的,最简单直观的方法是:
1. 首先用官方 ISO 镜像安装好一台 NixOS 主机,图形化操作跟 Ubuntu 之类的其他发行版没啥区别。你要是熟悉命令行也可以用命令行。 2. 安装完进入新系统后,先修改 /etc/nixos/configuration.nix 安装 git 3. 用 git clone 一个 nix-config 仓库到这台新主机上,然后执行 `sudo nixos-rebuild switch --flake .#hostname`. 部署命令中的 hostname 是用于选择配置的,比如我的 nix-config 目前包含了 5 台机器的配置,通过该参数就选择其中之一进行部署。 完毕,就这三步。 |
16
ryan4yin OP @ZedRover 不知道你搞定没,最近意识到 nix-config 配置根据用户的使用情况,复用流程可能没我前面描述的这么简单。
可能存在的问题会有: 1. 用户有依赖一些私有数据 比如我的 nix-config 仓库现在就依赖了一个我自己的私有仓库,用于存放一些敏感信息。 2. |
17
ryan4yin OP 额不小心发出去了,我继续补充下。
1. 或者用户会需要依赖私有密钥解密一些由 sops/age 加密的信息,你没有这个密钥,就得先从代码中剔除掉对应的内容。 2. 用户在长期使用过程中,可能未严格确保环境的可复现能力,比如偶然地依赖了自己现有环境中的某些数据,这会导致在新机器上复现环境时报错,需要手动解决。 3. 每台机器都会具有不同的硬件信息,比如自动生成的 hardware-configuration.nix 通常就是跟硬件相关的。此外有的用户还开了 Nvidia 显卡,如果你没有这个显卡那直接部署也会失败。 总之确实会存在一些这样不够理想的情况,因此一般还是不建议直接部署别人的公开配置,最好还是只摘抄自己需要的部分。 |