1832 字
9 分钟
不可变发行版Silverblue
2025-09-07
无标签

Silverblue介绍#

为什么需要不可变发行版#

Fedora Silverblue 是一个不可变(Immutable)的桌面操作系统。它是 Fedora Workstation 的一个变体。

传统的 Linux 系统(如标准的 Fedora、Ubuntu):你可以使用包管理器(如 dnfapt)随时随地安装、卸载、修改系统核心部分的任何文件。这很灵活,但也可能导致问题,比如:

  • 系统不稳定:错误的更新或依赖冲突可能破坏系统。
  • 更新风险:更新过程中如果中断(如断电),可能导致系统无法启动。
  • 系统臃肿:“软件包地狱”,系统用久了会留下各种各-样的配置文件和库,难以清理。

例如一些错误打包的软件包在安装脚本中使用cp命令来安装软件或动态库,这可能会覆盖已有的文件。对于第三方打包的软件包,如果没有审查或者审查有疏忽,就有可能导致系统发生不可逆转的变化。

刚踩过坑的Mounriver Studio(沁恒MCU开发环境) 这节取自是Mounriver Studio 安装包的安装脚本。他会强制覆盖/usr/lib里的动态链接库。直接造成Clash Verge Rev等若干软件无法启动(依赖损坏)。并且无法恢复,因为卸载脚本里只会移除这些文件,并不会恢复原有的文件。

Terminal window
...more
cp -P /usr/share/MRS2/beforeinstall/lib* /usr/lib
ldconfig
cp /usr/share/MRS2/beforeinstall/50-wch.rules /etc/udev/rules.d
cp /usr/share/MRS2/beforeinstall/60-openocd.rules /etc/udev/rules.d
udevadm control --reload-rules
...more

那么如何解决这些问题呢? 答案是不可变(Immutable)

Silverblue 的根文件系统是不可变的,这意味着它在运行时无法被直接修改。这种设计可以极大地提高系统的稳定性和安全性,因为恶意软件或错误操作不会轻易破坏系统。此外,这种不可变性还简化了系统更新的过程。

Silverblue 使用 OSTree 技术进行系统管理,类似于 Git,它将系统作为一个树状结构进行版本控制。这种方式允许用户以原子方式进行系统更新或回滚,可以轻松恢复到之前的状态。

安装#

Silverblue安装非常简单,具有和Fedora Workstation相同的GUI安装界面,你可以像安装Fedora一样安装Silverblue。

WARNING

Silverblue的home目录应挂载到/var/home

通过fastfetch 输出系统信息可以看到有一个很不寻常的内容。那就是文件系统的挂载。

Disk (/): 33.23 MiB / 33.23 MiB (100%) - overlay [Read-only]
Disk (/sysroot): 27.71 GiB / 93.13 GiB (30%) - btrfs [Read-only]
Disk (/var/home): 449.98 GiB / 1.74 TiB (25%) - ext4

可以看到Silverblue的文件系统非常奇怪。

根目录结构/系统分区介绍#

我们可以使用mount命令来查看我们当前文件系统挂载的情况。

我们筛选出有用的信息进行介绍

  1. /sysrootsysroot 是物理硬盘上 Btrfs 文件系统的真正根。他在系统运行时首先被挂载,然后经过一系列操作将内部的目录绑定到/etc,/var。
/dev/mapper/lvm-root on /sysroot type btrfs (ro,relatime,seclabel,ssd,discard=async,space_cache=v2,subvolid=5,subvol=/)
  1. //是一个overlay 文件系统。他本身不存储任何内容。overlayfs 就像一个提供叠放的底片,供其他文件系统挂载。
composefs on / type overlay (ro,relatime,seclabel,lowerdir+=/run/ostree/.private/cfsroot-lower,datadir+=/sysroot/ostree/repo/objects,redirect_dir=on,metacopy=on)
  1. /etc:录被挂载为 可读写 (rw),可以修改etc内的配置文件进行配置。/etc的修改中的文件会被ostree追踪。当配置随软件包更新时,ostree会像git那样对文件进行合并。
/dev/mapper/lvm-root on /etc type btrfs (rw,relatime,seclabel,ssd,discard=async,space_cache=v2,subvolid=5,subvol=/)
  1. /var 可变的系统数据
/dev/mapper/lvm-root on /var type btrfs (rw,relatime,seclabel,ssd,discard=async,space_cache=v2,subvolid=5,subvol=/)
  1. /var/home 在 Silverblue 中,home目录被挂载到了/var/home,而/home 是一个指向 /var/home 的符号链接。对操作系统进行回滚(rollback),home目录文件完全不受影响。
/dev/mapper/lvm-home on /var/home type ext4 (rw,relatime,seclabel)

软件解决方案#

Silverblue根分区不可变,无法使用dnf包管理器。

Flatpak(图形化程序)#

Flatpak 是一种通用的 Linux 应用程序打包和分发技术。应用程序被打包在独立的“沙箱”环境中,与核心操作系统完全隔离。

Homebrew(CLI开发工具)#

Homebrew是一个广受欢迎的包管理器,在 macOS 上广泛流行,现在也完美支持 Linux。在 Silverblue 上,它成为了管理命令行工具和开发环境的绝佳选择。Homebrew 拥有海量的命令行工具、编程语言和开发库,例如 gitnodepythonneovimhtopripgrep 等。这些工具通常不适合通过 Flatpak 安装。

Homebrew 的所有操作都在用户空间内完成,完全不触碰不可变的系统根目录。

toolbox容器(大型复杂开发环境)#

当我们需要配置大型的开发环境的时候,比如要安装若干libxxx-devel,期间还会有复杂的依赖关系。brew的功能似乎就有点不够用了。

Toolbox 是 Silverblue 官方内置的、用于创建功能齐全的开发环境的核心工具。当你的开发需求超出单个工具的范畴时,Toolbox 就是你的最佳伙伴。

Toolbox 利用 Podman 容器技术,为你创建一个可变的、传统的 Linux 环境。支持Ubuntu,Debian,Fedora多个发行版。这个环境中和标准的操作系统几乎完全一致,可以自由地使用 sudo dnf install 命令

rpm-ostree(最后手段)#

rpm-ostree 是 Silverblue 底层的系统管理工具。你可以用它来“叠加(Layer)”传统的 RPM 包到你的系统镜像上。请务必将其视为最后的手段,仅在上述两种方法都无法满足需求时才使用。

rpm-ostree 并非一个传统的包管理器。而是类似于AndroidMagisk模块。当你使用 rpm-ostree install 时,它并不是简单地在文件系统中解压文件,而是:

  1. 获取你当前的系统基础镜像。
  2. 将你指定的 RPM 包“叠加”在这个基础镜像之上,生成一个全新的、定制化的系统镜像。
  3. 这个新镜像将在你下次重启后生效。

总结#

经过上述四板斧下来几乎没有运行不了的软件包了。 浅浅总结一下:

  1. Flatpak:用于安装所有图形化应用程序
  2. Homebrew / Toolbox
    • Homebrew 用于安装独立的命令行工具
    • Toolbox 用于搭建复杂的开发环境
  3. rpm-ostree:仅用于安装必须与系统深度集成的软件包。

踩坑#

home目录#

VSCode中发现打开的工程中,头文件的路径使用绝对路径进行定义的。当我们分别从左侧的资源管理器中打开,还有从头文件的链接中打开。会发现打开两个标签。

一个标签为${workspaceFolder}目录,一个是~/…。第一次看也一脸懵逼,第一反应是clangd插件索引链接创建的有问题。但是经过一段研究,这是因为VSCode是在/home的软链接中打开的工程。而CMake或bear生成的compileCommands中使用了/var/home作为home目录。

解决方案其实很简单。删除VSCode中的历史记录(因为这些记录是从/home中打开的)。以后打开工程的时候选择在/var/home中打开。

系统文件管理器的标签(右侧的文档,视频,图片等),也应全部删除掉。重新添加/var/home作为路径的标签。

不可变发行版Silverblue
https://milkfunc.top/posts/不可变发行版silverblue/不可变发行版silverblue/
作者
CapaCake
发布于
2025-09-07
许可协议
CC BY-NC-SA 4.0