V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
ryan4yin
V2EX  ›  Linux

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

  •  5
     
  •   ryan4yin ·
    ryan4yin · 309 天前 · 3832 次点击
    这是一个创建于 309 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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/

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

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

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

    可能存在的问题会有:

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

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

    总之确实会存在一些这样不够理想的情况,因此一般还是不建议直接部署别人的公开配置,最好还是只摘抄自己需要的部分。
    ZedRover
        18
    ZedRover  
       278 天前   ❤️ 1
    @ryan4yin #17 确实看到了挺多针对机器的配置,我简单抄了几份只对我有用的.nix 文件构建的系统,虽然功能少一点但是配置文件对了确实能生成想要的系统配置
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5369 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 09:25 · PVG 17:25 · LAX 02:25 · JFK 05:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.