第 12 章 在 RHEL 的镜像模式中管理文件系统


镜像模式使用 OSTree 作为后端,默认情况下,启用 composefs 进行存储。这意味着您可以在写入 /opt 的派生容器镜像中轻松安装第三方内容,例如,因为 /opt/usr 本地路径是普通目录,而不是符号链接到 /var

警告

当您将第三方内容安装到 /opt 时,第三方组件也可以试图在运行时写入 /opt 中的子目录,什么可能会造成潜在的冲突。

12.1. 使用 /sysroot 了解物理和逻辑 root

当 bootc 系统完全引导时,与 chroot 创建的环境类似,也就是说,操作系统会更改当前正在运行的进程及其子级的显式根目录。物理主机根文件系统挂载到 /sysrootchroot 文件系统被称为部署 root。

剩余的文件系统路径是部署 root 的一部分,用作系统引导的最终目标。系统使用 ostree=kernel 参数来查找部署 root。

/usr
最好将所有操作系统内容保存在 /usr 中,但严格要求。/bin 等目录将作为指向 /usr/bin 的符号链接。这种布局会创建操作系统和主机特定资源的分离。
注意

启用 composefs 时,/usr 不与 / 不同。这两个目录都是同一不可变镜像的一部分,因此您不需要使用 bootc 系统执行完整的 UsrMove

/usr/local
使用 bootc 系统,您可以创建自定义容器镜像作为默认入口点。因此,基础镜像将 /usr/local 配置为常规目录,即默认目录。

默认文件系统布局具有 /opt/usr/local 作为常规目录,即,在运行时可写入构建时间和不可变。例如,这与 RHEL CoreOS 不同,例如将这些符号链接保存在 /var 中。

/etc

/etc 目录默认包含可变持久状态,但它支持启用 etc.transient 配置选项。当目录处于可变持久性状态时,它会在升级过程中执行三向合并:

  • 使用新的默认 /etc 作为基础
  • 将当前和之前的 /etc 之间的 diff 应用到新的 /etc 目录
  • 保留本地修改的文件与 /etc 中相同部署的默认 /usr/etc 不同。

在创建新的引导装载程序条目前,ostree-finalize-staged.service 会在关闭过程中执行这些任务。

这是因为 Linux 系统的许多组件都在 /etc 目录中提供默认配置文件。即使默认软件包没有提供它,默认情况下,软件只检查 /etc 中的配置文件。基于非基于 bootc 镜像的更新系统没有不同版本的 /etc,仅会在安装过程中填充,且不会在安装后在任意时间点上更改。这会导致 /etc 系统状态受到初始镜像版本的影响,并可能导致问题应用更改,例如:到 /etc/sudoers.conf,并且需要外部干预。有关文件配置的详情,请参阅 构建和测试 RHEL bootc 镜像

/var
例如,只有一个 /var 目录。默认情况下,放置在 /var 目录中的文件和数据会被持久删除,并在不同的会话和系统重启后提供。您可以将 /var 分区或其子目录转换为挂载点,如临时文件系统(TMPFS)或网络挂载点。如果您没有为 /var 创建不同的分区,系统会执行绑定挂载,并在 /var 目录中创建单个、共享和持久的 /ostree/deploy/$stateroot/var,以便这两个目录在部署间共享相同的数据。

默认情况下,/var 中的内容充当卷,即容器镜像的内容会在初始安装过程中复制,且不会在以后进行更新。

/var/etc 目录不同。您可以将 /etc 用于相对较小的配置文件,预期的配置文件通常绑定到 /usr 中的操作系统二进制文件。/var 目录有任意大型数据,如系统日志、数据库和默认数据,如果操作系统状态回滚,则不会回滚。

例如,进行 dnf downgrade postgresql 等更新不会影响 /var/lib/postgres 中的物理数据库。同样,使 bootc 更新bootc 回滚 不会影响此应用程序数据。

使用 /var 分离还使得在应用新操作系统更新之前完全可以正常工作,也就是说,更新会被下载并就绪,但只会对重启生效。这也适用于 Docker 卷,因为它将应用程序代码与其数据分离。

如果您希望应用程序具有预先创建的目录结构,例如 /var/lib/postgresql,则可以使用这个情况。为此,使用 systemd rhacm.d。您还可以在单元中使用 StateDirectory= <directory& gt;。

其他目录
不支持在容器镜像中的 /run/proc 或其他 API Filesystems 中提供内容。除此之外,其他顶级目录(如 /usr/opt )也与容器镜像一起的生命周期。
/opt
因为 bootc 使用 composefs,因此 /opt 目录是只读的,所以其他顶层目录(如 /usr )。

当软件需要写入 /opt/exampleapp 中自己的目录时,一个常见模式是使用符号链接来重定向到,例如: /var 用于日志文件等操作:

RUN rmdir /opt/exampleapp/logs && ln -sr /var/log/exampleapp /opt/exampleapp/logs
Copy to Clipboard Toggle word wrap

另外,您还可以配置 systemd 单元来启动服务来动态执行这些挂载。例如:

BindPaths=/var/log/exampleapp:/opt/exampleapp/logs
Copy to Clipboard Toggle word wrap
启用临时根
要启用软件临时(直到下一次重启)写入所有顶层目录,包括 /usr/opt,对于应该保留的内容为 /var 的符号链接,您可以启用临时 root 用户。要默认启用完全临时的 rootfs,请在 /usr/lib/ostree/prepare-root.conf 中设置以下选项。
[root]
transient = true
Copy to Clipboard Toggle word wrap

这可让软件临时写入 /opt,对于必须保留的内容的符号链接 /var

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat