pacman/提示和技巧
維護[編輯 | 編輯原始碼]
grep -Fxf
或 grep -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
軟體包和依賴項[編輯 | 編輯原始碼]
要列出軟體包及其依賴項,
查詢軟體包的下載大小(不加 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
不在指定的包組、軟體庫或元包中[編輯 | 編輯原始碼]
$ 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)
開發版軟體包[編輯 | 編輯原始碼]
要列出所有開發版/不穩定軟體包,請運行:
$ 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 來顯示一個兩窗格視圖,其中列出了所有軟體包,包信息顯示在右側。
輸入字母以過濾包列表;使用箭頭鍵(或 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
查找不屬於任何軟體包的文件[編輯 | 編輯原始碼]
如果您的系統中有不屬於任何軟體包的零散文件(通常是由於您沒有使用包管理器安裝軟體),您可能需要查找這些文件以清理它們。
一種方法是由 root 用戶使用來自 pacutils包 的 pacreport --unowned-files
,這將列出無主文件以及其他詳細信息。
另一種方法是列出所有感興趣的文件,並對照 pacman 進行檢查:
# find /etc /usr /opt | LC_ALL=C pacman -Qqo - 2>&1 >&- >/dev/null | cut -d ' ' -f 5-
跟蹤軟體包創建的無主文件[編輯 | 編輯原始碼]
多數系統將通過通常的操作過程慢慢的收集一些 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 -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 跟蹤的所有文件。
備份 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
簡單的檢查更改日誌[編輯 | 編輯原始碼]
當維護者更新軟體包時,提交通常會以有用的方式進行注釋。用戶可以通過安裝 pacologAUR 從命令行快速檢查這些。通過 pacolog package
使用該實用程序列出來自官方軟體庫或 AUR 的包的最近提交消息。
安裝和修復[編輯 | 編輯原始碼]
獲取和修復軟體包的額外方法。
從 CD/DVD 或 U 盤安裝軟體包[編輯 | 編輯原始碼]
要下載軟體包,或軟體包組:
# 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
如果您希望支持多個架構,則應採取預防措施以防止發生錯誤。每個架構都應有自己的目錄樹:
$ 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 緩存[編輯 | 編輯原始碼]
如果你碰巧在你的區域網上運行了幾個 Arch boxes,你可以共享軟體包,這樣可以大大減少下載時間。請記住,你不應在不同的體系結構(即 i686 和 x86_64)之間共享,否則會遇到問題。
只讀緩存[編輯 | 編輯原始碼]
如果您正在尋找快速解決方案,只需運行基本臨時網絡伺服器,其他計算機可以將其用作其第一個鏡像。
首先,將 pacman 資料庫放入您要提供服務的目錄中:
# ln -s /var/lib/pacman/sync/*.db /var/cache/pacman/pkg/
然後開始提供此目錄。例如,使用 Python http.server 模塊:
$ python -m http.server -d /var/cache/pacman/pkg/
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
。
層疊掛載只讀緩存[編輯 | 編輯原始碼]
通過層疊掛載其 /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
/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, pkgdistcacheAUR, 或 paclanAUR。pkgdistcache 使用 Avahi 而不是普通 UDP,這可能在某些家庭網絡中更好地工作,這些家庭網絡在 WiFi 和乙太網之間路由而不是橋接。
從歷史上看,有 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 雙向同步[編輯 | 編輯原始碼]
本地環境中的另一種方法是 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 代理緩存伺服器[編輯 | 編輯原始碼]
Flexo 是 pacman 倉庫的另一個代理緩存伺服器。Flexo 由 flexo-gitAUR 提供。安裝後,啟動 flexo.service
單元。
默認情況下,Flexo 在埠 7878
上運行。在 /etc/pacman.d/mirrorlist
的頂部加入 Server = http://myserver:7878/$repo/os/$arch
,以便 pacman 通過 Flexo 下載軟體包。
使用同步程序同步 pacman 軟體包緩存[編輯 | 編輯原始碼]
使用 Syncthing 或 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))
列出軟體包中所有被更改的文件[編輯 | 編輯原始碼]
如果您懷疑文件損壞(例如,由於軟體/硬體故障),但不確定文件是否損壞,您可能需要與包中的哈希值進行比較。這可以通過 pacutils包:
# paccheck --md5sum --quiet
有關資料庫的恢復,請見#恢復 pacman 的本地資料庫。mtree
文件也可以從相應的軟體包文件中提取為 .MTREE
。
重新安裝所有軟體包[編輯 | 編輯原始碼]
要重新安裝所有本地軟體包,使用:
# 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
指令提供的,該指令防止安裝這些文件。
/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 按照 /etc/pacman.d/mirrorlist
的順序使用鏡像。默認情況下位於列表頂部的鏡像可能不是最快的。要選擇更快的鏡像,請見鏡像源。
Pacman 下載軟體包的速度也可以通過啟用並行下載來提高,或者通過使用不同的應用程式來下載軟體包,而不是使用 pacman 內建的文件下載器。
不論怎樣,在做任何修改前,你必須確定擁有了最新版的 pacman。
# pacman -Syu
Powerpill[編輯 | 編輯原始碼]
Powerpill 是 pacman 的包裹程序,增加了平行下載和分段下載功能,加速下載過程。
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 協議連接鏡像伺服器,顯著提高下載速度。
安裝 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
關於使用的 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
(請閱讀 項目頁面上的文檔 獲取更多信息)
工具[編輯 | 編輯原始碼]
- Lostfiles — 標識不屬於任何包的文件的腳本。
- pacutils — 基於 libalpm 的程序的幫手庫。
- pkgfile — 查找包擁有文件的工具。
- pkgtools — 關於 Arch Linux 軟體包的腳本集合。
- pkgtop — 為 GNU/Linux 設計的交互式包管理器和資源監視器。
- repoctl — 幫助管理本地倉庫的工具。
- repose — Arch Linux 倉庫構建工具。
- snap-pac — 使 pacman 自動使用 snapper 創建前/後快照,類似 openSUSE 的 YaST。
- vrms-arch — 一個虛擬的 Richard M. Stallman 告訴你安裝了哪些非自由軟體包。
圖形前端[編輯 | 編輯原始碼]
- Apper — 由 C++ 編寫的 Qt 5 應用程式和包管理器,使用 PackageKit。支持 AppStream 元數據。
- Deepin App Store — 用 DTK 構建,來自 DDE 的第三方應用商店,使用 PackageKit。支持 AppStream 元數據。
- Discover — 由 C++/QML 編寫的 Qt 5 應用程式管理器,使用 PackageKit。支持 AppStream 元數據、Flatpak 和 固件更新。
- GNOME PackageKit — 用 C 寫的 GTK 3 包管理器,使用 PackageKit。
- GNOME Software — 用 C 寫的 GTK 3 應用程式管理器,使用 PackageKit。支持 AppStream 元數據、Flatpak 和 固件更新。
- pcurses — 由 C++ 編寫的 Curses TUI pacman 包裹程序。
- tkPacman — 用 Tcl 寫的 Tk pacman 包裹程序。