为什么我要学习nix

还记得大学开学拿到自己第一台笔记本电脑时候,当时兴高采烈的打算装上visual studio开始探索计算机世界,但反反复复失败之后,我最后决定把windows干掉安装linux。 接下来,一台笔记本,一个Linux系统的配置就伴随了我整个大学时光。

当然,在使用期间免不了喜欢配置各种桌面系统、探索各种命令行软件、重装各种发行版。常见的比如ubuntu、fedora、archlinux、opensuse、Elementary OS,还有少见一点的例如Qubes OS、clear os、fedora silverblue,可以说各式各样的发行版都玩过一遍。

整个过程下来,我逐渐感受到,不同发行版之间的区别,无非也就是包管理的区别和其中维护的包集合数量/质量之间的区别。

然而在当时尝试的众多发行版中,有这样一个发行版,每次都让我望而却步,却又充满了好奇,那就是nixos。nixos很不一样,他用的nix包管理与其说是一个包管理,不如说是一个终极的构建工具,而nixos恰好是nix打出来的一种产物而已。

虽然现在nix的github主页的介绍中写着"Nix, the purely functional package manager",不过我觉得这个介绍可能过于狭隘,最开始Eelco Dolstra的论文题目是"The Purely Functional Software Deployment Model",两个表述之间,孰强孰弱立马见分晓。

不过就像我前面所说,当时我只是知道有这么一个神奇的发行版,使用非FHS的目录结构,其他什么“可重现”,“原子升级”,“声明式”之类词汇虽然挺起来高大上,但是这和我又有什么关系呢?毕竟这是一个正常ELF文件都没办法在上面跑的操作系统。

若干年后,在我经历了各种交叉编译、静态链接、各种操作系统适配问题、容器镜像构建问题之后,我一步一步的走向nix。并且笃定的认为nix正在成为计算机领域的下一代构建技术,并且将会杀死发行版这个概念。

对于我来说,学习nix的过程从来不是容易的。在2018年左右,我第一次尝试安装nixos,当时觉得自己连archlinux安装都没什么问题,无非也就是照着官网的文档一步一步来,但很快我就发现,在nixos中似乎常规的linux技巧都失效了,一切都被一个巨大的配置文档所支配,我完全无法理解背后到底发生了什么。

后来,尝试去读nix pills文档,读Eelco Dolstra的论文,尝试理解nix的基本概念,但也一知半解。再后来nix推出了flake,虽然我一向喜欢一些高概念的事物,但是nix相关的概念之复杂,最开始真的让我无从下手。然而这一切直到我开始阅读nixpkgs代码,以及一点一点开始编写nix代码之后才缓解,终于能将各种基本概念映射到实际了。

而这个系列(如果顺利的话),将介绍nix的一些基本概念,后续可能还会加上一些基本的使用场景和使用技巧,帮助还没有接触nix或者已经接触nix但对其原理还不太清楚的人更快的进入nix的领域。我希望通过这个系列文章能够让你认识到nix的本质,或者说让你更接近nix的本质,而不是被表面上眼花缭乱的封装搞得晕头转向,就像我最开始了解nix时的那样。