出自 Arch Linux 中文维基

在使用 pacman 移除一個帶有配置文檔的軟體包時,pacman 通常會將配置文檔複製為一個後綴名為 .pacsave 的備份文檔。

同樣的,當 pacman 升級一個軟體包,而新軟體包含有與與當前配置不同的新配置文件時,pacman 會將新配置寫入 pacnew 文件。當寫入這些文件時,pacman 會輸出提示信息。

為什麼會創建這些文件

當升級某個軟體包(命令為 pacman -Syupacman -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

這些文件需要用戶手動干預,我們推薦您在每次軟體包升級或卸載之後馬上處理它們。如果不處理,不當的配置可能導致軟體功能出問題,甚至完全無法使用。

包備份文件

軟體包的 PKGBUILD 文件指定了升級或卸載軟體包時需要被保存或備份的文件。例如,PulseAudioPKGBUILD 文件包含如下行:

backup=(etc/pulse/{daemon.conf,default.pa,system.pa})

安裝後,可以使用 pacman -Qii 軟體包名 從 pacman 資料庫中查詢此列表。

要阻止任何軟體包覆蓋某文件,請閱讀 Pacman#在升級時跳過文件.

類型說明

.pacnew

對於每一個 #包備份文件,在升級過程中,Pacman 會將從文件內容生成的三個 MD5 校驗和進行交叉比較:一個校驗和對應最初由軟體包安裝的版本,一個對應當前在文件系統中的版本,還有一個對應新軟體包中的版本。如果當前在文件系統中的文件版本已經被修改過,那麼Pacman無法知道如何將這些更改與新版本合併。因此,在升級過程中,為了避免覆蓋已修改的文件,Pacman會保存新版本,並附加上 .pacnew 後綴,而不會對已修改的版本做任何改動。

注意: 軟體包的安裝可能會導致其他軟體包所擁有的文件發生變化(例如 FS#77404)。因此,即使您沒有手動更改某些文件,也可能生成 .pacnew 文件。

進一步詳細說明,三重 MD5 校驗和對比會導致以下幾種結果之一:

原始版本 = X,當前版本 = X,新版本 = X
所有三個版本的內容完全相同,所以覆蓋是沒有問題的。用新版本覆蓋當前版本,並且不通知用戶(儘管文件內容相同,這次覆蓋將會更新文件系統的有關該文件的安裝、修改及訪問時間的信息,並確保應用任何文件權限變更)。
原始版本 = X,當前版本 = X,新版本 = Y
當前版本的內容與原始版本一致,但新版本不同。由於用戶沒有修改當前版本,而新版本可能包含改進或修復,所以用新版本覆蓋當前版本,並且不通知用戶。這是 Pacman 能夠執行的唯一一種自動合併新更改的情況。
原始版本 = X,當前版本 = Y,新版本 = X
原始軟體包和新軟體包都包含了文件的完全相同版本,但是當前文件系統中的版本已被修改。保留當前版本,並丟棄新版本而不通知用戶。
原始版本 = X,當前版本 = Y,新版本 = Y
新版本與當前版本完全相同。用新版本覆蓋當前版本,並且不通知用戶(儘管文件內容相同,這次覆蓋將會更新文件系統的有關該文件的安裝、修改及訪問時間的信息,並確保應用任何文件權限變更)。
原始版本 = X,當前版本 = Y,新版本 = Z
所有三個版本都不相同,因此保留當前版本,並以 .pacnew 後綴安裝新版本,同時警告用戶有關新版本的存在。用戶需要手動合併新版本中必要的更改到當前版本中。

有時升級後的軟體包罕見地包含了一個之前版本不存在的備份文件,這種情況會被正確處理為 X/Y/Y 或 X/Y/Z,其中 X 代表不存在。

.pacsave

如果用戶修改了 backup 中指定的某個文件,那麼那個文件將被重命名,帶上 .pacsave 擴展名,且在其他軟體包移除之後仍然存在於文件系統中。

注意: 使用命令 pacman -R 中的 -n 選項會移除指定軟體包中的所有文件,因此不會創建 .pacsave 文件。

定位 .pac* 文件

Pacman 不會自動處理 .pacnew 文件,需要自己維護。下面提供幫助你處理這些文件的一些工具。如果需要手動處理,首先需要找到這些文件。在升級或移除大量軟體包時,可能會忽略一些更新的 .pac* 文件。可以使用以下方法之一檢查存在的 .pac* 文件:

在用於存放大多數全局配置文件的 /etc 目錄中搜索:

$ find /etc -regextype posix-extended -regex ".+\.pac(new|save)" 2> /dev/null

或者在將上述命令中的 /etc 替換為 / 以在整個磁碟上進行搜索(在這種情況下,你可能想要選擇性地跳過某些目錄以加快搜索速度)。

如果你安裝了 locate,還可以使用它來搜索。首先需要更新索引資料庫:

# updatedb

然後:

$ locate --existing --regex "\.pac(new|save)$"

或者使用 pacman 日誌來找到它們:

$ egrep "pac(new|save)" /var/log/pacman.log
注意: 日誌不會跟蹤當前在文件系統中的文件,也不會跟蹤已經被刪除的文件;上述命令將列出系統上曾經存在過的所有 .pac* 文件。為了只獲取最近的10個 .pac* 文件,可以將結果通過管道傳輸給 tail 命令。

管理 .pac* 文件

pacdiff

pacman-contrib 提供了一個簡單的 pacdiff(8) 工具來管理 .pac* 文件。

它會搜索 .pacnew.pacsave.pacorig 文件,然後提示對它們採取行動。

默認情況下,它使用 --pacmandb 來搜索當前已安裝包的 backup 列表信息。如果這不夠用,您可以指定 --find--locate 來進行更徹底的搜索。

默認情況下,它使用 vimdiff,但您可以通過 DIFFPROG=your_editor pacdiff 指定一個不同的工具。查看應用程式列表/工具#比較,差異,合併了解其他常見的比較工具。

第三方工具

一些第三方工具提供了不同程度的自動化功能來處理這些任務:

  • dotpac — 基本的交互式腳本,帶有基於 ncurses 的文本界面和有用的嚮導。沒有合併或自動合併功能。
https://github.com/AladW/dotpac || dotpacAUR
  • etc-updateGentoo 的實用工具,兼容包括 Arch 在內的其他發行版。它提供了一個簡單的命令行界面來查看、合併和交互式編輯更改。像注釋這樣的簡單更改可以自動合併。
Gentoo:Handbook:Parts/Portage/Tools#etc-update || etc-update
  • p3wm — 三方合併 .pacnew 文件。它可以自動合併簡單更改。如果發生衝突,它將啟動 vimdiff、meld 或 kdiff3 來解決它們。
https://github.com/5long/p3wm || p3wmAUR
  • pacnews-git — 一個簡單的腳本,旨在找到所有的 .pacnew 文件,然後用 vimdiff 編輯它們。
https://github.com/pbrisbin/scripts/blob/master/pacnews || pacnews-gitAUR
  • pacfiles-mode — 一個用於 Emacs 管理和合併.pacnew文件的包。
https://github.com/UndeadKernel/pacfiles-mode || 在 melpa 中可用
  • pacdiff-pacman-hook-git — Pacman 鉤子,自動運行 pacdiff。
https://github.com/desbma/pacman-hooks || pacdiff-pacman-hook-gitAUR


參閱