pacman/提示和技巧

出自 Arch Linux 中文维基

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

維護[編輯 | 編輯原始碼]

這篇文章的某些內容需要擴充。

原因: Usage=pacman 4.2 引入,見 [1] (在 Talk:Pacman/提示和技巧 中討論)
注意: 您也可以使用 grep -Fxfgrep -Fxvf,而不是像下面的章節中一樣使用 comm(需要排序輸入和 sort)。

另見系統維護

查詢軟件包[編輯 | 編輯原始碼]

帶有版本[編輯 | 編輯原始碼]

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

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

帶有大小[編輯 | 編輯原始碼]

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

單個包[編輯 | 編輯原始碼]

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

$ LC_ALL=C pacman -Qi | awk '/^Name/{name=$3} /^Installed Size/{print $4$5, name}' | sort -h
軟件包和依賴項[編輯 | 編輯原始碼]

要列出軟件包及其依賴項,

  • 安裝 expac 並運行 expac -H M '%m\t%n' | sort -h
  • 運行 pacgraph-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

瀏覽軟件包[編輯 | 編輯原始碼]

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

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

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

輸入字母以過濾包列表;使用箭頭鍵(或 Ctrl-j/Ctrl-k)瀏覽;按 Enterless 下查看包信息。

要使用 fzf 以類似的方式瀏覽當前已知的所有 pacman 軟件包(已安裝和尚未安裝),請使用:

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

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

列出軟件包擁有的文件並帶大小[編輯 | 編輯原始碼]

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

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

查找不屬於任何軟件包的文件[編輯 | 編輯原始碼]

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

一種方法是由 root 用户使用來自 pacutilspacreport --unowned-files,這將列出無主文件以及其他詳細信息。

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

# find /etc /usr /opt | LC_ALL=C pacman -Qqo - 2>&1 >&- >/dev/null | cut -d ' ' -f 5-
提示: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 時,如果不再安裝關聯的軟件包(或者如果已創建任何新文件),則會列出所有無主文件。

此外,aconfmgraconfmgr-gitAUR)允許使用配置腳本跟蹤修改的和孤立的文件。

刪除未使用的軟件包(孤立軟件包)[編輯 | 編輯原始碼]

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

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

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

# pacman -Qtdq | pacman -Rns -

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

注意: -Qt 僅顯示真的孤立包,要包含可選依賴,請使用 -Qtt .
提示:pacman -Qtd 添加到 pacman 的一個處理後鈎子用於在如果有處理產生孤立包後獲得提示。這在當有軟件包被倉庫放棄時是有用的,因為任何被拋棄的包都會成為本地的一個孤立包(除非它是被顯式安裝的)。要避免在沒有找到孤立包時「執行命令失敗」的錯誤,在你的鈎子中為 Exec 使用如下的指令: /usr/bin/bash -c "/usr/bin/pacman -Qtd || /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 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 $2}'

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

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

提示:

備份 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.gz ./*

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

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

然後,您可以將「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.gz /path/to/package-1.0-1-x86_64.pkg.tar.zst

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

$ repo-add /path/to/repo.db.tar.gz /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.xz
    ├── customrepo.db.tar.xz
    ├── customrepo.files -> customrepo.files.tar.xz
    ├── customrepo.files.tar.xz
    └── 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.gz 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 從伺服器下載失敗3個包,它將使用另一個鏡像。見 https://bbs.archlinux.org/viewtopic.php?id=268066

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

首先,將 pacman 數據庫放入您要提供服務的目錄中:

# ln -s /var/lib/pacman/sync/*.db /var/cache/pacman/pkg/

然後開始提供此目錄。例如,使用 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
Server = http://server-ip:port
...
警吿: 不要像其他條目一樣將 /repos/$repo/os/$arch 追加到該自定義伺服器,因為該層次結構不存在,因此查詢將失敗。

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

$ sudo -u 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,這可能在某些家庭網絡中更好地工作,這些家庭網絡在 WiFi 和以太網之間路由而不是橋接。

從歷史上看,有 PkgDmultipkg,但它們都已不再維護。

讀寫緩存[編輯 | 編輯原始碼]

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

首先,安裝任何基於網絡的文件系統軟件包:sshfs, curlftpfs, sambanfs-utils

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

然後,要共享實際的軟件包,請在每台客户機上從伺服器掛載 /var/cache/pacman/pkg/var/cache/pacman/pkg

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

用 rsync 雙向同步[編輯 | 編輯原始碼]

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

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

 # rsync rsync://server/share_$(uname -m)/ /var/cache/pacman/pkg/ ...
 # pacman ...
 # paccache ...
 # rsync /var/cache/pacman/pkg/ rsync://server/share_$(uname -m)/  ...

使用 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 代理緩存伺服器[編輯 | 編輯原始碼]

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

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

使用同步程序同步 pacman 軟件包緩存[編輯 | 編輯原始碼]

使用 Syncthing英語SyncthingResilio 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 --md5sum --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,它在安裝包以刪除不必要的區域設置文件後運行。更直接的方法是通過 pacman.conf 中的 NoExtract 指令提供的,該指令防止安裝這些文件。

警吿: 一些用户注意到,刪除所有區域會導致 dmenu, Steam, 甚至 Xorg 的意外結果。通過只安裝英文(US)文件和所需的 C 區域,對以下示例進行了調整以避免此類問題。
/etc/pacman.conf
NoExtract = usr/share/help/* !usr/share/help/C/*
NoExtract = usr/share/gtk-doc/html/*
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
NoExtract = usr/share/man/* !usr/share/man/man*
NoExtract = usr/share/vim/vim*/lang/*
NoExtract = usr/lib/libreoffice/help/en-US/*
NoExtract = usr/share/kbd/locale/*
NoExtract = usr/share/*/translations/*.qm usr/share/*/nls/*.qm usr/share/qt/phrasebooks/*.qph usr/share/qt/translations/*.pak !*/en-US.pak # Qt apps
NoExtract = usr/share/*/locales/*.pak opt/*/locales/*.pak usr/lib/*/locales/*.pak !*/en-US.pak # Electron apps
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 = 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[編輯 | 編輯原始碼]

Powerpillpacman 的包裹程序,增加了平行下載和分段下載功能,加速下載過程。

wget[編輯 | 編輯原始碼]

對於需要更強大代理設置的用户來説,用 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, --dirpacman 設定的文件下載目錄。
  • -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(請閱讀 項目頁面上的文檔 獲取更多信息)

工具[編輯 | 編輯原始碼]

  • Lostfiles — 標識不屬於任何包的文件的腳本。
https://github.com/graysky2/lostfiles || lostfiles
  • pacutils — 基於 libalpm 的程序的幫手庫。
https://github.com/andrewgregory/pacutils || pacutils
  • pkgfile — 查找包擁有文件的工具。
https://github.com/falconindy/pkgfile || pkgfile
  • pkgtools — 關於 Arch Linux 軟件包的腳本集合。
https://github.com/Daenyth/pkgtools || pkgtoolsAUR
  • pkgtop — 為 GNU/Linux 設計的交互式包管理器和資源監視器。
https://github.com/orhun/pkgtop || pkgtop-gitAUR
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

圖形前端[編輯 | 編輯原始碼]

警吿: PackageKit 默認打開系統權限,否則不建議用於一般用途。見 FS#50459FS#57943
  • Apper — 由 C++ 編寫的 Qt 5 應用程式和包管理器,使用 PackageKit。支持 AppStream 元數據
https://userbase.kde.org/Apper || apper
  • Deepin App Store — 用 DTK 構建,來自 DDE 的第三方應用商店,使用 PackageKit。支持 AppStream 元數據
https://github.com/dekzi/dde-store || deepin-store
https://userbase.kde.org/Discover || discover
  • GNOME PackageKit — 用 C 寫的 GTK 3 包管理器,使用 PackageKit。
https://freedesktop.org/software/PackageKit/ || gnome-packagekit
https://wiki.gnome.org/Apps/Software || gnome-software
  • pcurses — 由 C++ 編寫的 Curses TUI pacman 包裹程序。
https://github.com/schuay/pcurses || pcursesAUR
  • tkPacman — 用 Tcl 寫的 Tk pacman 包裹程序。
https://sourceforge.net/projects/tkpacman || tkpacmanAUR