NixOS 与 Flakes | 一份非官方的新手指南

2023-06-24 13:55:48 +08:00
 ryan4yin

5 月初的时候我在 v2ex, reddit, twitter, 0xffff.one 等渠道分享过一份当时写的 NixOS 新手笔记。相关的部分帖子如下:

https://www.v2ex.com/t/938569

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 感兴趣的朋友:

https://nixos-and-flakes.thiscute.world/zh/

4537 次点击
所在节点    Linux
18 条回复
amber0317
2023-06-24 14:12:11 +08:00
感谢,反复入坑 nix 好几次了,一直苦于没有成体系的文档 = = 最近正好有点时间,按 OP 的教程捡起来再试一次
wtl
2023-06-24 14:58:26 +08:00
点赞
lairdnote
2023-06-24 15:21:04 +08:00
不錯。。我測試 nixos 的時候好像看過這個文檔
vitovan
2023-06-24 17:42:48 +08:00
有人说 Flakes 的出现把 NixOS 搞成了 Python 2 和 Python 3 ,我感到非常担忧,于是仍处于观望阶段。
darksword21
2023-06-24 18:10:34 +08:00
太好了!
zzzsy
2023-06-24 19:00:33 +08:00
ryan4yin
2023-06-24 20:11:41 +08:00
@vitovan Flakes 跟 Python3 一样,确实都是不兼容变更,但是 NixOS 社区很喜欢 Flakes ,实际上拒官方调查,目前已经有超过半数的用户在使用 Flakes ,GitHub 上创建的新 Nix 包也大多数都是 Flakes.

从这个方面讲,Flakes 的推广要比 Python3 成功非常多,要知道 Flakes 至今都还是实验性特性,官方文档中甚至极少包含 Flakes 相关的文档,这么“艰苦”的条件下就已经获得了如此广泛的响应,可见整个社区都是非常欢迎它的。

所以如果你是担心 Flakes 推出后,社区生态跟不上的话,我觉得你完全可以打消这个顾虑。
Pangurban
2023-06-24 22:01:19 +08:00
太赞了,LZ 的文章帮我克服了恐惧~
IndieCreator
2023-06-25 08:51:50 +08:00
break change 的软件都是垃圾
tywtyw2002
2023-07-09 11:25:23 +08:00
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
挖坑
ryan4yin
2023-07-09 17:13:40 +08:00
@tywtyw2002 确实,官方没有文档明确说清楚了 Nix, NixOS, Nixpkgs, 以及新旧 CLI 之间的关系。
tywtyw2002
2023-07-10 00:28:05 +08:00
@ryan4yin nixpkgs 的官方文档基本上都是渣渣。就类似于想看下 mkderivation 支持什么 arg ,每个 arg 什么意思,不如直接去读源码。
ZedRover
2023-07-12 17:51:08 +08:00
老哥能不能讲一下如何根据 github 上的 nix-config 从 0 部署一台机器捏,看到 modules overlays hosts 什么的文件夹感觉有点无从下手
ryan4yin
2023-07-12 19:47:57 +08:00
@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 台机器的配置,通过该参数就选择其中之一进行部署。

完毕,就这三步。
ZedRover
2023-07-12 20:09:12 +08:00
@ryan4yin 好滴 谢谢 op
ryan4yin
2023-07-24 19:37:09 +08:00
@ZedRover 不知道你搞定没,最近意识到 nix-config 配置根据用户的使用情况,复用流程可能没我前面描述的这么简单。

可能存在的问题会有:

1. 用户有依赖一些私有数据
比如我的 nix-config 仓库现在就依赖了一个我自己的私有仓库,用于存放一些敏感信息。
2.
ryan4yin
2023-07-24 19:41:54 +08:00
额不小心发出去了,我继续补充下。

1. 或者用户会需要依赖私有密钥解密一些由 sops/age 加密的信息,你没有这个密钥,就得先从代码中剔除掉对应的内容。
2. 用户在长期使用过程中,可能未严格确保环境的可复现能力,比如偶然地依赖了自己现有环境中的某些数据,这会导致在新机器上复现环境时报错,需要手动解决。
3. 每台机器都会具有不同的硬件信息,比如自动生成的 hardware-configuration.nix 通常就是跟硬件相关的。此外有的用户还开了 Nvidia 显卡,如果你没有这个显卡那直接部署也会失败。

总之确实会存在一些这样不够理想的情况,因此一般还是不建议直接部署别人的公开配置,最好还是只摘抄自己需要的部分。
ZedRover
2023-07-25 09:17:22 +08:00
@ryan4yin #17 确实看到了挺多针对机器的配置,我简单抄了几份只对我有用的.nix 文件构建的系统,虽然功能少一点但是配置文件对了确实能生成想要的系统配置

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/951190

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX