pacman/提示和技巧 - Arch Linux 中文维基

跳至內容

# pacman/提示和技巧

出自 Arch Linux 中文维基
< Pacman

翻譯狀態：

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

相關文章

- 鏡像源
- 創建軟體包

通用優化請參考核心工具和 Bash。

## 維護

注意：您也可以使用 `grep -Fxf` 或 `grep -Fxvf`，而不是像下面的章節中一樣使用 comm（需要排序輸入和 sort）。

另見系統維護。

### 查詢軟體包

#### 未使用的軟體庫

默認情況下，`pacman.conf` 中列出的軟體庫用於同步、搜索、安裝和升級。可以通過更改配置來增加靈活性，例如僅使用某些軟體庫進行搜索[1]：

    /etc/pacman.conf

    ...
    [multilib]
    Usage = Sync Search
    ...

參見 pacman.conf(5) § REPOSITORY SECTIONS。

#### 帶有版本

您可能希望獲得已安裝的軟體包及其版本的列表，這在報告錯誤或討論已安裝的軟體包時非常有用。

- 所有明確安裝的軟體包：`pacman -Qe`。
- 列出 `group` 軟體包組中的所有軟體包：`pacman -Sg group`。
- 所有外部軟體包 (通常是手動下載安裝，或者已經從資料庫中刪除)：`pacman -Qm`。
- 列出所有從資料庫中安裝的軟體包：`pacman -Qn`。
- 所有明確安裝的，存在於資料庫而且不是直接或可選依賴的軟體包：`pacman -Qent`。
- 按正則表達式查詢軟體包：`pacman -Qs regex`。
- 按正則表達式查詢軟體包，自定義輸出格式（需要 expac包）：`expac -s "%-30n %v" regex`。
- 從資料庫查詢軟體包，（如如需iwd包）: `pacman -Ss iwd`

#### 帶有大小

在嘗試釋放硬碟上的空間時，弄清楚哪些軟體包最大可能非常有用。這裡有兩個選項：獲取單個包的大小，或者獲取包的大小及其依賴關係。

##### 單個包

用下面命令查看單個軟體包的大小:

    $ LC_ALL=C.UTF-8 pacman -Qi | awk '/^Name/{name=$3} /^Installed Size/{print $4$5, name}' | LC_ALL=C.UTF-8 sort -h

##### 軟體包和依賴項

要列出軟體包及其依賴項，

- 安裝 expac包 並運行 `expac -H M '%m\t%n' | sort -h`。
- 運行 pacgraphAUR 帶 `-c` 選項。

查詢軟體包的下載大小（不加 `packages` 將查詢所有軟體包）：

    $ expac -S -H M '%k\t%n' packages

要列出不屬於元軟體包 base包 或軟體包組 xorg包組 中的明確安裝的包，帶大小和描述：

    $ expac -H M "%011m\t%-20n\t%10d" $(comm -23 <(pacman -Qqen | sort) <({ pacman -Qqg xorg; expac -l '\n' '%E' base; } | sort -u)) | sort -n

要列出標記為可升級的軟體包及其下載大小：

    $ expac -S -H M '%k\t%n' $(pacman -Qqu) | sort -sh

要僅列出可選依賴：

    $ expac -S "%o" package

#### 按日期查詢

用 expac包 查詢最近安裝的 20 個軟體包：

    $ expac --timefmt='%Y-%m-%d %T' '%l\t%n' | sort | tail -n 20

或者，用從 epoch(1970-01-01 UTC) 開始的秒數：

    $ expac --timefmt=%s '%l\t%n' | sort -n | tail -n 20

#### 不在指定的包組、軟體庫或元包中

注意：要獲取作為依賴項安裝但已沒有任何包依賴它的包的列表，見#刪除未使用的軟體包（孤立軟體包）.

列出不在 base包 元軟體包中的明確安裝的軟體包：

    $ comm -23 <(pacman -Qqe | sort) <(expac -l '\n' '%E' base | sort)

列出不在 base包 元軟體包或 xorg包組 軟體包組中的明確安裝的軟體包：

    $ comm -23 <(pacman -Qqe | sort) <({ pacman -Qqg xorg; expac -l '\n' '%E' base; } | sort -u)

列出所有沒有任何軟體包依賴它的已安裝軟體包，並且這些軟體包不在 base包 元軟體包或 xorg包組 軟體包組中：

    $ comm -23 <(pacman -Qqt | sort) <({ pacman -Qqg xorg; echo base; } | sort -u)

同上，但帶描述：

    $ expac -H M '%-20n\t%10d' $(comm -23 <(pacman -Qqt | sort) <({ pacman -Qqg xorg; echo base; } | sort -u))

列出不在指定軟體庫 repo_name 中的所有已安裝軟體包（可以同時檢查多個軟體庫）：

    $ comm -23 <(pacman -Qq | sort) <(pacman -Sql repo_name | sort)

列出在指定軟體庫 repo_name 中的所有已安裝軟體包（可以同時檢查多個軟體庫）：

    $ comm -12 <(pacman -Qq | sort) <(pacman -Sql repo_name | sort)

列出 Arch Linux ISO 上不在 base包 元軟體包中的所有包：

    $ comm -23 <(curl https://gitlab.archlinux.org/archlinux/archiso/-/raw/master/configs/releng/packages.x86_64) <(expac -l '\n' '%E' base | sort)

提示：或者，使用 moreutils包 包中的 `combine`（而不是 `comm`），該命令的語法更容易記住。見 combine(1)。

#### 開發版軟體包

要列出所有開發版/不穩定軟體包，請運行：

    $ pacman -Qq | grep -Ee '-(bzr|cvs|darcs|git|hg|svn)$'

#### 軟體包的依賴項

要獲得包的依賴項列表，最簡單的解決方案是讀取以下命令的輸出：

    $ pacman -Qi package

要實現自動化，而不是分析 pacman 輸出這種容易出錯的方法，使用 expac包：

    $ expac -S '%D' package

#### 帶有可選依賴

要列出明確安裝的軟體包及其可選依賴，請運行：

    $ LC_ALL=C.UTF-8 pacman -Qei | sed '/^[^NO ]/d;/None$/d' | awk 'BEGIN{RS=ORS="\n\n";FS=OFS="\n\\S"} /Optional Deps/ {print $1"\nO"$2}'

或者，使用 expac包：

    $ expac -d '\n\n' -l '\n\t' -Q '%n\n\t%O' $(pacman -Qeq)

要列出它們並忽略已安裝的可選依賴，請運行：

    $ LC_ALL=C.UTF-8 pacman -Qei | sed '/^[^NO ]/d;/None$/d' | awk 'BEGIN{RS=ORS="\n\n";FS=OFS="\n\\S"} /Optional Deps/ {print $1"\nO"$2}' | sed 's/^Optional Deps   ://;/\[installed\]$/d;s/\s\+/ /'

#### 查看特定打包者打包的所有軟體包

這裡用到了 gawk包。

    $ pacman -Qi | awk -F': ' '/^名字/ {name=$2} /^打包者/ && $2 ~ /特定打包者/ {print name}'

### 瀏覽軟體包

要瀏覽所有已安裝軟體包並即時預覽每個軟體包：

    $ pacman -Qq | fzf --preview 'pacman -Qil {}' --layout=reverse --bind 'enter:execute(pacman -Qil {} | less)'

這使用 fzf（英語：fzf） 來顯示一個兩窗格視圖，其中列出了所有軟體包，包信息顯示在右側。

輸入字母以過濾包列表；使用箭頭鍵（或 `Ctrl-j`/`Ctrl-k`）瀏覽；按 `Enter` 在 less 下查看包信息。

要使用 fzf 以類似的方式瀏覽當前已知的所有 pacman 軟體包（已安裝和尚未安裝），請使用：

    $ pacman -Slq | fzf --preview 'pacman -Si {}' --layout=reverse

瀏覽的按鍵綁定是相同的，不過 `Enter` 不能同樣工作。

### 列出軟體包擁有的文件並帶大小

如果您發現某個特定的包使用了大量空間，並且您想知道哪些文件占了其中的大部分，那麼這個命令可能會很有用。

    $ pacman -Qlq package | grep -v '/$' | xargs -r du -h | sort -h

### 查找不屬於任何軟體包的文件

如果您的系統中有不屬於任何軟體包的零散文件（通常是由於您沒有使用包管理器安裝軟體），您可能需要查找這些文件以清理它們。

一種方法是列出所有感興趣的文件，並對照 pacman 進行檢查：

    # (export LC_ALL=C.UTF-8; comm -13 <(pacman -Qlq | sed 's,/$,,' | sort) <(find /etc /usr /opt -path /usr/lib/modules -prune -o -print | sort))

提示：lostfiles包 腳本執行類似的步驟，但還包括一個廣泛的黑名單，以從輸出中刪除常見的誤報。

### 跟蹤軟體包創建的無主文件

多數系統將通過通常的操作過程慢慢的收集一些 ghost 文件，如狀態文件、日誌、索引等。

pacutils包 中的 `pacreport` 可用於通過 `/etc/pacreport.conf` 跟蹤這些文件及其關聯（見 pacreport(1) § FILES）。

一個例子可能看起來像這樣（摘要）：

    /etc/pacreport.conf

    [Options]
    IgnoreUnowned = usr/share/applications/mimeinfo.cache

    [PkgIgnoreUnowned]
    alsa-utils = var/lib/alsa/asound.state
    bluez = var/lib/bluetooth
    ca-certificates = etc/ca-certificates/trust-source/*
    dbus = var/lib/dbus/machine-id
    glibc = etc/ld.so.cache
    grub = boot/grub/*
    linux = boot/initramfs-linux.img
    pacman = var/lib/pacman/local
    update-mime-database = usr/share/mime/magic

然後，當由 root 用戶使用 `pacreport --unowned-files` 時，如果不再安裝關聯的軟體包（或者如果已創建任何新文件），則會列出所有無主文件。

此外，aconfmgr（aconfmgr-gitAUR）允許使用配置腳本跟蹤修改的和孤立的文件。

### 刪除未使用的軟體包（孤立軟體包）

孤立軟體包是作為依賴項安裝的包，任何軟體包都不再依賴它。

由於使用 `pacman -R package` 而不是 `pacman -Rs package` 卸載軟體包，將軟體包安裝為 makedepends，或者軟體包的較新版本中刪除了依賴項，它們可能會隨著時間的推移在您的系統上累積。

遞歸刪除孤立軟體包及其配置文件：

    # pacman -Qdtq | pacman -Rns -

如果沒有孤立軟體包，將顯示錯誤 `錯誤：有參數 '-' 但標準輸入流為空`。這個是正常的，因為 `pacman -Rns` 沒有收到任何參數。可以通過在第二個命令前面加上來自 moreutils包 包的 ifne(1) 來避免該錯誤。

如果列出的軟體包中有您不想刪除的，可以通過將其標記為顯式安裝來將其從孤立軟體包列表中排除：

    # pacman -D --asexplicit package

注意：`-Qt` 僅顯示真的孤立包，要包含可選依賴，請使用 `-Qtt` .
提示：將 `pacman -Qdt` 添加到 pacman 的一個處理後鉤子用於在如果有處理產生孤立包後獲得提示。這在當有軟體包被倉庫放棄時是有用的，因為任何被拋棄的包都會成為本地的一個孤立包（除非它是被顯式安裝的）。要避免在沒有找到孤立包時「執行命令失敗」的錯誤，在你的鉤子中為 `Exec` 使用如下的指令: `/usr/bin/bash -c "/usr/bin/pacman -Qdt || /usr/bin/echo '=> 未找到。'"` 軟體包 pacman-log-orphans-hookAUR 使用類似的鉤子提供了更詳細的指示。

### 檢測更多不需要的軟體包

在某些情況下，上述方法不會檢測到所有可能不需要的包。例如，依賴環（也稱為「循環依賴」）、額外依賴（多次滿足）、一些非顯式的可選項等。

要檢測此類包：

    $ pacman -Qqd | pacman -Rsu --print -

如果要一次刪除列表中的所有包，請運行不帶 `--print` 參數的命令。

### 刪除必需的軟體包以外的所有軟體包

如果需要刪除必需的軟體包以外的所有軟體包，一種方法是將非必需包的安裝原因設置為依賴項，然後刪除所有不必要的依賴項。

首先，對於所有「顯式安裝」的包，將其安裝原因更改為「作為依賴項安裝」：

    # pacman -D --asdeps $(pacman -Qqe)

然後，將您不想刪除的必需軟體包安裝原因更改為「顯式安裝」，以避免將其作為目標：

    # pacman -D --asexplicit base linux linux-firmware

注意：

- 可以向上述命令中添加其他包，以避免被刪除。請參閱安裝指南#安裝必需的軟體包，以了解功能完備的基本系統可能需要的其他軟體包的更多信息。
- 這還將引導加載程序選擇為要刪除的包。系統應該仍然可以啟動，但如果沒有它，啟動參數可能無法更改。

最後，按照#刪除未使用的軟體包（孤立軟體包）中的說明刪除「作為依賴項安裝」的所有包。

### 獲取若干軟體包的依賴項列表

依賴項按字母順序排序，並刪除重複項。

注意：要僅顯示本地已安裝軟體包的樹，使用 `pacman -Qi`。

    $ LC_ALL=C.UTF-8 pacman -Si packages | awk -F'[:<=>]' '/^Depends/ {print $2}' | xargs -n1 | sort -u

或者，用 expac包：

    $ expac -l '\n' %E -S packages | sort -u

### 列出已更改的備份文件

要列出被 pacman 跟蹤的易被用戶更改（即列在PKGBUILD backup 數組中的文件）且已被用戶更改的文件，請使用以下命令：

    # pacman -Qii | awk '/\[modified\]/ {print $(NF - 1)}'

使用 root 權限運行此命令將確保輸出中包含只能由 root 讀取的文件（例如 `/etc/sudoers`）。

這可以用在執行選擇性系統備份或嘗試將系統配置從一台計算機複製到另一台計算機時。

提示：

- 見#列出軟體包中所有被更改的文件以列出 pacman 知道的所有更改過的文件，而不僅僅是備份文件。
- 見#查找不屬於任何軟體包的文件以列出系統中未被 pacman 跟蹤的所有文件。

### 備份 pacman 資料庫

以下命令可用於備份本地 pacman 資料庫：

    $ tar -cjf pacman_database.tar.bz2 /var/lib/pacman/local

將備份的 pacman 資料庫文件存儲在一個或多個脫機媒體上，如 U 盤、外部硬碟或 CD-R。

可以通過將 `pacman_database.tar.bz2` 文件移動到 `/` 目錄並執行以下命令來恢復資料庫：

    # tar -xjvf pacman_database.tar.bz2

注意：如果 pacman 資料庫文件已損壞，並且沒有可用的備份文件，此時重建 pacman 資料庫還是有希望的。查閱#恢復 pacman 的本地資料庫。
提示：pakbak-gitAUR 包提供了一個腳本和一個 systemd 服務來自動化任務。可以在 `/etc/pakbak.conf` 中進行配置。

### 簡單的檢查更改日誌

當維護者更新軟體包時，提交通常會以有用的方式進行注釋。用戶可以通過安裝 pacologAUR 從命令行快速檢查這些。通過 `pacolog package` 使用該實用程序列出來自官方軟體庫或 AUR 的包的最近提交消息。

## 安裝和修復

獲取和修復軟體包的額外方法。

### 從 CD/DVD 或 U 盤安裝軟體包

本文或本章節可能需要合併到#自建本地倉庫。

附註： Use as an example and avoid duplication（在 Talk:Pacman/提示和技巧 中討論）

要下載軟體包，或軟體包組：

    # cd ~/Packages
    # pacman -Syw --cachedir . base base-devel grub-bios xorg gimp
    # repo-add ./custom.db.tar.zst ./*.pkg.tar.zst

Pacman 默認情況下將引用主機安裝，但無法正確解析和下載現有的依賴項。在需要所有包和依賴項的情況下，建議創建一個臨時空白資料庫，並使用 `--dbpath` 引用它：

    # mkdir /tmp/blankdb
    # pacman -Syw --cachedir . --dbpath /tmp/blankdb base base-devel grub-bios xorg gimp
    # repo-add ./custom.db.tar.zst ./*.pkg.tar.zst

然後，您可以將「Packages」目錄刻錄到光碟（如 CD、DVD）或將其傳輸到U盤、外部硬碟等。

1. 掛載媒體：

對於光碟驅動器：

    # mount --mkdir /dev/sr0 /mnt/repo

對於 USB 快閃記憶體驅動器，硬碟驅動器等：

    # mount --mkdir /dev/sdxY /mnt/repo

2. 編輯 `pacman.conf` 並將此存儲庫添加到其他存儲庫（例如，extra、core 等）之前。這很重要。不要只取消對底部的注釋。這樣可以確保 CD/DVD/USB 中的文件優先於標準存儲庫中的文件：

    /etc/pacman.conf

    [custom]
    SigLevel = PackageRequired
    Server = file:///mnt/repo/Packages

3. 最後，同步 pacman 資料庫，以便能夠使用新的存儲庫：

    # pacman -Syu

### 自建本地倉庫

使用 pacman 中包含的 repo-add 腳本為個人軟體倉庫生成資料庫。請使用 `repo-add --help` 獲取有關其用法的詳細信息。 軟體包資料庫是一個可以壓縮的 tar 文件。有效的擴展名為 .db 或 .files，後跟歸檔擴展名.tar, .tar.gz, .tar.bz2, .tar.xz, .tar.zst, 或 .tar.Z。文件不需要存在，但所有父目錄都必須存在。

要向資料庫中添加新包，或替換資料庫中現有包的舊版本，請運行：

    $ repo-add /path/to/repo.db.tar.zst /path/to/package-1.0-1-x86_64.pkg.tar.zst

當使用 repo-add 時，資料庫和包不需要位於同一目錄中，但請記住，當和該資料庫一起使用 pacman 時，它們應該在一起。將要加入倉庫中的所有建好的包存儲在一個目錄中，還允許使用 shell glob 擴展一次添加或更新多個包：

    $ repo-add /path/to/repo.db.tar.zst /path/to/*.pkg.tar.zst

警告：repo-add 以與命令行上傳遞的順序相同的順序將條目添加到資料庫中。如果涉及同一軟體包的多個版本，必須小心確保最後添加正確的版本。特別注意，shell 使用的詞法順序取決於語言環境，並且不同於 pacman 使用的 vercmp(8) 順序。

如果您希望支持多個架構，則應採取預防措施以防止發生錯誤。每個架構都應有自己的目錄樹：

    $ tree ~/customrepo/ | sed "s/$(uname -m)/arch/g"

    /home/archie/customrepo/
    └── arch
        ├── customrepo.db -> customrepo.db.tar.zst
        ├── customrepo.db.tar.zst
        ├── customrepo.files -> customrepo.files.tar.zst
        ├── customrepo.files.tar.zst
        └── personal-website-git-b99cce0-1-arch.pkg.tar.zst

    1 directory, 5 files

repo-add 可執行文件檢查包軟體是否適合。如果不是這樣，您將遇到類似於以下內容的錯誤消息：

    ==> 错误： '/home/archie/customrepo/arch/foo-arch.pkg.tar.zst' 未包含有效的数据库存档扩展名。

repo-remove 用於從軟體包資料庫中刪除包，命令行中只指定包名。

    $ repo-remove /path/to/repo.db.tar.zst pkgname

創建本地倉庫資料庫後，將倉庫添加到要使用該倉庫的每個系統的 `pacman.conf` 中。自定義倉庫的一個示例在 `pacman.conf` 中。倉庫的名稱是省略了文件擴展名的資料庫文件名。在上面的示例中，倉庫名僅為 repo。使用 `file://` URL 或通過 HTTP 使用 `http://localhost/path/to/directory` 引用倉庫的位置。

如果願意，可以將自定義倉庫添加到非官方用戶倉庫列表中，這樣社區就可以從中受益。

### 在網絡上共享 pacman 緩存

本文或本章節可能需要合併到Package_Proxy_Cache。

附註： Same topic（在 Talk:Pacman/提示和技巧 中討論）

如果你碰巧在你的區域網上運行了幾個 Arch boxes，你可以共享軟體包，這樣可以大大減少下載時間。請記住，你不應在不同的體系結構（即 i686 和 x86_64）之間共享，否則會遇到問題。

#### 只讀緩存

Pacman 6.1.0 直接支持緩存伺服器。緩存伺服器將在任何非緩存伺服器之前嘗試，不會因為 HTTP 404 下載錯誤而從伺服器池中移除，並且不會用於資料庫文件。

如果您正在尋找快速解決方案，只需運行基本臨時網絡伺服器，其他計算機可以將其用作緩存伺服器。

使用 Python http.server 模塊開始提供此目錄：

    $ python -m http.server -d /var/cache/pacman/pkg/

提示：默認情況下，Python `http.server` 會監聽任何接口的埠 `8000`。要使用其他埠或僅綁定到特定地址，只需添加一個參數和另一個參數：

    $ python -m http.server -d /var/cache/pacman/pkg/ --bind 127.0.0.1 8080

然後在每台客戶機上編輯 `/etc/pacman.d/mirrorlist`，將此伺服器添加為緩存伺服器：

    /etc/pacman.d/mirrorlist

    CacheServer = http://server-ip:port

警告：不要像其他條目一樣將 `/repos/$repo/os/$arch` 追加到該自定義伺服器，因為該層次結構不存在，因此查詢將失敗。

如果要尋找更獨立的解決方案，darkhttpd包 提供了一個最小的網絡伺服器。將以前的 `python` 命令替換為如：

    [http]$ darkhttpd /var/cache/pacman/pkg --no-server-id

為了方便，您還可以將 darkhttpd 作為 systemd 服務運行：見 systemd#編寫單元文件。

miniserve包，一個用 Rust 編寫的小型網絡伺服器，也可以使用：

    $ miniserve /var/cache/pacman/pkg

然後像上面一樣編輯 `/etc/pacman.d/mirrorlist`，讓 url 位於第一位。

如果您已經在為其他用途運行網絡伺服器，您可能希望將其重新用作本地倉庫伺服器。例如，如果您已經使用 nginx 服務於某個站點，則可以在埠8080上添加 nginx server 塊偵聽：

    /etc/nginx/nginx.conf

    server {
        listen 8080;
        root /var/cache/pacman/pkg;
        server_name myarchrepo.localdomain;
        try_files $uri $uri/;
    }

進行此更改後，記得重啟 `nginx.service`。

提示：無論您使用哪種網絡伺服器，請確保防火牆配置（若有）允許所需流量訪問所配置的埠，並且不允許任何不希望的流量。見 安全#網絡與防火牆。

#### 層疊掛載只讀緩存

通過層疊掛載（英語：Overlay filesystem）其 `/var/cache/pacman/pkg` 目錄，可以將本地網絡上的一台機器用作只讀包緩存。如果該伺服器已在其上安裝了其他 boxes 也使用的合理全面的最新軟體包，則這種配置是有利的。這對於在低帶寬上游的連接末端維護多台機器非常有用。

例如，要使用此方法：

    # mkdir /tmp/remote_pkg /mnt/workdir_pkg /tmp/pacman_pkg
    # sshfs remote_username@remote_pkgcache_addr:/var/cache/pacman/pkg /tmp/remote_pkg -C
    # mount -t overlay overlay -o lowerdir=/tmp/remote_pkg,upperdir=/var/cache/pacman/pkg,workdir=/mnt/workdir_pkg /tmp/pacman_pkg

注意：工作目錄必須是與上級目錄位於同一掛載設備上的空目錄。見 層疊文件系統#使用（英語：Overlay filesystem#Usage）。
提示：如果列出 `/tmp/pacman_pkg` 層疊目錄會出現錯誤，例如「Stale file handle」，請嘗試使用選項 `-o redirect_dir=off -o index=off` 進行層疊掛載。

在之後，使用選項 `--cachedir /tmp/pacman_pkg` 運行 pacman，例如：

    # pacman -Syu --cachedir /tmp/pacman_pkg

#### 分布式只讀緩存

有一些特定於 Arch 的工具可以自動發現網絡上的其他計算機，並提供包緩存。嘗試 pacredir包, pacserve（英語：pacserve）, pkgdistcacheAUR, 或 paclanAUR。pkgdistcache 使用 Avahi 而不是普通 UDP，這可能在某些家庭網絡中更好地工作，這些家庭網絡在 Wi-Fi 和以太網之間路由而不是橋接。

從歷史上看，有 PkgD 和 multipkg，但它們都已不再維護。

#### 讀寫緩存

為了在多台計算機之間共享軟體包，只需使用任何基於網絡的掛載協議共享 `/var/cache/pacman/`。本章節介紹如何使用 SSHFS 在同一本地網絡上的多台計算機之間共享包緩存和相關庫目錄。請記住，網絡共享緩存可能會很慢，這取決於文件系統的選擇以及其他因素。

首先，安裝任何基於網絡的文件系統軟體包：sshfs包, curlftpfs包, samba包 或 nfs-utils包。

提示：

- 要使用 sshfs，請考慮閱讀使用 SSH 密鑰。
- 默認情況下，smbfs 不提供包含冒號的文件名，這會導致客戶機重新下載有問題的包。若要防止這種情況，請在客戶端上使用 `mapchars` 掛載選項。

然後，要共享實際的軟體包，請在每台客戶機上從伺服器掛載 `/var/cache/pacman/pkg` 到 `/var/cache/pacman/pkg`。

警告：不要將 `/var/cache/pacman/pkg` 或其任何祖先（例如，`/var`）設置為符號連結。Pacman 希望這些是目錄。當 pacman 重新安裝或升級自己時，它將刪除符號連結並創建空目錄。然而，在事務 pacman 期間，依賴於駐留在那裡的一些文件，因此中斷更新過程。更多信息請查閱 FS#50298。

#### 使用 rsync 或 FTP 雙向同步

本地環境中的另一種方法是 rsync。選擇用於緩存的伺服器並啟用 rsync 守護程序。在客戶端上，通過 rsync 協議與此共享進行雙向同步。包含冒號的文件名對於 rsync 協議來說沒有問題。

為客戶端起草示例，在共享名稱中使用 `uname -m` 可確保依賴於架構的同步：

    # rsync ... rsync://server/share_$(uname -m)/ /var/cache/pacman/pkg/
    # pacman -Syu
    # paccache --remove --keep 3
    # rsync --delete ... /var/cache/pacman/pkg/ rsync://server/share_$(uname -m)/

如果不依賴未加密的 rsync 守護程序，更安全的選擇是通過 ssh 使用 rsync，Rsync#使用 SSH 自動備份提供了概述。

如果 rsync 在您的本地環境中不可用，簡單的 ftp 服務也適合雙向同步。lftp包 提供了 `--mirror` 和 `--delete` 選項來同步本地和遠程存儲。

#### 使用 nginx 的動態反向代理緩存

nginx 可用於將軟體包請求代理到官方上游鏡像，並將結果緩存到本地磁碟。該軟體包的所有後續請求將直接從本地緩存提供，從而最大限度地減少更新大量計算機所需的網際網路流量。

在本例中，緩存伺服器將在 `http://cache.domain.example:8080/` 上運行並將軟體包存儲在 `/srv/http/pacman-cache/` 中。

在將託管緩存的計算機上安裝 nginx。為緩存創建目錄並調整權限，以便 nginx 可以向其中寫入文件：

    # mkdir /srv/http/pacman-cache
    # chown http:http /srv/http/pacman-cache

使用 nginx pacman 緩存配置作為 `/etc/nginx/nginx.conf` 的起點。檢查 `resolver` 指令是否適合您的需要。在上游 server 塊中，使用官方鏡像的地址配置 `proxy_pass` 指令，請參閱配置文件中有關期待的格式的示例。一旦您對配置文件感到滿意就啟動並啟用 nginx。

為了使用緩存，每個 Arch Linux 計算機（包括託管緩存的計算機）必須在 `mirrorlist` 文件的頂部具有以下行：

    /etc/pacman.d/mirrorlist

    Server = http://cache.domain.example:8080/$repo/os/$arch
    ...

注意：您需要創建一個方法來清除舊包，因為緩存目錄會隨著時間的推移而不斷增長。`paccache`（由 pacman-contrib包 提供）可用於使用您選擇的保留標準自動執行此操作。例如，`find /srv/http/pacman-cache/ -type d -exec paccache -v -r -k 2 -c {} \;` 將在緩存目錄中保留最後兩個版本的包。

#### Pacoloco 代理緩存伺服器

Pacoloco 是一個易於使用的 pacman 倉庫代理緩存伺服器。它還允許自動預取緩存的包。

安裝它為 pacoloco包。打開配置文件並添加 pacman 鏡像：

    /etc/pacoloco.yaml

    port: 9129
    repos:
      mycopy:
        urls:
          - http://mirror.lty.me/archlinux
          - http://mirrors.kernel.org/archlinux

重啟 `pacoloco.service`，代理倉庫將在 `http://myserver:9129/repo/mycopy`。

#### Flexo 代理緩存伺服器

Flexo 是 pacman 倉庫的另一個代理緩存伺服器。Flexo 由 flexo-gitAUR 提供。安裝後，啟動 `flexo.service` 單元。

默認情況下，Flexo 在埠 `7878` 上運行。在 `/etc/pacman.d/mirrorlist` 的頂部加入 `Server = http://myserver:7878/$repo/os/$arch`，以便 pacman 通過 Flexo 下載軟體包。

#### 使用同步程序同步 pacman 軟體包緩存

使用 Syncthing（英語：Syncthing） 或 Resilio Sync（英語：Resilio Sync） 以同步 pacman 緩存目錄（即 `/var/cache/pacman/pkg`）。

#### 避免過度清理緩存

執行 `pacman -Sc` 清理軟體包緩存時，會刪除所有當前機器上未安裝的軟體包。由於 pacman 無法判斷軟體包是否在其他機器上安裝，這會導致移除某些還需要的軟體包。

要在清理緩存時只刪除過時的 tarballs：

    /etc/pacman.conf

    [options]
    CleanMethod = KeepCurrent

### 從文件系統重新創建軟體包

要從文件系統重新創建軟體包，請使用 fakepkgAUR。系統中的文件按原樣保存，因此任何修改都將出現在裝配的軟體包中。因此，不鼓勵分發重新創建的包；有關替代方案，請參見 Arch 構建系統和 Arch Linux Archive。

### 已安裝軟體包的列表

保留所有明確安裝的軟體包的列表對於備份系統或加快新的安裝非常有用：

    $ pacman -Qqe > pkglist.txt

注意：

- 加上選項 `-t`，其他明確安裝的軟體包依賴的軟體包不會被提及。如果從此列表中重新安裝，它們將僅作為依賴項被安裝。
- 加上選項 `-n`，將在列表中省略外部包（例如來自Arch 用戶軟體倉庫 (AUR)）。
- 使用 `comm -13 <(pacman -Qqdt | sort) <(pacman -Qqdtt | sort) > optdeplist.txt` 還可以創建一個已安裝的可選依賴項列表，這些依賴項可以使用 `--asdeps` 重新安裝。
- 使用 `pacman -Qqem > foreignpkglist.txt` 創建已明確安裝的 AUR 和其他外部包的列表。

要保持明確安裝的軟體包的最新列表（例如與版本化的 `/etc/` 結合），可以設置鉤子。例子：

    [Trigger]
    Operation = Install
    Operation = Remove
    Type = Package
    Target = *

    [Action]
    When = PostTransaction
    Exec = /bin/sh -c '/usr/bin/pacman -Qqe > /etc/pkglist.txt'

### 從列表安裝軟體包

要從以前保存的軟體包列表中安裝軟體包，而不重新安裝已經安裝的已更新的軟體包，請運行：

    # pacman -S --needed - < pkglist.txt

然而，列表中可能存在來自 AUR 或本地安裝的外部軟體包。要從列表中篩選出外部包，可以如下豐富前面的命令行：

    # pacman -S --needed $(comm -12 <(pacman -Slq | sort) <(sort pkglist.txt))

最後，要確保系統中安裝的軟體包與列表匹配，並刪除列表中未提及的所有軟體包：

    # pacman -Rsu $(comm -23 <(pacman -Qq | sort) <(sort pkglist.txt))

提示：這些任務可以自動化。有關示例，請參見 bacpacAUR, packupAUR, pacmanityAUR, 和 pugAUR。

### 列出軟體包中所有被更改的文件

如果您懷疑文件損壞（例如，由於軟體/硬體故障），但不確定文件是否損壞，您可能需要與包中的哈希值進行比較。這可以通過 pacutils包：

    # paccheck --sha256sum --quiet

有關資料庫的恢復，請見#恢復 pacman 的本地資料庫。`mtree` 文件也可以從相應的軟體包文件中提取為 `.MTREE`。

注意：當懷疑存在惡意更改時，不要按原樣使用！在這種情況下，建議採取安全防範措施，例如使用 live 介質和獨立的哈希值源。

### 重新安裝所有軟體包

要重新安裝所有本地軟體包，使用：

    # pacman -Qqn | pacman -S -

外來（AUR）軟體包必須單獨重新安裝；您可以使用 `pacman -Qqm` 列出它們。

Pacman 默認保留安裝原因。

警告：要強制覆蓋所有包，請使用 `--overwrite=*`，儘管這應該是絕對的最後手段。請見系統維護#避免某些 pacman 命令。

### 恢復 pacman 的本地資料庫

見 pacman/Restore local database。

### 從已有安裝修復 USB 系統

如果你有一個 Arch 安裝在U盤上，不小心搞壞了（比如，寫入U盤時斷電了），可以使用主機上的 Arch 修復U盤上的 Arch（假設U盤掛載在 `/newarch`）：

    # pacman -S $(pacman -Qq --dbpath /newarch/var/lib/pacman) --root /newarch --dbpath /newarch/var/lib/pacman

### 查看 .pkg 文件中的單個文件

例如，如果您想查看 systemd包 包中提供的 `/etc/systemd/logind.conf` 的內容：

    $ bsdtar -xOf /var/cache/pacman/pkg/systemd-250.4-2-x86_64.pkg.tar.zst etc/systemd/logind.conf

或者您可以使用 vim包 瀏覽歸檔：

    $ vim /var/cache/pacman/pkg/systemd-250.4-2-x86_64.pkg.tar.zst

### 查找使用舊軟體包中的庫的應用程式

運行中的進程不會自動注意到由更新引起的更改。相反，它們繼續使用舊的庫版本。由於與安全漏洞或其他 bug 相關的潛在問題以及版本不兼容性，這可能是不可取的。

依賴於更新的庫的進程可以使用 htop包 來找到，htop包 會突出顯示受影響程序的名稱，或者使用基於 lsof包 的代碼片段，該代碼片段還會列印庫的名稱：

    # lsof +c 0 | grep -w DEL | awk '1 { print $1 ": " $NF }' | sort -u

此解決方案一般將僅檢測由運行中進程打開的文件，這基本上將其限制為共享庫（`.so` 文件）。它可能會丟失一些依賴關係，例如 Java 或 Python 應用程式的依賴關係。

### 僅安裝所需語言的內容

許多軟體包會安裝多種語言的文檔和翻譯。有些程序旨在刪除這些不必要的文件，例如 localepurgeAUR，它在安裝包後運行以刪除不需要的區域設置文件。更直接的方法是通過 `/etc/pacman.conf` 中的 `NoExtract` 指令提供的，該指令可以防止這些文件被安裝。

注意：如 Pacman#跳過文件安裝到系統 中所述，「後面的規則會覆蓋前面的規則，並且可以通過在規則前添加 `!` 來否定規則。」

要防止安裝所有幫助文件的翻譯，除了 C 區域設置外，請添加：

    NoExtract = usr/share/help/* !usr/share/help/C/*

要防止安裝所有 HTML 文檔，請添加：

    NoExtract = usr/share/gtk-doc/html/*
    NoExtract = usr/share/doc/HTML/*

警告：一些用戶注意到，刪除所有區域設置會導致 dmenu, Steam, 甚至 Xorg 的意外結果。以下示例已進行調整，以避免此類問題，僅安裝英文（US）文件和所需的 C 區域設置。

要防止安裝各種 locale，除了所需的區域設置外，請添加：

    NoExtract = usr/share/locale/* usr/share/X11/locale/*/* usr/share/i18n/locales/* opt/google/chrome/locales/* !usr/share/X11/locale/C/*
    NoExtract = !usr/share/X11/locale/compose.dir !usr/share/X11/locale/iso8859-1/*
    NoExtract = !*locale*/en*/* !usr/share/*locale*/locale.*
    NoExtract = !usr/share/*locales/en_?? !usr/share/*locales/i18n* !usr/share/*locales/iso*
    NoExtract = usr/share/i18n/charmaps/* !usr/share/i18n/charmaps/UTF-8.gz !usr/share/i18n/charmaps/ANSI_X3.4-1968.gz
    NoExtract = !usr/share/*locales/trans*
    NoExtract = !usr/share/*locales/C !usr/share/*locales/POSIX

要防止安裝翻譯的 man page，請添加：

    NoExtract = usr/share/man/* !usr/share/man/man*

要防止安裝 vim-runtime包 中的語言文件，請添加：

    NoExtract = usr/share/vim/vim*/lang/*

要防止安裝 Qt 應用程式中除英文內容外的所有內容，請添加：

    NoExtract = usr/share/*/translations/*.qm usr/share/*/nls/*.qm usr/share/qt/phrasebooks/*.qph usr/share/qt/translations/*.pak !*/en-US.pak

要防止安裝 Electron 應用程式中除英文內容外的所有內容，請添加：

    NoExtract = usr/share/*/locales/*.pak opt/*/locales/*.pak usr/lib/*/locales/*.pak !*/en-US.pak

要防止安裝 LibreOffice 中的英文幫助文件，請添加：

    NoExtract = usr/lib/libreoffice/help/en-US/*

要防止安裝 OnlyOffice 中除英文內容外的所有內容，請添加：

    NoExtract = opt/onlyoffice/desktopeditors/dictionaries/* !opt/onlyoffice/desktopeditors/dictionaries/en_US/*
    NoExtract = opt/onlyoffice/desktopeditors/editors/web-apps/apps/*/main/locale/* !*/en.json
    NoExtract = opt/onlyoffice/desktopeditors/editors/web-apps/apps/*/main/resources/help/*/* !*/help/en/*
    NoExtract = opt/onlyoffice/desktopeditors/editors/web-apps/apps/*/main/resources/symboltable/* !*/en.json
    NoExtract = opt/onlyoffice/desktopeditors/editors/web-apps/apps/documenteditor/forms/locale/* !*/en.json
    NoExtract = opt/onlyoffice/desktopeditors/editors/web-apps/apps/spreadsheeteditor/main/resources/formula-lang/* !*/en.json !*/en_desc.json
    NoExtract = opt/onlyoffice/desktopeditors/converter/empty/*/* !opt/onlyoffice/desktopeditors/converter/empty/en-US/*
    NoExtract = opt/onlyoffice/desktopeditors/converter/templates/*/* !opt/onlyoffice/desktopeditors/converter/templates/EN/*

要防止安裝除英文 iBus 表情符號字典外的所有內容，請添加：

    NoExtract = usr/share/ibus/dicts/emoji-*.dict !usr/share/ibus/dicts/emoji-en.dict

### 在不良連接上安裝軟體包

當試圖從不良連接（例如在火車使用手機網絡）安裝軟體包時，請使用 `--disable-download-timeout` 選項來減少接收錯誤的可能性，例如：

    error: failed retrieving file […] Operation too slow. Less than 1 bytes/sec transferred the last 10 seconds

或

    error: failed retrieving file […] Operation timed out after 10014 milliseconds with 0 out of 0 bytes received

## 性能

本文或本節內容已經過時。

原因： 本頁是在 pacman 原生支持並行下載之前編寫的，並且應該提到，由於 pacman v6 版本，這不再是一次下載多個軟體包的唯一選項。 (在Talk:Pacman/提示和技巧討論)

### 下載速度

下載軟體包時 pacman 按照 `/etc/pacman.d/mirrorlist` 的順序使用鏡像。默認情況下位於列表頂部的鏡像可能不是最快的。要選擇更快的鏡像，請見鏡像源。

Pacman 下載軟體包的速度也可以通過啟用並行下載來提高，或者通過使用不同的應用程式來下載軟體包，而不是使用 pacman 內建的文件下載器。

不論怎樣，在做任何修改前，你必須確定擁有了最新版的 pacman。

    # pacman -Syu

#### Powerpill

Powerpill 是 pacman 的包裹程序，增加了平行下載和分段下載功能，加速下載過程。

#### wget

參見 wget#pacman 集成。

對於需要更強大代理設置的用戶來說，用 wget 比用 pacman 內建的下載方式更加方便。

要使用 `wget`，首先安裝 wget包 軟體包，然後修改 `/etc/pacman.conf` 並在其中的 `[options]` 區段將下面內容去掉注釋：

    XferCommand = /usr/bin/wget --passive-ftp --show-progress -c -q -N %u

除了將 `wget` 參數放在 `/etc/pacman.conf` 裡，你也可以直接修改 `wget` 配置文件（全局文件是 `/etc/wgetrc`，各個用戶的文件是 `$HOME/.wgetrc`）。

#### aria2

aria2 是一個具有斷點續傳和分塊下載功能的輕量級下載軟體，支持 HTTP/HTTPS/FTP 協議。aria2 可以多線程通過 HTTP/HTTPS 和 FTP 協議連接鏡像伺服器，顯著提高下載速度。

注意：在 pacman 的 XferCommand 使用 aria2c 不會導致並行下載多個包。因為 Pacman 調用 XferCommand 時是一次一個包調用的，等待下載完成才會啟動下一個。想要並行下載多個包，參見 Powerpill。

安裝 aria2包，修改 `/etc/pacman.conf`，在 `[options]` 段添加下列一行：

    XferCommand = /usr/bin/aria2c --allow-overwrite=true --continue=true --file-allocation=none --log-level=error --max-tries=2 --max-connection-per-server=2 --max-file-not-found=5 --min-split-size=5M --no-conf --remote-time=true --summary-interval=60 --timeout=5 --dir=/ --out %o %u

提示：使用 pacman 和 aria2 的另一種配置]試圖簡化配置並添加更多配置選項。

關於使用的 aria2c 選項，見 aria2c(1) § OPTIONS。

- `-d, --dir`由 pacman 設定的文件下載目錄。
- `-o, --out`: 輸出的下載文件的文件名。
- `%o`: 代表 pacman 指定的本地文件名的變量。
- `%u`: 代表 pacman 指定的下載 URL 的變量。

#### 其它程序

這裡還有一些可以和 pacman 協同工作的下載軟體。下面列舉了它們對應的 XferCommand 命令寫法：

- `snarf`: `XferCommand = /usr/bin/snarf -N %u`
- `lftp`: `XferCommand = /usr/bin/lftp -c pget %u`
- `axel`: `XferCommand = /usr/bin/axel -n 2 -v -a -o %o %u`
- `hget`: `XferCommand = /usr/bin/hget %u -n 2 -skip-tls false`（請閱讀 Github 項目頁面上的文檔獲取更多信息）
- `saldl`: `XferCommand = /usr/bin/saldl -c6 -l4 -s2m -o %o %u`（請閱讀項目頁面上的文檔獲取更多信息）

## 工具

- isfree — 一個 Bash 腳本，用於列出非自由軟體包。基於 Parabola 的黑名單。

  https://github.com/leo-arch/isfree || isfreeAUR

- Lostfiles — 標識不屬於任何包的文件的腳本。

  https://github.com/graysky2/lostfiles || lostfiles包

- pacutils — 基於 libalpm 的程序的幫手庫。

  https://github.com/andrewgregory/pacutils || pacutils包

- pkgfile — 查找包擁有文件的工具。

  https://github.com/falconindy/pkgfile || pkgfile包

- pkgtop — 為 GNU/Linux 設計的交互式包管理器和資源監視器。

  https://github.com/orhun/pkgtop || pkgtop-gitAUR

- Powerpill — 通過 aria2 和 Reflector 使用並行和分段下載來嘗試加快 pacman 的下載速度。

  https://xyne.dev/projects/powerpill/ || powerpillAUR

- repoctl — 幫助管理本地倉庫的工具。

  https://github.com/cassava/repoctl || repoctlAUR

- repose — Arch Linux 倉庫構建工具。

  https://github.com/vodik/repose || repose包

- snap-pac — 使 pacman 自動使用 snapper 創建前/後快照，類似 openSUSE 的 YaST。

  https://github.com/wesbarnett/snap-pac || snap-pac包

- vrms-arch — 一個虛擬的 Richard M. Stallman 告訴你安裝了哪些非自由軟體包。

  https://github.com/orospakr/vrms-arch || vrms-arch-gitAUR

分類：​

- 包管理器
- 使用「模板:過時」標記的頁面或章節

隱藏分類：​

- 使用「模板:合併」標記的頁面或章節

pacman/提示和技巧
新增話題