Skip to content

NixOS——可精确复现的声明式系统上手

Posted on:2023年12月23日 at 00:16

最近尝试了一下 NixOS,觉得它的设计理念很新奇,很适合我,二话不说就把电脑刷成了 NixOS,用了一小段时间,给各位介绍一下大致。

先贴出屏幕截图:

screenshot

Disclaimer : 不要随便刷系统,尤其是在电脑上有数据的时候!!

Nix 的设计架构是什么?

Nix,而不是 NixOS(确切地说,是先有 Nix 再有 NixOS)的架构和大多数软件包管理器(如 apt,packman 等)的不同在于它是声明式,函数式的,下面解释一下。

这是维基百科函数(Function)的定义(译自繁中页面,请以原文为准):

粗略地说,从集合 XX 到集合 YY 的函数将 YY 的每一个元素恰好分配给 XX 的每一个元素。集合 XX 称作函数的定义域,集合 YY 称作函数的值域。

那么它和 Nix 有什么关系呢?注意到函数的一个性质:每一个输入唯一确定地对应一个输出,也就是说,如果输入一致,输出应该也是始终一致的。

也就是说,我们如果让一个软件的历史版本不可变,那么它始终就是这样的,可以在任何相同的输入条件(如系统架构)下得到相同的输出(稳定运行的软件)。

还有一个很厉害的地方,设想有如下情况:

那么软件 A 究竟能否成功安装呢?在 Nix 包管理器中,可以!如果一个软件有许多不同的版本,那么会被视作不同的软件,拥有着独立的存放路径(通常是 /nix/store/<software-sha256>-<software-name>-version),自然不存在冲突一说。

这一点在 NixOS 中有一个很强大的体现:我想要运行 Hello-world 这个软件包,而不想向系统里安装,那么我可以运行 nix-shell -p Hello-world,我就可以得到一个有这个软件的环境,退出之后仍然不会安装到系统中(确切地说,软件存在硬盘里,但是没有被添加到环境变量里,所以相当于没有安装)。

最后一个点:声明式,简单来说就是——你的系统,是你定义的样子。

也就是说,我可以用一个(或一组)配置文件,完全精确地控制系统中的软件状态(包括配置),自然也可以复现(回滚)。

关于回滚,NixOS 比较惊艳到我的一点是在修改系统配置文件并更新后,会在启动时弹出一个窗口让你选择从第几个系统版本启动,所以完全不用害怕把系统改炸,可以放心折腾,即使在实体机上。

Nix 大概就是这样,如果你想要学习,我建议从在其他发行版上安装 Nix 包管理器开始,有一定了解之后再使用 NixOS。

还有一点比较困惑初学者:Flake 是什么?这是一个实验性的功能,用于更精确地锁定(flake.lock 类似于 packages.lockyarn.lock)软件的版本和更分布式地发布软件。整个 Nix 社区的绝大多数人十分喜爱 Flake,所以可以肯定 Flake 很大概率会稳定下来,成为稳定功能。

我应该从哪里开始?

可以先看看 Nix 的语言文档,基本了解一下这门语言的语法(这是一门用于描述打包/构建的语言,所以不难懂)。

然后从技术上来说,建议使用 Flake + Home-manager 用于用户层面的软件包管理,也是目前绝大多数人使用的方案。

因为 Flake 不是稳定功能,所以官方没有文档,只能在网上找,不过我强烈推荐这个站点,我认为可以说是互联网上最高质量的中文教程。

另外,不要害怕搜索他人的源代码,它们会对你有很大帮助,因为 NixOS 是可复现的,所以他人的配置文件大概率也可以在你这里跑起来。

(也可以看看我的配置。)

总之,Nix 只是个软件包管理器,软件配置都是独立于 Nix 的,后面会写关于各种可能能提高效率的软件的推荐。

如果有关于 Nix 的问题欢迎随时找我,我会尽量提供帮助的!



在 Rickyxrc's blog 出现的文章,若无特殊注明,均采用 CC BY-NC-SA 4.0 协议共享,也就是转载时需要注明本文章的地址,并且引用本文章的文章也要使用相同的方式共享。