/etc 和 /usr/etc 中的配置文件

2024年8月14日 | Thorsten Kukuk | 无许可

这篇博文的日期是2019年12月,并于2024年8月更新。

简介

正如一些人可能已经注意到的那样,一些配置文件不再位于 /etc 中,而是位于 /usr 下。这可能是 /usr/etc/usr/lib/usr/share 下的目录,具体取决于上游项目。

这次迁移背后的原因是什么?为了更好地理解,我们首先看看今天如何处理配置文件更新

RPM 和配置文件

RPM 对更新配置文件支持有限。最终,这归结为两个简单的选择

  • 修改后的配置文件在升级期间被移走,管理员需要重新进行更改(.rpmsave 文件)。
  • 修改后的配置文件被保留,分发版所做的更改被忽略(.rpmnew 文件)。最终,服务可能无法正常工作,甚至可能不安全!

这两种选择都不是用户友好的,很可能会导致升级后服务出现故障或不安全,需要管理员手动进行处理。在桌面系统或简单的服务器上,这可能可以容忍,但对于大型集群来说,这可能会导致大量的工作。

有几种替代解决方案,例如三向差异或交互式更新,但第一种方法无法解决冲突更改发生时的问题,而第二种方法不能解决完全自动化的更新。

原子更新

对于原子系统,又增加了一层复杂性,因为不同的状态可能包含不同版本的配置文件。那么这是如何发生的?原子更新是一种更新,它

  • 是原子的
    • 更新要么完全应用,要么根本不应用
    • 更新不会影响您正在运行的系统
  • 可以回滚
    • 如果更新失败或更新不兼容,您可以快速恢复到更新之前的状态

更新将通过重新启动到新状态来激活,因此在更新后,在重新启动之前,更新所做的更改不可见。如果管理员或配置管理软件在此期间更改正在运行的系统中的配置文件,这将导致冲突,并再次需要手动干预。

基于镜像的更新

基于镜像的更新意味着操作系统(主要是 /usr)作为镜像进行更新,我们这里不讨论原始磁盘镜像。由于您部署了新的镜像,例如 /usr,因此没有工具可以更新镜像外部的配置文件,例如在 /etc 中。并且镜像无法覆盖 /etc,因为这意味着所有依赖于主机的本地配置都将丢失。因此,需要严格分离分发版提供的配置文件和管理员所做的更改。这也被称为 hermetic-usr

目标

目标是提供一个适用于大多数软件包及其配置文件的概念,从而使自动更新更加容易和可靠。为此,需要一种新的存储和管理配置文件的方案。

解决方案的要求

新的解决方案应该确保

  • 管理员可以看到某些内容已被更新
  • 管理员可以看到自己所做的更改
  • 软件包和管理员的更改应该自动合并
  • 应该只有一个目录来搜索默认配置文件

解决方案

作为长期解决方案,任何软件包都不应该再将任何内容安装到 /etc 中,该目录应该只包含在安装期间创建的特定于主机的配置文件以及系统管理员所做的更改。软件包应该将它们的默认配置文件安装到另一个目录。

对于 SUSE/openSUSE,决定将 /usr/etc 作为分发版提供的配置文件的目录。

对于合并软件包和管理员的配置文件,将需要不同的策略,具体取决于文件类型;这些文件可以分为以下几类

  1. 应用程序的配置文件
  2. 系统的配置文件(网络、硬件……)
  3. 类似文件的“数据库”(/etc/rpc/etc/services/etc/protocols
  4. 系统和用户帐户(/etc/passwd/etc/group/etc/shadow

应用程序配置文件

对于应用程序配置文件,systemd 已经使用了一种很好的解决方案,可以将其用于大多数应用程序

  • /usr/etc/app.conf 是分发版提供的配置文件。
  • 如果存在,/etc/app.conf 将替换 /usr/etc/app.conf
  • /etc/app.conf.d/*.conf 包含覆盖 /usr/etc/app.conf/etc/app.conf 中单个条目的片段。

这是 Configuration Files SpecificationUAPI Group 提供的正式规范。

应用程序加载配置文件的流程将是

  • 应用程序查找 /etc/app.conf
  • 如果此文件不存在,则加载 /usr/etc/app.conf
  • 查找 /etc/app.conf.d 中的覆盖项并合并它们。

有关更多详细信息和示例,请参阅 https://www.freedesktop.org/software/systemd/man/systemd.unit.html#Examples,“Overriding vendor settings”。一个提供简单接口并透明地为应用程序实现上述加载机制的 C 库是 libeconf

根据配置文件的格式,上述模式可能不适用于所有应用程序。对于这些应用程序,应找到尽可能遵循上述指南的解决方案。

系统配置文件(网络、硬件……)

由于这些配置文件是特定于系统的,并且仅在安装期间或之后创建,而不是由分发版提供的,因此这些文件将保留在 /etc 中。

系统数据库(rpc、services、protocols)

/etc 中有一些文件,严格来说,它们不是配置文件,例如 /etc/rpc/etc/services/etc/protocols。它们很少更改,但有时新的系统应用程序或第三方软件需要进行添加。这些文件将被移动到 /usr/etc/etc/nsswitch.conf 必须更改为首先在 /etc 中搜索,然后在 /usr/etc 中搜索。将使用 glibc NSS 插件 usrfiles/etc 将只包含管理员和第三方软件所做的更改。

/etc/passwd, /etc/group 和 /etc/shadow

目前还没有解决这些配置文件的解决方案,真正解决问题。欢迎提出想法!

进一步的文档

类别: 博客

标签

分享这篇文章