命令行手册

Man » ucf 手册在线 - ucf 手册页的详细在线文档

🌍
ucf - 更新配置文件:保留用户对配置文件的更改

概要

ucf [选项] <新文件> <目标位置>

ucf [选项] --purge <目标位置>

描述

此实用程序提供了一种方法,用于询问用户是否接受软件包维护者提供的新的配置文件版本,并采用各种启发式方法来最大限度地减少交互时间。它使用 debconf 与用户进行交互,符合 Debian 策略。在上面的“概要”中,新文件是软件包提供的配置文件(要么随软件包一起提供,要么由维护脚本动态生成),目标位置是实际配置文件的位置(通常位于 /etc 目录下),并且该文件可能已被最终用户修改。由于编辑的是真实文件,而不是符号链接,因此 ucf 在执行操作之前会跟踪并解析符号链接。在尽可能的情况下,ucf 尝试保留新文件在复制到新位置时的所有权和权限。

此脚本尝试为安装在 /etc 目录下的文件(这些文件未包含在 Debian 软件包中,而是由 postinst 处理)提供类似于 conffile 的处理方式。Debian 策略规定,/etc 目录下的配置文件必须保留用户更改,这同样适用于由维护脚本处理的文件。通过使用 ucf,您可以将一组默认配置文件放在 /usr 目录的某个位置(/usr/share/<pkg> 是一个不错的选择),并在 /etc 目录中维护文件,从而保留用户更改,并通常提供与 dpkg 为“conffiles”通常提供相同的功能。

此外,此脚本还提供了一种机制,用于将先前未提供 conffile 保护的文件迁移到此模式,并尝试在安装时减少提出的问题数量。事实上,与 dpkg 在将文件从非 conffile 状态过渡到 conffile 状态时提供的功能相比,此转换机制更好。上面“概要”中的第二种形式用于在清除软件包时清除有关配置文件的信息,这对于允许平滑重新安装至关重要。

在处理配置文件时,此脚本可以选择性地创建配置文件的各种版本副本。例如,后缀为 ucf-old 的文件保存由 ucf 替换的配置文件的旧版本。此外,还可以创建后缀为 ucf-new 和 ucf-dist 的配置文件的副本;维护脚本应考虑在清除时删除具有这些扩展名的配置文件的副本。


选项

-h, --help

打印简短的使用信息

-n, --no-action

模拟运行。打印如果脚本被调用时将要执行的操作,但不执行任何操作。

-d[n], --debug=[n]

设置调试级别为(可选的)级别 n(n 默认为 1)。请注意,可选数字 n 前面不能有空格。这会启用大量的调试信息。

-p, --purge

从状态哈希文件中删除文件的所有痕迹。这允许在清除后重新安装软件包;否则,实际的配置文件将被删除,但它仍然保留在哈希文件中;并且在重新安装时,由于新文件的 md5sum 与哈希文件中的 md5sum 匹配,因此不会执行任何操作。简而言之,请记住在 ucf 管理的每个配置文件的 postrm 中使用此选项,当软件包被清除时(假设 ucf 本身存在)。请注意:ucf 在此操作中实际上不会触及磁盘上的文件,因此任何文件删除仍然是调用软件包的责任。

-v, --verbose

使脚本在设置内部变量时非常详细。

-P foo, --package foo

在更新配置文件时,不要跟踪软件包 foo 的 dpkg-divert 转移。

-s foo, --src-dir foo

设置源目录(历史 md5sum 预计位于此目录中的文件和子目录中),默认为新文件所在的目录。设置此选项会覆盖环境变量 UCF_SOURCE_DIR 和配置文件变量 conf_source_dir 中的设置。

--sum-file foo

强制历史 md5sum 从此文件读取,而不是默认位于源目录中。设置此选项会覆盖环境变量 UCF_OLD_MDSUM_FILE 和配置文件变量 conf_old_mdsum_file 中的设置。

--three-way

这会在安装期间启用选项,允许用户查看旧维护者版本和新维护者版本之间的更改合并到本地配置文件中的内容。如果用户喜欢看到的内容,他们可以要求将这些更改合并。这允许即使在保留对配置文件的本地修改时,也可以获取新的上游更改合并。这是通过在注册期间将配置文件存储在缓存区域中,并在安装期间使用 diff3 来完成的(存储文件的文件名是对完整文件路径的修改,以避免名称空间冲突)。

--debconf-ok

指示 ucf 可以使用已经运行的 debconf 实例进行提示(一直以来,在 debconf 未运行时使用 ucf 都是可以的——它将根据需要调用 debconf)。


--debconf-template foo
指示 ucf 使用指定的多个选择 debconf 模板,而不是 ucf 提供的正常 debconf 模板。 调用者有责任确保指定的模板存在,并且其选择列表与默认 ucf 模板的选择列表匹配,并且应设置 Choices-C: ${CHOICES},以确保返回的值与默认模板中的值匹配。 请注意,如果也设置了 --three-way 选项,则选择必须不同。

--state-dir /path/to/dir
将状态目录设置为 /path/to/dir,而不是默认的 /var/lib/ucf。 主要用于测试。

-Z     将目标文件的 SELinux 安全上下文设置为默认类型。

使用方法

最常见的用法非常简单:在 postinst 脚本的 configure 部分使用单行调用,然后在 postrm 脚本中使用单行调用,以告知 ucf 在卸载(使用 --purge 选项)时忘记配置文件(假设 ucf 仍然在系统中)。

建议还将 ucf 管理的任何文件注册到 ucf 注册表中;这将配置文件与它所属的软件包相关联。 这可以通过调用 ucfr 来完成。 用户可以使用工具 ucfq 查询配置文件与软件包之间的关联。 请查阅相应的手册页以获取更多详细信息。

使用 debhelper 的软件包可以通过使用 dh_ucf 辅助工具来简化创建必要的维护脚本片段。

如果维护脚本正在处理从非保护状态过渡到脚本提供的保护状态的文件,则维护者可以通过减少安装时可能提出的问题来帮助简化过渡。 具体来说,如果相关文件是未修改的版本,并且是先前版本中已包含的版本,则不应提出问题;维护者可以通过告知脚本有关已发布版本的历史 md5 校验和的信息来提供帮助。

为此,您可以创建一个名为 <New file>.md5sum 的文件,其中每行包含一个 md5 校验和(您使用的文件名将被忽略,除了名为 default 的条目),或者创建一个名为 <New file>.md5sum.d 的目录,其中应该包含任意数量的文件,每个文件都包含一行,即 <New file> 的先前版本的 md5 校验和。 这些文件的名称并不重要,只有一个例外:名为 default 的文件被视为特殊文件。 例如,作者个人使用软件包版本号或发布代号,例如 7.6.3 或 potato。 如果没有历史 md5 校验和匹配,我们可以几乎确定要么历史 md5 校验和记录不完整,要么用户已更改了配置文件。

默认历史 md5 校验和

前面提到的规则的例外情况是,如果没有匹配的 md5 校验和,并且如果存在文件 <New file>.md5sum.d/default,或者如果在 <New file>.md5sum 中存在与 default 文件对应的行,则应将其用作先前已安装在此计算机上的软件包的默认 md5 校验和。 显而易见,除非先前发布的软件包数量有限(例如只有一个),否则维护者也只是做出明智的猜测,但维护者可以选择这样做。


如果文件 <New file>.md5sum 或目录 <New file>.md5sum.d 不存在,或者没有匹配的 md5 校验和,我们会测试已安装的 <Destination> 文件,看看它是否与 <New file> 相同。如果不同,我们会询问用户是否要我们替换该文件。

还提供了一个额外的功能:可选地,ucf 可以存储维护者复制的配置文件的旧版本,并在升级时,计算维护者版本中进行的更改,并将该补丁应用于本地版本的文件(当然,是在用户请求的情况下)。还有一个预览功能,用户可以在请求执行操作之前,检查合并结果。

环境变量

如果设置了变量 UCF_FORCE_CONFFNEW,则强制新的文件始终覆盖已安装的目标文件;而变量 UCF_FORCE_CONFFOLD,如果设置,则会静默地保留已安装的文件。UCF_FORCE_CONFFMISS 仅在已安装的目标文件不存在时适用(可能是由于用户删除了该文件),并且强制 ucf 重新创建丢失的文件(默认行为是尊重用户的意愿,不重新创建本地删除的文件)。此外,当 ucf 创建一个子 shell 时,它会填充变量 UCF_CONFFILE_NEW 和 UCF_CONFFILE_OLD,这些变量可用于检查更改。

DPKG_FORCE 变量的 confmiss、confnew、confold、confdef 和 confask 标志也受支持。有关更多信息,请参见 dpkg(1)。

文件

此脚本会创建文件 new_file.md5sum,并且它可能会将文件(通常是随软件包提供的) 复制到其目标位置

/var/lib/ucf/hashfile 和 /var/lib/ucf/hashfile.X,其中 X 是一个小的整数,用于存储以前版本的 hashfile。

/etc/ucf.conf

示例

如果软件包 foo 想要使用 ucf 来处理用户对配置文件的交互,其中一个版本作为 /usr/share/foo/configuration 提供,那么在 post inst 文件中进行简单的 ucf 调用即可:

ucf /usr/share/foo/configuration /etc/foo.conf

在卸载时,应该告诉 ucf 忘记该文件(有关详细示例,请参见 /usr/share/doc/ucf/examples):

ucf --purge /etc/foo.conf 请注意,purge 也可以用来让 ucf 忘记文件的先前状态,并且当软件包下次安装或更新时,ucf 将询问用户是否要替换当前配置文件。 如果你想更改你的决定,即不更新为维护者提供的配置文件的版本,请这样做。

此脚本的目的是为 Emacs Lisp 包的启动文件提供类似于 conffile 的处理方式(例如,/etc/emacs21/site-start.d/50psgml-init.el)。这些启动文件不随软件包一起提供,而是在软件包安装的后配置阶段由脚本 /usr/lib/emacsen-common/emacs-package-install $package_name 安装。

此脚本旨在由 /usr/lib/emacsen-common/packages/install/$package_name 中的软件包安装脚本为已安装的每个 Emacs 版本调用,通过使用适当的新文件(/usr/share/emacs/site-lisp/<pkg>/<pkg-init.el)和目标文件(/etc/emacs21/site-start.d/50<pkg-init.el)的值来调用它,然后它应该完成剩下的工作。

参见

ucf.conf(5), ucfr(1), ucfq(1), dpkg(1), dh_ucf(1), diff3(1)。

Debian Emacs 策略,随 emacsen-common 软件包提供。

作者

此手册页由 Manoj Srivastava <_> 为 Debian GNU/Linux 系统编写。