pacman/pacnew 与 pacsave - Arch Linux 中文维基

跳至內容

# pacman/pacnew 与 pacsave

出自 Arch Linux 中文维基
< Pacman

翻譯狀態：

- 本文（或部分內容）譯自 Pacman/Pacnew and Pacsave，最近一次同步於 2024-10-01，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

在使用 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` 後綴，而不會對已修改的版本做任何改動。

注意：軟體包的安裝可能會導致其他軟體包所擁有的文件發生變化（例如 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-update — Gentoo 的實用工具，兼容包括 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

## 參閱

- Arch Linux 論壇: 處理 .pacnew 文件

分類：​

- 包管理器

pacman/pacnew 与 pacsave
新增話題