最近尝试了一下 NixOS,觉得它的设计理念很新奇,很适合我,二话不说就把电脑刷成了 NixOS,用了一小段时间,给各位介绍一下大致。
先贴出屏幕截图:
Disclaimer : 不要随便刷系统,尤其是在电脑上有数据的时候!!
Nix 的设计架构是什么?
Nix,而不是 NixOS(确切地说,是先有 Nix 再有 NixOS)的架构和大多数软件包管理器(如 apt,packman 等)的不同在于它是声明式,函数式的,下面解释一下。
这是维基百科函数(Function)的定义(译自繁中页面,请以原文为准):
粗略地说,从集合 到集合 的函数将 的每一个元素恰好分配给 的每一个元素。集合 称作函数的定义域,集合 称作函数的值域。
那么它和 Nix 有什么关系呢?注意到函数的一个性质:每一个输入唯一确定地对应一个输出,也就是说,如果输入一致,输出应该也是始终一致的。
也就是说,我们如果让一个软件的历史版本不可变,那么它始终就是这样的,可以在任何相同的输入条件(如系统架构)下得到相同的输出(稳定运行的软件)。
还有一个很厉害的地方,设想有如下情况:
- 软件 A@1 依赖 B@1, C@2
- 软件 B@1 依赖 C@1
- 软件 C@1 和 C@2 互相冲突,不能同时安装。
那么软件 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.lock
和 yarn.lock
)软件的版本和更分布式地发布软件。整个 Nix 社区的绝大多数人十分喜爱 Flake,所以可以肯定 Flake 很大概率会稳定下来,成为稳定功能。
我应该从哪里开始?
可以先看看 Nix 的语言文档,基本了解一下这门语言的语法(这是一门用于描述打包/构建的语言,所以不难懂)。
然后从技术上来说,建议使用 Flake + Home-manager 用于用户层面的软件包管理,也是目前绝大多数人使用的方案。
因为 Flake 不是稳定功能,所以官方没有文档,只能在网上找,不过我强烈推荐这个站点,我认为可以说是互联网上最高质量的中文教程。
另外,不要害怕搜索他人的源代码,它们会对你有很大帮助,因为 NixOS 是可复现的,所以他人的配置文件大概率也可以在你这里跑起来。
(也可以看看我的配置。)
总之,Nix 只是个软件包管理器,软件配置都是独立于 Nix 的,后面会写关于各种可能能提高效率的软件的推荐。
如果有关于 Nix 的问题欢迎随时找我,我会尽量提供帮助的!