这两者都是比较出名的 immutable distro ,都提供原子化的更新,版本回退。有没有人详细说明一下两者在实现方式的区别和优缺点?
目前只对 Silverblue 有过了解。所以说说我知道的,Silverblue 利用的是 ostree/rpm-ostree 管理系统的。Silverblue 每次更新系统时,是从服务端拉取一个 base image ,然后基于这个 base image 再把额外安装的包(官方术语为 layered package )安装上去,并且成为一个快照。系统保留至少两个快照,因此总是存在一个可用的快照版本可以回退过去。由于每次更新都会从服务端拉去一个 base image ,这种做法相当于结合了 image based 更新和传统基于包管理器的更新方式,使得客户端和服务端的状态能保持一致。并且由于 ostree 是 content-addressable 的,重复的文件不会多占用空间。
对 NixOS 了解不是很多。只知道 nixos 提供了不同的 namespace ,因此可以同时安装多个版本的包,不过不知道具体实现是如何的?如果不同的 namespace 之间相互有重复的文件,是否占用双倍的空间?
1
ryan4yin 44 天前 via Android
nixos 是基于 nix 包管理器构建的,而 nix 包管理器的设计哲学是用管理编程语言依赖包的方式来管理系统软件包。
你用过 nodejs java python 的话 |
2
ryan4yin 44 天前 via Android
(不小心发出去了,继续)应该知道,编程语言的包都是中心化存储在 ~/.m2 node_modules ~/go 里面的,而且不同的软件包能够共存(请忽略掉 python...)。
nix 同样如此,所有软件包都存在 /nix/store 里面,而且不同版本 |
3
ryan4yin 44 天前 via Android
而且每个软件的不同版本都保存在不同的文件夹中,从而能够在 /nix/store 中共存...
大概是这样 |
4
ryan4yin 44 天前 via Android
nix 没有 namespace 这种东西,但有个 profile.
profile 的实现逻辑是,所有包都是从 /nix/store 中引用的,所以重复的包不会导致任何数据被重复保存,这也是中心化存储的好处之一。 中心化存储的缺点是需要基于引用计数等方式做软件包的垃圾回收,因为卸载一个软件包实际并不能立即从存储中删掉它,还得确保这个版本的包没有被其他环境引用。 |
5
Saniter 44 天前
简单说就是包全部安装在/nix/store ,包括一个包不同版本
用哪个版本用软连接连接过去,所以会导致磁盘占用迅速增加 |
6
secirian 44 天前 ![]() @Saniter 磁盘占用迅速增加不是因为这个,是 closure 的粒度不够细的问题。多版本共存在任何解决方案中都需要在本地存在多个版本,比单个版本天然地占用更多空间,可以参考 docker ,nixos 提供了更灵活的解决依赖地狱的方案、版本管理以及 native 运行,这个好处是丢掉传统的 FHS 以及纯净函数式带来的,也导致野生二进制无法直接运行。
|
7
xinyangli 44 天前 via Android ![]() 如果 profile 依赖了同一软件包的不同版本,这些版本会同时存在/nix/store 中的不同路径内。不过可以选择开启内置的 optimise ,使用硬链接的方式,在/nix/store 内进行文件级别的去重(应该和 content-addressability 相似?)。也可以使用支持透明压缩的文件系统作为/nix/store 。
|
![]() |
8
lingo 39 天前
正在用着 opensuse tw 回复。。
fedora 这个特性感觉好像挺的但是又觉得好像跟 opensuse 的 tw 差不多的样子。 |
9
yanqiyu 39 天前
常年 silverblue 用户,silverblue 用的是 ostree ,原理是所有系统文件(/usr 下面的文件)都用 content addressable storage 的方式存储。设计上类似于 git ,每个镜像是上游服务器构建的一个 commit ,然后用户拉取,然后用 hardlink 构造一个传统的(看起来很 fhs 的)文件系统树。系统启动的时候 initrd 阶段会做 bindmount+remount-ro 保证所有程序行为和传统系统一样。
在此之上 rpm-ostree 提供从 rpm 构建 ostree commit 以及再已有的 commit 上修改的能力,每次更新都拉取新的镜像+重新应用变更。 ostree 不管依赖,只管文件树,然后 rpm-ostree 是基于 rpm 的。 nix 是完全不同的设计,同时管理文件树和依赖关系,文件系统不是 fhs ,程序可能需要修改才能运行(然后随便下载的二进制大概需要容器或者 patchelf ),某种程度上更完整(比如程序运行的环境和编译的环境可以保证一致,因为 nix 在追踪这种信息; rpm 虽然可以但是操作上可以,但是大家只要 soname 不变都无所谓)。以及更加可定制,整个系统都所有细节都是用 nix 文件描述的。 我选 silverblue 的原因是常年 fedora 用户,没心情换发行版。 |