• Pacnew和Pacsave文件


    原文: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扩展名,且在其他软件包移除之后仍然存在于文件系统中。

    注意:使用命令pacman -R的-n选项会移除指定软件包中的所有文件,因此不会创建.pacsave文件。

    .pacorig

    若在安装或升级某个软件包时,遇到某个文件(通常配置文件通常在/etc目录下)不属于任何已安装的软件包,但却被列在当前操作的软件包的备份文件(backup)中,那么该文件将被以扩展名.pacorig保存并用软件包中的文件版本替代。通常这种情况发生在某个配置文件从一个软件包移动至另一个。如果此文件没有被列在备份文件(backup)中,pacman将会退出并报文件冲突错误。

    注意:因为.pacorig文件往往是在特定环境创建的,所以没有通用的方法来处理它们。如果是一个已知的情况,咨询Arch News以获得处理指令可能会有所帮助。

    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.资源


  • 相关阅读:
    火狐下,td 的 bug;
    在centos6.3用yum安装redis
    Linux系统下修改环境变量PATH路径的三种方法
    网络文件常常提到类似"./run.sh"的数据,这个命令的意义是什么?
    DataGridView的自定义列排序
    【Linux】linux常用基本命令
    用户名 不在 sudoers文件中,此事将被报告。(转)
    将XML文件中的内容转换为Json对象
    C# 加载xml文档文件及加载xml字符串
    增加不存在的列
  • 原文地址:https://www.cnblogs.com/zechen11/p/2116667.html
Copyright © 2020-2023  润新知