第 12 章 在 RHEL 的镜像模式下管理文件系统
镜像模式使用 OSTree 作为后端,并默认对存储启用 composefs 。因此,您例如可以在写入 /opt 的派生容器镜像中安装第三方内容,因为 /opt 和 /usr 本地路径是普通目录,而不是到 /var 的符号链接。
当您将第三方内容安装到 /opt 时,第三方组件也可能试图在运行时过程中写入 /opt 中的子目录,这可能会产生潜在的冲突。
12.1. 使用 /sysroot 的物理和逻辑 root 的概述 复制链接链接已复制到粘贴板!
当 bootc 系统完全启动时,其与 chroot 创建的环境类似,也就是说,操作系统会为当前正在运行的进程及其子级更改表观根目录。物理主机根文件系统已挂载到 /sysroot。chroot 文件系统被称为一个部署 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 config选项。当目录处于可变持久性状态时,它会在升级过程中执行一个三路合并:-
使用新的默认
/etc作为基础 -
将当前和之前
/etc之间的区别应用到新的/etc目录 -
保留本地修改的与
/etc中相同部署的默认/usr/etc不同的文件。
-
使用新的默认
在创建新的引导装载程序条目之前,ostree-finalize-staged.service 会在关闭过程中执行这些任务。
这是因为 Linux 系统的许多组件都在 /etc 目录中提供默认的配置文件。即使默认软件包没有提供它,默认情况下,软件只检查 /etc 中的配置文件。没有不同的 /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 update 或 bootc rollback 不会影响此应用程序数据。
将 /var 分离还使得在应用新操作系统更新之前对其进行暂存,也就是说,更新已下载并就绪,但只在重启后生效。这同样适用于 Docker 卷,因为它将应用程序代码与其数据解耦。
如果您希望应用程序有预先创建的目录结构,例如 /var/lib/postgresql,则您可以使用这种情况。为此,请使用 systemd rhacm.d。您还可以在单元中使用 StateDirectory=<directory>。
- 其他目录
-
不支持在容器镜像中的
/run、/proc或其他 API 文件系统中分发内容。除此之外,其他顶级目录(如/usr和/opt)也与容器镜像一起进行生命周期。 /opt-
因为
bootc使用composefs,因此/opt目录是只读的,其他顶层目录(如/usr)也是只读的。
当软件需要写入 /opt/exampleapp 中其自己的目录时,一个常见模式是使用符号链接来重定向,例如:对于日志文件等操作,重定向到 /var :
RUN rmdir /opt/exampleapp/logs && ln -sr /var/log/exampleapp /opt/exampleapp/logs
另外,您还可以配置 systemd 单元来启动服务,来动态执行这些挂载。例如:
BindPaths=/var/log/exampleapp:/opt/exampleapp/logs
- 启用临时 root
-
要启用软件来临时(直到下一次重启)写入所有顶层目录,包括
/usr和/opt,对于应该保留的内容为到/var的符号链接,您可以启用临时 root 用户。要默认启用完全临时可写rootfs,请在/usr/lib/ostree/prepare-root.conf中设置以下选项。
[root]
transient = true
这可让软件临时写入 /opt,对于必须保留的内容,使用到 /var 的符号链接。