NixOS 与 Flakes | 一份非官方的新手指南 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
ryan4yin
V2EX    Linux

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

  •  5
     
  •   ryan4yin
    ryan4yin 2023-06-24 13:55:48 +08:00 5875 次点击
    这是一个创建于 840 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    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/

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

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

    所以如果你是担心 Flakes 推出后,社区生态跟不上的话,我觉得你完全可以打消这个顾虑。
    Pangurban
        8
    Pangurban  
       2023-06-24 22:01:19 +08:00   1
    太赞了,LZ 的文章帮我克服了恐惧~
    IndieCreator
        9
    IndieCreator  
       2023-06-25 08:51:50 +08:00
    break change 的软件都是垃圾
    tywtyw2002
        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
    挖坑
    ryan4yin
        11
    ryan4yin  
    OP
       2023-07-09 17:13:40 +08:00
    @tywtyw2002 确实,官方没有文档明确说清楚了 Nix, NixOS, Nixpkgs, 以及新旧 CLI 之间的关系。
    tywtyw2002
        12
    tywtyw2002  
       2023-07-10 00:28:05 +08:00 via iPhone   1
    @ryan4yin nixpkgs 的官方文档基本上都是渣渣。就类似于想看下 mkderivation 支持什么 arg ,每个 arg 什么意思,不如直接去读源码。
    ZedRover
        13
    ZedRover  
       2023-07-12 17:51:08 +08:00
    老哥能不能讲一下如何根据 github 上的 nix-config 从 0 部署一台机器捏,看到 modules overlays hosts 什么的文件夹感觉有点无从下手
    ryan4yin
        14
    ryan4yin  
    OP
       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
        15
    ZedRover  
       2023-07-12 20:09:12 +08:00 via iPhone
    @ryan4yin 好滴 谢谢 op
    ryan4yin
        16
    ryan4yin  
    OP
       2023-07-24 19:37:09 +08:00
    @ZedRover 不知道你搞定没,最近意识到 nix-config 配置根据用户的使用情况,复用流程可能没我前面描述的这么简单。

    可能存在的问题会有:

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

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

    总之确实会存在一些这样不够理想的情况,因此一般还是不建议直接部署别人的公开配置,最好还是只摘抄自己需要的部分。
    ZedRover
        18
    ZedRover  
       2023-07-25 09:17:22 +08:00   1
    @ryan4yin #17 确实看到了挺多针对机器的配置,我简单抄了几份只对我有用的.nix 文件构建的系统,虽然功能少一点但是配置文件对了确实能生成想要的系统配置
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5555 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 08:51 PVG 16:51 LAX 01:51 JFK 04:51
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86