不可变 Linux 系统简介


本文介绍了不可变 Linux 系统的概念,并讨论了各种实现,例如 NixOS、Guix、Endless OS、Fedora Silverblue 和 OpenSUSE MicroOS。

每个系统都有自己的不变性方法,但共同原则包括下次启动时完成的系统升级、通过包管理器应用的更改以及回滚更改的能力。

本文深入介绍了每种实现的功能和局限性,并分享了作者的使用经验。

什么是不变性操作系统?
不变性这个词本身指的是一个不能改变的对象。
然而,当涉及到不可变操作系统时,定义立即变得模糊。什么是无法改变的操作系统?你应该用它做什么?
我们可以说 Linux LIVE-CD 是不可变的,因为每次启动它时,都会运行完全相同的程序,并且您无法更改任何内容,因为磁盘介质是只读的。但是当 LIVE-CD 运行时,您可以对其进行更改,您可以创建文件和目录,安装软件包,它不会陷入不可变的状态。
不幸的是,这个例子很好,但是那些 Linux 发行版的不变性方法完全不同,所以我们需要进一步思考。
这些系统中有三个共同原则:

  • 系统升级不会在实时系统上完成
  • 软件包更改将在下次启动时应用
  • 您可以回滚更改

根据实施情况,系统可能会提供更多功能。但这个列表是目前 Linux 发行版应该被贴上“不可变”标签的。

现在我们找到了称为不可变的最低要求是什么,让我们按出现的顺序逐一了解每个实现。

NixOS / Guix
NixOS:

  • 您可以在两种配置之间即时切换,因为这只是从一种配置切换到另一种配置的符号链接舞蹈
  • 您可以在启动时选择配置,以便在出现问题时可以回滚到以前的版本
  • 您无法更改包文件或系统文件,因为它们是只读的
  • 除了特殊存储目录之外的挂载点都是可变的,因此您可以在 /home 或 /etc 或 /var 等中写入更改...您可以通过修改版本删除系统符号链接,但不能修改符号链接源本身。

我花了几年时间运行 NixOS 系统,这对我来说确实是一个爆炸,也是最好的“不可变”实现,但不幸的是它太不同了,所以尽管有这么多好处,它的采用率非常低。

Endless OS 
Endless OS 背后的公司正试图提供一个可靠、免费、开源的系统,可以在没有互联网的情况下工作,以便在互联网/电网覆盖率较低的国家使用。他们甚至提供了一个“包含离线互联网”的版本,其中包含维基百科转储、课堂课程和许多使计算机在离线时有用的东西(我喜欢他们的工作)。

Endless OS 官方项目网站

Endless OS 基于 Debian,但使用 OSTree 工具使其不可变。OSTree 允许您管理核心系统映像,并在其之上添加层,将包视为层。但它也可以为下次启动准备新的系统映像。

使用 OSTree,您可以在下次启动时可用的新版本系统中应用程序包更改,并在启动时恢复到以前的版本。

分区以可写方式挂载,但由/usrOSTree 处理的包区域除外,它是以只读方式挂载的。无法回滚/etc。

供用户使用的程序(不是系统使用的软件包,如 grub、X 显示或驱动程序)是从 Flatpak(也使用 OSTree,但与系统无关)安装的,这避免了每次都需要重新启动你安装一个新的包。

我对 Endless OS 的体验好坏参半,它是一个优秀而可靠的操作系统,运行良好,从未失败过,但我只是不是目标受众。他们提供了一个修改过的 GNOME 桌面,看起来像智能手机菜单,因为这是大多数非技术用户所熟悉的(但我讨厌它)。安装 DevOps 工具虽然不切实际,但并非不可能,因此我为我的多媒体上网本保留了 Endless OS,而且我真的很喜欢它。

Fedora Silverblue 
该系统由用于发布的单个核心映像组成,例如 fedora-38,并且对于安装的每个软件包,都会在核心之上添加一个新层。在任何时候,你都可以列出所有层来了解核心之上安装了哪些软件包,如果删除一个软件包,整个堆栈将在没有软件包的情况下再次生成(这非常慢),之后绝对没有剩余删除包。

启动时,您可以选择旧版本的系统,以防升级后出现问题。如果您安装了一个软件包,则需要重新启动才能使其可用,因为更改不会应用于当前启动的系统,但是 rpm-OSTree 得到了很好的升级,您可以暂时将下次启动的更改合并到实时系统中(使用 tmpfs 覆盖)来使用更改。
/etc/挂载点管理有点不同,除了、/root和 之外,所有内容都是只读的/var,但默认情况下您的主目录/var/home有时会超出预期。无法回滚/etc。

由于 rpm-OSTree 安装新软件包的速度很慢,并且需要重新启动才能完全可用(实时更改回端口将额外的更改存储在内存中),因此他们建议对程序使用 Flatpak,或者某种创建的包装toolbox器一个无根 Fedora 容器,您可以在其中安装软件包并在终端中使用它。

toolbox 旨在提供 Flatpak 中没有的开发库或工具,但您不想将其安装在基本 Fedora 系统中。
工具箱网站
我对 Fedora Silverblue 的体验非常好,它很稳定,更新也很流畅,即使很慢。 

OpenSUSE MicroOS
OpenSUSE Tumbleweed(滚动发布 OpenSUSE)的这个版本具有不变性,但有自己的实现。MicroOS的想法非常简单,整个系统除了一些目录(例如/home或/var位于btrfs快照上)之外,如果您想对系统进行更改,则将当前快照分叉为新快照,并将更改应用到那里,准备下次启动。

OpenSUSE MicroOS 官方项目网站

这里有趣的是它/etc是快照的一部分,并且可以回滚,这在基于 OSTree 的系统中是不可能的。还可以使用 shell 对文件系统的任何文件(在新快照中,而不是实时快照中)进行更改,这对于注入文件来解决驱动程序问题非常实用。

缺点是,如果您开始进行更改,则不能保证您的系统是“纯粹的”,因为它们不会被跟踪,快照只是编号,并且您不知道每个快照中进行了哪些更改。

我对 OpenSUSE MicroOS 的体验非常棒,它在我的主笔记本电脑上与 OpenBSD 进行双引导,它是我的 Linux 游戏操作系统,也是我的 NAS 操作系统,所以我不必关心更新。我喜欢快照系统不会限制我,而 OSTree 系统不允许您在不安装软件包的情况下进行更改。

Vanilla OS
最后,不可变家族中真正新的(但足够成熟可用)系统是基于 Ubuntu 的 Vanilla OS(但很快将在 Debian 上),使用 ABroot 来实现不变性。对于 Vanilla OS,我们有另一种实现,它与我们上面看到的完全不同。
Vanilla OS 项目网站
ABroot 命名是经过深思熟虑的,其想法是拥有一个根分区 A、另一个根分区 B 以及一个用于持久数据(如/home或 )的分区/var。

这是 ABroot 完成的引导步骤:

  • 首次启动在 A 上完成,它以只读方式安装
  • 对系统的更改(例如新包或文件更改)/etc在 B 上完成(并且可以使用 tmpfs 覆盖实时应用)
  • 重新启动时,如果之前启动的是A,则在B上启动,然后如果启动成功,ABroot会扫描A和B之间的所有更改,并将从B到A的所有更改应用
  • 当你使用你的系统时,在你做出改变之前,A和B总是相同的

这种实现有缺点,您只能回滚更改,直到在新版本上启动为止,然后更改也会应用到之前的启动上,并且无法回滚。此实现主要可以保护您免受升级失败的影响,或者如果您进行了更改并现场尝试,但您更愿意回滚。

Vanilla OS 具有包管理器 apx,由 distrobox 作者编写。这肯定是一个有趣的软件,允许非 root 用户安装来自许多发行版(arch linux、fedora、ubuntu、nix 等)的软件包,并将它们集成到系统中,就像在本地安装一样。我想它是分布盒顶部的某种层。
apx 包管理器 GitHub 项目页面

我的体验不是很好,我没有发现 ABroot 真正有用,而且我尝试的 22.10 版本使用的是旧的 Ubuntu LTS 版本,这并没有让我的游戏计算机真正满意。Vanilla OS、ABroot 和 apx 的整体状态是它们还很年轻,我认为它可以成为一个很棒的发行版,但它仍然有一些粗糙的边缘。

Alpine Linux
我听说可以使用“lbu”命令在 Alpine Linux 上实现不变性。

Alpine Linux wiki:本地备份

我不想过多讨论细节,但这里是简短的版本:您可以使用 Alpine Linux 安装程序作为启动的基本系统,并创建“保存的配置”的 tarball,这些配置在启动时自动应用(它只是 tarred 的)目录和一些自动安装包)。每次启动时,所有内容都会再次解压,并再次安装软件包(您应该使用 apk 缓存目录),所有内容都在实时内存中,完全可写。

这能达到什么目的?您始终从干净的状态开始,每次启动时都会在其之上应用更改,您可以回滚更改并重新开始。我们上面定义的不变性并未实现,因为更改是应用在基础系统上的,但它非常接近满足(我自己的)要求。

我只使用了几天,而不是作为我的主系统,它需要很好地理解你在做什么,因为系统完全在内存中,你需要关心你想要保存的内容/恢复,这可以创建大档案。

最重要的是,它的记录很少。

总结
不可变操作系统正在我们的小型开源系统社区中成为新闻,但这个词背后隐藏着许多具有不同用例的实现。“不可变”这个词确实引起了用户的期望,但它实际上只不过是操作系统的事务性更新,我很高兴我们现在可以拥有此功能。

但事务性更新并不新鲜,我认为它是在不久前开始的,Solaris 和 ZFS 允许您在启动时选择系统快照,然后我很确定 FreeBSD 在十年前就实现了这一点,事实证明,在任何具有常规 btrfs 快照的 linux 发行版您可以在启动时选择快照。

最后,真正的新功能是能够在非实时环境中应用事务更改,将其集成到引导加载程序中,并为用户提供轻松处理此问题的工具。