原文:https://wiki.archlinux.org/index.php/Pacnew_and_Pacsave_Files
该页被建议与pacman页合并,可能当你看到这篇文章的时候,以上链接已经失效,请访问pacman页查找。
翻译:
水平不行,求指正!
Pacnew和Pacsave文件
目录
1.由此开始
2.包备份文件(Package backup files)
3.类型说明
3.1.pacnew类型
3.2.pacsave类型
3.3.pacorig类型
4.定位.pac*文件
5.管理.pacnew文件
5.1.用Meld更新不同之处
6.资源
1.由此开始
在升级或卸载软件包时,pacman会通知你文件(通常放置在/etc中)被冠以后缀名.pacnew或被备份为后缀名为.pacsave的文件。
当升级某个软件包(命令为pacman -Syu,pacman -Su或者pacman -U)时,可能会创建一个.pacnew文件,以避免覆盖一个之前被用户修改过的已存在的文件。此时,pacman会输出如下信息:
warning: /etc/pam.d/usermod installed as /etc/pam.d/usermod.pacnew
当卸载某个软件包(命令为pacman -R)或升级某个软件包(该软件包必须首先被卸载)时,可能会创建一个.pacsave文件。当pacman数据库记录了该软件包的某个文件应当被备份时,pacman将会创建一个.pacsave文件。此时,pacman会输出如下信息:
warning: /etc/pam.d/usermod saved as /etc/pam.d/usermod.pacsave
这些文件需要用户手动干预,好的做法是:每次软件包升级或卸载之后马上处理它们。如果不处理,不当的配置可能导致软件功能出问题,甚至完全无法使用。
2.包备份文件
软件包的PKGBUILD文件指定了升级或卸载软件包时哪写文件需要被保存或备份。例如,puslseaudio的PKGBUILD文件包含如下行:
backup=('etc/pulse/client.conf' 'etc/pulse/daemon.conf' 'etc/pulse/default.pa')
3.类型说明
不同类型的.pac*文件。
.pacnew
对于包升级过程中的每个备份文件,pacman会交叉校验3个版本文件内容生成的md5值:一个为软件包最初创建的版本,一个值为文件系统中当前的版本,还有一个为新软件包中的版本。如果软件包安装的版本被修改为文件系统中当前的版本,pacman不知道如何将这些修改合并到新版本的文件中。因此,pacman以扩展名.pacnew保存新版本的文件,修改过的版本保持不变,而不是被覆盖。
更细一步来说,3路MD5值校验结果为下述输出之一:
original = X, current = X, new = X
三个版本的文件具有相同的内容,因此覆盖不会产生问题。pacman将用新版本覆盖当前版本而不通知用户。(尽管文件内容相同,覆盖操作会更新文件系统中和文件创建,修改和访问时间有关的信息,也确保了任何文件权限的修改被实施。)
original = X, current = X, new = Y
当前版本文件的内容和原始版本的相同,但与新版本不同。既然用户没有修改过当前版本文件,且新版本可能包含改进和bug修正,pacman用新版本覆盖当前版本,而不通知用户。这是pacman有能力执行的唯一一个新改动的自动合并。
original = X, current = Y, new = X
原始软件包和新软件包都包含版本完全相同的文件,但当前文件系统中的版本是被修改过的。此时pacman保留当前版本,忽略新版本,且不通知用户。
original = X, current = Y, new = Y
新版本和当前版本相同。此时pacman用新版本覆盖当前版本且不通知用户。(尽管文件内容相同,覆盖操作会更新文件系统中和文件创建,修改和访问时间有关的信息,也确保了任何文件权限的修改被实施。)
original = X, current = Y, new = Z
三个版本的文件都不相同,所以保留当前版本,以扩展名.pacnew创建新版本,且警告用户创建了新版本。希望用户手动将需要的更改由新版本合并至当前版本。
.pacsave
如果用户修改了backup(备份)中指定的某个文件,那么那个文件将被重命名,带上.pacsave扩展名,且在其他软件包移除之后仍然存在于文件系统中。
.pacorig
若在安装或升级某个软件包时,遇到某个文件(通常配置文件通常在/etc目录下)不属于任何已安装的软件包,但却被列在当前操作的软件包的备份文件(backup)中,那么该文件将被以扩展名.pacorig保存并用软件包中的文件版本替代。通常这种情况发生在某个配置文件从一个软件包移动至另一个。如果此文件没有被列在备份文件(backup)中,pacman将会退出并报文件冲突错误。
4.定位.pac*文件
Arch Linux不为.pacnew文件提供官方程序。你需要自己维护这些文件;下一节介绍了一些工具。手动维护这些文件,你首先需要确定这些文件的位置。当升级或卸载大量软件包时,文件可能错过升级了的*.pac*的信息。为了寻找是否安装了*.pac*文件:
仅搜索绝大多数全局配置文件所存放的位置:
find /etc -name "*.pac*"
或全盘搜索:
find / -name "*.pac*"
你还可以使用locate(还无法索引一些新文件),如果你安装了的话:
locate -e --regex "\.pac"
或者使用pacman日志来找到它们:
egrep "pac(new|orig|save)" /var/log/pacman.log
注意:日志不会记录文件系统里现在有哪些文件,也不会记录那些文件已经被移除。
5.管理.pacnew文件
一旦现有的.pacnew文件被找到,用户可能会使用通用合并工具例如vimdiff,ediff(emacs的一部分),meld(Gnome图形工具),或者Kompare(KDE图形工具)来手动处理,然后删除.pacnew文件。
一些第三方的程序为这些任务提供各种级别的自动化处理,可从community源和user repository (AUR)获取。
- Dotpac- 基于ncurses的字符界面基础互交脚本和有用的逐步解说。无合并或自动合并特性。
- pacdiff - 超小型无文档(undocumented是这个意思吗?)CLI(命令行界面)脚本。是community源中pacman-contrib软件包的一部分。
- pacdiffviewer - 带自动合并功能的全功能互交式CLI(命令行界面)脚本.
yaourt
包的一部分。 - diffpac- 独立的pacdiffviewer替代品。
- Yaourt - 支持AUR源的包管理器。使用yaourt -c以比较,替换和合并配置文件。
5.1用meld更新不同之处
在一个循环中使用meld可以更新配置文件。这个脚本一个文件一个文件的循环以便你能处理不同之处。
#!/bin/bash # pacnew-update - merge *.pacnew files with original configurations with meld pacnew=$(find /etc -type f -name "*.pacnew") for config in $pacnew; do # Merge with meld kdesu meld ${config%\.*} $config & wait done
以上脚本用KDE的kdesu来以图形界面的方式获取sudo权限。请在Gnome/XFCE桌面环境中使用gksudo。你可以选择性的添加sudo rm -i $config以删除已经修改过的文件,但是该命令(可能)需要全系统权限。更好的方法是:修改玩所有文件后进入root,用以下命令删除*.pacnew文件:
find /etc -type f -name "*.pacnew" -exec rm {} \;
6.资源
- Arch Linux 论坛:Dealing With .pacnew Files