不可变文件系统、无状态、声明式配置,是 Linux 发行版的未来么?

2023-07-06 14:22:50 +08:00
 ryan4yin

不知道是不是因为我自己最近一直在折腾 NixOS ,还写了点 NixOS 的入门教程,发觉 V 站上有越来越多的人在推荐 NixOS 、SliverBlue 等比较有特点的发行版 。比如说前两天这个帖子:

https://www.v2ex.com/t/953897#reply81

SliverBlue 感觉是个很新的发行版,而 NixOS 虽然不新,但确实是在最近几年听得越来越多。

结合 Docker/Kubernetes/Terraform 这样的容器即代码、声明式集群管理系统、声明式配置工具的发展趋势,就感觉 Linux 现在的发展也有点切合这个趋势。

也跟人讨论过这个问题,朋友感慨为什么 2023 年了大家才发现声明式配置、不可变系统的好处... 也有一些 NixOS 用户疑惑,为什么 NixOS 用户群现在才这么点,Flakes 咋到现在还是个实验特性,感觉很不应该...

4805 次点击
所在节点    Linux
33 条回复
ryan4yin
2023-07-07 14:34:24 +08:00
@lucifer9 #19 单纯从 dotfiles 管理的角度看,我也觉得没啥区别。
但是 NixOS 作为一个 OS ,它的配置显然不仅仅只能管 dotfiles ,它的配置文件可以管理整个操作系统的大部分状态。
ryan4yin
2023-07-07 14:39:32 +08:00
@lucifer9 #19 哦漏了一点,你用系统自动快照来管理系统状态。

这里的区别在于,系统快照的内容是不可复现的,快照内容不包含如何从零构建这个快照的「知识」,是不可解释的。

而 NixOS 的配置是一份从零构建出一个一模一样的 OS 的「知识」,是可解释的,而且可以通过简单几行命令就自动完成这个构建。NixOS 配置本身既是一份记录你的 OS 都做过哪些变更的文档,也是用于自动构建出这个 OS 的配置。
ryan4yin
2023-07-07 14:46:08 +08:00
接前文 #22 ,NixOS 有这么一份可解释的、声明式的「知识」的好处在于:

1. 对系统做任何修改都很方便、安全、干净
2. 可以很方便地分享给别人,其他人也能通过简单的配置内容审查,确定你的配置是无害的
lucifer9
2023-07-07 15:19:30 +08:00
@ryan4yin 快照是滚挂了有个后悔药,方便修复。不是跟 NixOS 那样同步每一次配置更改的。
配置文件不止是 dotfiles 。自己安装新软件,改动配置,测试成功以后都会提交一下 git 的。历史就在 git 里面。
需要重新构建的话,我这边从格盘,分区,安装所有软件包,复原相应的配置文件都有脚本的,需要恢复到哪一步 checkout 相应的 commit 就行的。
ryan4yin
2023-07-07 15:57:25 +08:00
@lucifer9 理解,你自己写脚本安装软件、恢复配置文件,恢复整个环境,当然也完全可行,毕竟很多运维都是这么干的。
huangmingyou
2023-07-07 16:07:05 +08:00
我用 ansible 维护桌面环境,遇到要重做新系统,就跑一下 ansible 搞定。
huangmingyou
2023-07-07 16:11:01 +08:00
看了一下 op 的 nixos 的说明文档,感觉这系统违反了 unix 哲学。明明很简单的事情搞的很复杂。各个层次也搞的很混乱。比如可以用 puppet,ansible 来维护系统状态,可以用 lvm snapshot 来维护数据状态。偏偏都要搅和到一起。
ryan4yin
2023-07-07 16:18:46 +08:00
@huangmingyou NixOS 只负责维护系统状态,数据状态还是需要 lvm snapshot 来维护。
chengleqi
2023-07-07 17:47:33 +08:00
@ryan4yin 感谢详细的回答,受教了
ryan4yin
2023-07-07 18:32:02 +08:00
@lucifer9 @huangmingyou #24 #28 我一起回复下吧,用传统 Linux 发行版、脚本或者 ansible 等工具,当然都能实现同样的功能,毕竟这么多年业界都是这么用的。

而 NixOS / Fedora SilverBlue / Android 以及其他类似的发行版,它们或多或少拥有的,比这些传统方法更有优势的特性就在于本文的标题:

不可变文件系统、无状态、声明式配置

如果各位有用过帖子前面提过的 Docker/Kubernetes/Terraform/Pulumi 这些现代化运维工具,应该会比较能理解这一点。
ryan4yin
2023-07-07 18:48:20 +08:00
@lucifer9 @huangmingyou 如果单纯说 NixOS 跟自己写脚本以及用 Ansible 、Dockerfile 的区别,我暂时想到的是,NixOS 把环境的「可复现性」提升了一个级别,另外它的「声明式配置」也是前面几种方法所没有的。

先说下「可复现性」,Ansible 、Dockerfile 、自己写脚本,实质上都存在不可复现的安全隐患。
比如说你会用 `apt install curl` 来安装一个 curl 包,用 `pip isntall xxx` 安装一个 python 包,一个月前在 ubuntu 20.04 上跑它,跟现在跑它,下载到的包版本是可能会更新的。这通常不会导致啥问题,但是一旦出现不兼容变更的更新,那麻烦就大了。
而 NixOS 的 Flakes 功能,跟 go.sum/package-json.lock/cargo.lock/poetry.lock 一样,不需要手动做任何配置,它默认就会通过 hash 值、git commit 等手段完全锁定所有依赖包的版本号与 hash id ,这就极大地提升了环境的可复现性。

再说「声明式配置」,声明式配置工具将底层的复杂操作全部封装在了它内部,只给用户提供了简洁且必要的声明式参数。我想用过 terraform/kubernetes 的人都应该能体会到它的好处,通过改几行配置,就可以简单地更换系统的各种组件,或者直接创建并配置好一整套包含 k8s/mysql/redis 在内的云上微服务系统。如果自己写脚本或者用 ansible 去做,那这会是个大工程,要达到众多贡献者维护的 terraform 等工具的稳定性,更不知道要花多少精力。
Chobits
2023-10-11 00:09:36 +08:00
个人感觉,NixOS 的问题是官方文档很有限还很分散,如果遇到特殊需求了需要自己打包,就得去翻源码;官方的 cache 在国内不能访问,国内的镜像 cache 又不完整,光是安装就很看脸。至于 flake 、home-manager 等实验特性,文档嘛,呵呵。

想装个 virtualbox ,直接是一堆报错,还不说明是哪里的问题。

NixOS 比 Ubuntu 的发表时间还长,20 多年了还没流行开,主因还是自身问题太多了。
ryan4yin
2023-10-11 10:05:12 +08:00
@Chobits 是这么回事,导致 NixOS 小众的问题很多都来自它自身,文档跟社区自身问题都很大。
至于国内网络,这个确实...没梯子的话会很麻烦。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/954572

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX