卧龙凤雏:Fedora Kinoite 与 openSUSE MicroOS

有许多用户会把 Fedora Kinoite/Sliverblue 和 openSUSE MicroOS Desktop 比较。这两个发行版有许多共同的特征——其中最显著的就是他们都是不可变的 Linux 发行版。

简单来讲,不可变的发行版会有一个大体只读的根分区。 /etc、 /var/home 等路径依然可写,但是 /usr/lib 是只读挂载。同时,不可变发行版还有以下特点:

在运行时不改变,程序的行为可以预测。这里的可以预测可能有点难以理解,我举个例子。更新正在运行中的,系统自带 Firefox 的朋友会被 Firefox 提醒:Firefox 已经更新,需要重启。Firefox 通过手动提醒用户来保证程序运行可靠,但大多数软件是没有这一机制的。这会导致不同的运行时环境在同一应用内混合,可能某一程序用的是原来的库和资源,而另一相关程序用的是更新后的,这就会带来不可预测的问题。

应用程序和容器都与主机系统分开,从而提高了稳定性和可靠性。就像现代的许多操作系统,例如 Android,软件运行在设定好的环境中。Flatpak 和 Snap 软件无需重启即可全新安装,与核心文件系统隔离,也降低了恶意应用程序破坏系统的能力。

所以不可变发行版给 Linux 带来了一丝新的曙光:操作系统会更稳定,更不容易出现错误,并且更易于测试和开发。这就是不可变发行版所能带来的未来。

Fedora Kinoite/Sliverblue 和 openSUSE MicroOS Desktop 实现不可变的的方式并不相同。

Kinoite/Sliverblue/CoreOS 采用的是 rpm-ostree,而 rpm-ostree 是基于 ostree 镜像的。

rpm-ostree 替代了传统的 dnf。用户所做的修改也只是在基础镜像上添加一层:用户操作软件包的时候,rpm-ostree 会重新将用户自行添加的所有软件包打包成一个 ostree 的 commit,覆盖在原来的基础镜像上。

因此,磁盘上的操作系统从一台机器到另一台机器完全相同,并且在使用时永远不会改变。而且更新基础镜像只是从 rpm-ostree 软件源拉取整个镜像,用户端不需要对整个系统的软件包依赖做解析,更加节省资源。(Fedora IoT 就是如此)

当然,这样也会有缺陷,每次制作 commit 都相当于重新安装一次用户自定义的所有软件包(至少是运行他们的安装脚本),随着用户自定义的东西增多,制作一层镜像的时间会越来越长。想象一下添加了 akmod 软件包的后果,每次安装都要重新编译和链接内核模块,时间成本非常高。而且因为 rpm-ostree 对一致性的要求,安装软件包的时候,用户的配置对于软件包脚本来讲并不可见(/etc 等位置仅有软件包带来的默认内容),这样就无法实现内核模块自签名之类需要保存到用户配置的操作。

MicroOS 则利用 Btrfs 的快照等特性来实现事务性和原子性。

MicroOS 并不实现基于镜像的特性。恰恰相反,MicroOS 的 transactional-update 是对 zypper 的包装。在运行 zypper 命令前,transactional-update 会打开一个新的快照,然后在快照内运行 zypper ,zypper 命令完成之后再设置系统从新的快照启动。

transactional-update 并不与 zypper 互斥。用户可以使用 transactional-update 打开快照内的 shell,在里面执行 zypper 或其他命令,然后在退出时也会自动设置系统从新的快照启动。某种意义上,transactional-update 比 rpm-ostree 有更多的自由。

除开实现“不可变性”上的差异,二者还有其他不同。

MicroOS 是滚动发行版,Fedora Kinoite/Sliverblue 不是。

MicroOS 可以用在 transactional-update 以外用 zypper 来搜索软件包,刷新软件源;Fedora Kinoite/Sliverblue 不行,所有操作只能用 rpm-ostree,而 rpm-ostree 在管理软件包方便功能很弱,一些功能在 rpm-ostree 里面也没有实现, Fedora 官方甚至建议在 toolbox 里面开 dnf 来搜索软件。(这并不是实现“不可变”的原理不同,只是 rpm-ostree 功能不太行)

虽然他们有许多不同,但从我个人的使用体验来看,Fedora Kinoite 和 openSUSE MicroOS Desktop 就是一对卧龙凤雏,他们在奇奇怪怪的地方有着相当的一致性。

在全盘加密的情况下,都要求我输入两次密码才能开机。Kinoite 安装程序不提供自动登陆选项,所以需要输入两次密码:内核解密硬盘一次,登陆一次。而 MicroOS 虽然在全盘加密时提供了自动登陆选项,但是因为 MicroOS 不支持分离 /boot 与根分区,所以也是要两次密码:GURB 解密硬盘一次,Linux 内核解密硬盘一次。

默认的 Flatpak 都不能开箱即用。Kinoite 自带了 Fedora 的 Flatpak 软件源,但是一个 Flatpak 软件包也没预装(反而预装了 RPM 版火狐),这个源的软件很少,我相信大部分用户还是需要自行添加 Flathub 源,所以基本没用(还得手动删除,不然会拖长 flatpak 命令行执行的时间)。而 MicroOS 默认没有任何 Flatpak 软件源,需要手动添加。

都有奇奇怪怪的 SELinux 权限问题,需要 restorecon 来恢复权限。Kinoite 默认给 ld.so 相关的一个缓存文件的权限有问题,导致 SELinux 不停抱怨;MicroOS 默认给 fprintd 文件夹的权限有问题,导致 frpint-enroll 失败,需要手动调试才知道原因所在。

都缺少一些本该预装的软件。Kinoite 没有预装 Kate 或 KWrite,MicroOS 没有预装浏览器。我是真不知道缺文本编辑器还是缺浏览器哪个更糟糕。

总之,不可变系统相比传统发行版发展时间短太多了,问题还不少。

发表回复

您的电子邮箱地址不会被公开。