在使用 pacman 移除一個帶有配置文檔的軟體包時,pacman 通常會將配置文檔複製為一個後綴名為 .pacsave
的備份文檔。
同樣的,當 pacman 升級一個軟體包,而新軟體包含有與與當前配置不同的新配置文件時,pacman 會將新配置寫入 pacnew
文件。當寫入這些文件時,pacman 會輸出提示信息。
為什麼會創建這些文件
當升級某個軟體包(命令為 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
這些文件需要用戶手動干預,我們推薦您在每次軟體包升級或卸載之後馬上處理它們。如果不處理,不當的配置可能導致軟體功能出問題,甚至完全無法使用。
包備份文件
軟體包的 PKGBUILD 文件指定了升級或卸載軟體包時需要被保存或備份的文件。例如,PulseAudio 的 PKGBUILD 文件包含如下行:
backup=(etc/pulse/{daemon.conf,default.pa,system.pa})
安裝後,可以使用 pacman -Qii 軟體包名
從 pacman 資料庫中查詢此列表。
要阻止任何軟體包覆蓋某文件,請閱讀 Pacman#在升級時跳過文件.
類型說明
.pacnew
對於每一個 #包備份文件,在升級過程中,Pacman 會將從文件內容生成的三個 MD5 校驗和進行交叉比較:一個校驗和對應最初由軟體包安裝的版本,一個對應當前在文件系統中的版本,還有一個對應新軟體包中的版本。如果當前在文件系統中的文件版本已經被修改過,那麼Pacman無法知道如何將這些更改與新版本合併。因此,在升級過程中,為了避免覆蓋已修改的文件,Pacman會保存新版本,並附加上 .pacnew
後綴,而不會對已修改的版本做任何改動。
.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 的文本界面和有用的嚮導。沒有合併或自動合併功能。
- etc-update — Gentoo 的實用工具,兼容包括 Arch 在內的其他發行版。它提供了一個簡單的命令行界面來查看、合併和交互式編輯更改。像注釋這樣的簡單更改可以自動合併。
-
p3wm — 三方合併
.pacnew
文件。它可以自動合併簡單更改。如果發生衝突,它將啟動 vimdiff、meld 或 kdiff3 來解決它們。
-
pacnews-git — 一個簡單的腳本,旨在找到所有的
.pacnew
文件,然後用 vimdiff 編輯它們。
- pacfiles-mode — 一個用於 Emacs 管理和合併.pacnew文件的包。
- pacdiff-pacman-hook-git — Pacman 鉤子,自動運行 pacdiff。
參閱
- Arch Linux 論壇: 處理 .pacnew 文件