“新”对“dpkg --force-confnew”意味着什么?

jwo*_*der 6 package-management dpkg

我最近的任务是维护和移植到 Trusty 一个内部 .deb 包,该包覆盖(使用--force-overwrite)来自具有自定义版本的其他包的配置文件,之后apt-get install -f -y运行以安装一堆列为依赖项的相关包,其中一些他们是这些配置文件的合法所有者(保留你的讽刺评论和对自己的恐惧尖叫)。请注意,此包将配置文件标记为配置文件而不是常规文件。

在尝试清理东西的过程中,我发现如果apt-get通过-o Dpkg::Options::="--force-confold",那么我们自定义包中的配置文件将被依赖项的版本覆盖,而如果-o Dpkg::Options::="--force-confnew"使用,我们包的文件将保留在最后。

然而,dpkg手册页指出:

confnew: 如果 conffile 已被修改并且包中的版本确实发生了变化,则始终安装新版本而不提示,除非 --force-confdef 也指定了,在这种情况下,首选默认操作。

confold: 如果一个 conffile 已经被修改并且包中的版本确实发生了变化,那么总是保持旧版本而不提示,除非 --force-confdef 也指定了,在这种情况下,默认操作是首选的。

因为安装了“新版本”而保留了“旧版本” ,这似乎意味着“新版本”始终是当时正在安装的包中的那个,因此传递-o Dpkg::Options::="--force-confnew"apt-get应该会导致依赖项的配置文件以覆盖我们的软件包之前安装的文件。为什么不是这样?“新版本”的实际含义是否实际上基于时间戳(这只会引发更多问题)?这是文档和/或实现中的错误dpkg吗?这是否只是一个毛茸茸的边缘案例,由两个包声称拥有相同的配置文件,dpkg开发人员认为没有人会疯狂到偶然发现?什么?

jwo*_*der 1

我相信我已经弄清楚发生了什么:因为dpkg -i运行时未安装自定义包的依赖项,所以该包已在包系统中注册,并且当时既没有安装它也没有安装它的配置文件。运行时apt-get install -f,将安装依赖项,然后安装包本身,此时配置文件已安装并且--force-conf*传递的策略apt-get生效。因此,当--force-confnew使用dpkg.