网站搜索

在 Arch Linux 中如何处理 .pacnew 文件


了解 Arch Linux 在更新过程中如何创建 .pacnew 文件,以及如何在不破坏设置的情况下管理配置更改。

如果你使用 Arch Linux,你可能已经注意到,过了一段时间,尤其是在系统更新之后,系统中会出现带有 .pacnew 扩展名的文件。既然你正在阅读这篇文章,这很可能就是你来到这里的原因:弄清楚这些文件是什么,它们为什么会出现,以及你应该如何处理它们。

好吧,你来对地方了。在下面的内容中,我会尽量清晰、直白地解释所有事情。那么,我们先从主要问题开始吧。

Arch Linux 中的 .pacnew 文件是什么?

当你通过执行类似 pacman -Syu 的命令更新你的 Arch Linux 系统时,一些已安装的软件包包含配置文件,通常存储在 /etc 中。然而,如果你自定义了其中的某个文件,而软件包维护者在更新版本中对其进行了修改,Arch(当然)不会覆盖你本地安装的版本。

这是一个安全措施,可以防止您的本地更改丢失。实际上,Pacman 会在后台创建一个 .pacnew 文件——即随更新包提供的配置文件的“新”版本,从而让您可以访问包现在提供的更新配置。可以这样理解:

  • 您当前的配置=您的自定义设置。
  • .pacnew 文件=维护者的更新版本。

例如,如果上游修改了 /etc/pacman.conf,在更新后,你会看到 /etc/pacman.conf.pacnew。然后你可以将两个文件并排打开(下面会详细介绍),并复制重要的差异。

然后,一旦你合并或替换了文件,你就可以安全地删除 .pacnew 版本,以保持整洁。最终目标是保持系统配置的更新 而不会丢失你的自定义设置。 如果你已经在想如何进行合并,继续往下看就行。实际上,这是一项相当简单的工作。

如何在 Arch Linux 中比较和合并 .pacnew 文件

既然我们已经讲解了理论,现在是动手实践的时候了。第一步,自然是检查我们的 Arch 系统中存在哪些 .pacnew 文件。为此,Arch 提供了一个方便的小工具叫做 pacdiff,它会帮你找到这些文件。

不过它默认并未包含——它是 pacman-contrib 套件的一部分,所以我们先从安装它开始。

sudo pacman -S pacman-contrib

很简单,对吧?现在我们已经准备好了 pacdiff,让我们来看一下 Arch 系统上所有可用的 .pacnew 文件。

pacdiff -o

列出 Arch Linux 系统上的 .pacnew 文件。

正如你在上图中所看到的,系统更新悄悄地创建了六个 .pacnew 文件——它们就在那里,等着我们去处理。接下来我们可以这样做。

最简单也是最明显的方法——你可能已经想到了——就是直接将 .pacnew 文件复制(或移动)到原文件上。类似这样:

cp /etc/example.conf.pacnew /etc/example.conf

然后,你可以删除 .pacnew 文件并继续。当然,这在某些情况下可能有效,但通常来说,这不是一个好主意,我强烈不建议这样做。

原因如下:首先,它让你完全不了解新版本中到底发生了什么变化。你只是盲目信任它不会破坏任何东西。其次,这种方法只有在你完全确定自己之前没有修改过该文件时才能奏效——如果你之前修改过,那么你将失去所有宝贵的手动修改内容。

但最重要的是,你是 Arch 用户(顺便说一句)。这意味着你应该对命令行通常会引发的一些用户的担忧免疫(不幸的是)。所以我建议不要走捷径,而是遵循一个正确且一致的处理 .pacnew 文件的流程,我会立即展示给你。

要比较你的原始文件与其 .pacnew 版本之间的差异,并合并任何更改,你可以使用随 vim 软件包提供的方便工具 vimdiff。所以,如果你还没有安装它,只需运行:

sudo pacman -S vim

我相信很多人已经准备好抱怨了,那么为什么不让事情更简单一些,使用现有的许多图形界面应用程序呢?原因很简单——这些应用通常会引入大量额外的依赖,比如 Qt 或 GTK,具体取决于你的桌面环境,而这并不适合所有配置。我更喜欢一个通用的解决方案,对于这项工作,基于终端的 vimdiff 就非常合适。

因此,执行以下操作,pacdiff 将默认调用 vimdiff:

sudo pacdiff

我们将使用 vimdiff 来比较和合并文件之间的差异。

为了澄清,这将会逐个处理它找到的所有 .pacnew 文件。不幸的是,pacdiff 本身并不接受文件名参数。这里的关键是你拥有的选项:

  • 查看(V): 打开当前文件与 .pacnew 版本的并排比较。
  • 合并(M): 尝试以交互方式合并 .pacnew 文件和现有文件。
  • 跳过:暂时忽略此文件并移动到下一个文件。
  • 删除 pacnew: 删除 .pacnew 文件而不影响您当前的配置。
  • 使用 pacnew 覆盖:用 .pacnew 版本替换你现有的配置文件。
  • (退出): 立即退出 pacdiff,而不处理其余文件。

当然,下一步是查看差异。按 “v”,然后按 “Enter”,你将进入下一个 vimdiff 屏幕,显示 pacdiff 找到的第一个文件——在这个例子中是 /etc/hosts。

使用 vimdiff 查看差异。

要记住的关键点是,这将作为我们接下来操作的基础:左侧窗格显示 .pacnew 文件,而右侧窗格显示系统实际使用的当前原始文件。

在这里,您可以使用强大的 diff 命令 dp 和 do 在两个比较的文件之间移动更改。

  • dp:将当前文件的差异复制(puts)到另一个文件中。可以这样理解:“我想把这个更改推送到那里。”
  • do:将另一个文件的差异复制(获取)到当前文件中。可以这样理解:“我想把那个更改拿过来应用到这里。”

只需将光标移动到不同的那一行,然后输入上面两个命令中的一个以进行所需的更改。完成后,输入 Vim 命令 :wqa(w 写入并 q 退出 a 所有)并按“回车”——这将带你回到主屏幕。

保存所有更改并退出。

由于我们已经应用了所有的修改,可以通过输入 r 并按下“回车”安全地删除 .pacnew 文件。文件将被删除,pacdiff 将自动进入下一个文件,你将再次被询问接下来要做什么。

删除 .pacnew 文件,然后继续处理下一个。

如你所见,你可以通过合并或直接覆盖文件来跳过所有这些,但我强烈建议不要这样做。最安全(也是最专业)的做法是亲自查看每个更改,并决定如何处理它们。

最后,简单提醒一下:当你处于比较模式(vimdiff)时,可以通过按 Ctrl + W,然后使用左箭头或右箭头键将光标移到你想要的窗格,从而在窗格之间切换。

底线

管理 .pacnew 文件只是维护健康且可预测的 Arch Linux 系统的一部分。正如你已经了解到的,这些文件的出现是为了保护你的自定义配置不被覆盖,但它们也表明上游发生了某些变化。如何整合这些变化完全取决于你自己审查和决定。

欲了解更多信息,我还建议查阅 Arch Wiki。

感谢您的时间!希望我的小建议对您有所帮助。一如既往,任何反馈都非常感激。