通过在不同主机上更新 debian 操作系统 ( apt-get dist-upgrade
),我看到了同一屏幕的许多微小变化;当配置文件被修改时,它会告诉你有新版本可用,并要求你修复问题:你修改了文件并且 apt/dpkg 不能可靠地将你的更改与新版本集成。
现在这个选项菜单在各种文件之间是不同的。有时甚至在同一个包内。
一些文件将具有“包配置”控制台 UI,其他文件将使用普通控制台输出。包配置 UI 中可用的选项并不总是相同的。
修改/新版本文件的名称并不总是相同的。新文件的存储位置并不总是它应该在的位置(有时它在'tmp'中)。新文件的命名方案也不一致(一些软件包使用随机名称,一些使用 -new,其他的 -dpkg-new,等等。)
有些软件包拒绝告诉您 dpkg 默认值在哪里。有些软件包不为您提供带有扩展名 dpkg-old 或 -old 或 -dist 或 -dpkg-dist 或 -old-nameofpackage 的先前版本,但其他软件包提供。(所以在某些情况下你可以手动进行 3 向合并,在其他情况下你不能)。一些软件包添加了一个方便的“在版本之间进行 3 种方式合并”(这总是我尝试的第一件事,因为它通常可以自动解决问题:配置文件中的大多数更改通常只是注释中的拼写错误修复。
显示的程序或方式并排差异也可能因包/文件而异。
所以我认为包管理系统的全部目的是创建一种安装和卸载程序的一致方式。便于用户管理。
这里出了什么问题;为什么它的 UI/UX如此可怕?用户至少可以做些什么来更改/修改apt
- “进行三向合并”可用
- 新文件总是以一致的方式重命名/放置?
由于在归结为相同的死记硬背过程时做同样的事情有 1,000 种微小的变化,因此必须手动重新阅读并弄清楚如何手动处理每个配置文件是很痛苦的。
为了说明我的意思,这里有两个来自升级;
Configuration file '/etc/ssh/ssh_config'
==> Modified (by you or by a script) since installation.
==> Package distributor has shipped an updated version.
What would you like to do about it ? Your options are:
Y or I : install the package maintainer's version
N or O : keep your currently-installed version
D : show the differences between the versions
Z : start a shell to examine the situation
The default action is to keep your current version.
A new version (/tmp/tmp.3RoEfdEm3M) of configuration file /etc/ssh/sshd_config is available, but the version installed currently has been locally modified.
What do you want to do about modified configuration file sshd_config?
install the package maintainer's version
keep the local version currently installed
show the differences between the versions
show a side-by-side difference between the versions
show a 3-way difference between available versions
do a 3-way merge between available versions
start a new shell to examine the situation
第二种变体中的那些选项?他们并不总是按照那个顺序在那里。
感觉就像这只是为了绊倒你。
我将首先解决您问题中“面向用户”的问题:
这不能由用户控制,这取决于包如何管理其配置文件(见下文)。
不,但在实践中应该无关紧要。特别是,例如第二个示例(第
sshd_config
一个)中显示的临时文件确实是临时文件:它们是可用的配置文件的变体,以便比较工具等可以找到它们需要比较的数据。(这里可以通过默认不显示临时文件名来改善用户体验,只有在用户启动 shell“检查情况”时才显示它)。至于为什么会出现这种情况,具体在 Debian 中,这是因为配置文件可以通过多种方式处理。
正如您所期望的,包管理器
dpkg
提供了自己的配置文件管理。这就是在您的示例(升级)中产生第一个变体的原因ssh_config
。它只有两条信息可以使用:当前存在于磁盘上的配置文件,以及它试图安装的包中提供的新配置文件。因此,它无法提供三向合并。对于包维护者来说,它使用起来非常简单(事实上,在大多数情况下,它根本不需要任何工作)。dpkg
的配置文件处理会在事后生成一致的文件名:文件以 结尾.dpkg-dist
并.dpkg-old
取决于用户是否保留现有文件(在这种情况下,保留新文件供以后参考,.dpkg-dist
扩展名)或安装新文件(在这种情况下,旧文件与扩展名一起保留.dpkg-old
)。为了改善这种情况,开发了该
ucf
工具。它存储配置文件的原始版本,这就是它可以提供三向比较和合并的原因。然而,它需要包维护者的一些工作,这就是为什么许多包不使用它的原因。此外,对三向合并的支持是可选的。您可以在此处查看openssh-server
集成ucf
。除此之外,还有
debconf
Debian 配置管理系统。这是在安装过程中需要交互的包应该使用的,但是同样,这需要包维护者的工作,所以虽然现在很常见,但仍然有一些例外(包括尚未更新使用的非常旧的包debconf
).当然,一些维护者不喜欢上面的任何一个,或者在上面的一些可用之前开发了他们自己的解决方案,所以一些包做他们自己的事情。
Joey Hess 写了他从 1999 年开始参与 Debian 的 VA Linux box set,它提供了一些关于包配置的创建
debconf
和修改的上下文。在进行任何更新之前,首先安装
distro-info
,否则在无法访问 Web 浏览器的情况下从 CLI 查找以前的版本名称是很棘手的。命令:
然后编辑,或者,如果合并有效:
mv config.file.merged config.file
是一种做 debconf/ucf 手动做的同样事情的方法。
这只会留下不通知用户他们将旧/新配置文件留在何处的软件包。要从旧版本的软件包下载丢失的配置文件,在升级过程进行到一半时,您可以安装一个完整的独立系统并在其中安装软件包。或者,您可以通过浏览器手动下载它,将其 ftp 到 linux 机器。但是,如果必须在升级机器的命令行上完成,事情就会变得有点复杂。
这是我到目前为止所得到的。还有一件未实现的事情:
GETPACKAGERELEASEVER
--> 哪个版本的包是“buster”的一部分?我如何打印这个?另外,如何获得它是'main'还是'contrib'?(这部分的相关问题;如何从 cli 检查给定分发版本的包版本?)