pacman
Pacman軟件包管理器是 Arch Linux 的一大亮點。它將一個簡單的二進制包格式和易用的構建系統結合了起來。Pacman的目標是簡化對軟件包的管理,無論軟件包是來自官方軟件倉庫還是用戶自己創建的軟件包。
Pacman 通過和主伺服器同步軟件包列表來保持系統是最新的。這種伺服器/客戶端模式可使得用戶使用簡單的命令,就能下載或安裝軟件包,並包含其所有必需的依賴包。
Pacman 用 C 語言編寫,並使用 bsdtar(1) tar 作為打包格式。
pacman -Ql pacman | grep -E 'bin/.+'
可查看完整的工具列表。用法[編輯 | 編輯原始碼]
以下只是 pacman 可以執行的操作的一小部分示例。要閱覽更多示例可參考 pacman(8)。
安裝軟件包[編輯 | 編輯原始碼]
一個軟件包就是一個歸檔包,其中包含:
- 該軟件所有(編譯好的)文件,並按照每個文件的安裝位置儲存在一個與根目錄結構相同的目錄中
- 該軟件的元數據,例如軟件名稱、版本和依賴等
- 供 pacman 使用的其它描述性文件
- (可選)在安裝、升級、卸載時執行的安裝腳本
Arch 的軟件包管理器 pacman 可以安裝、更新和刪除這些軟件包。使用軟件包而不是自己編譯和安裝程序有很多好處:
- 輕鬆升級:pacman 會在更新可用時立即更新已安裝的軟件包
- 依賴檢查:pacman 會為你處理依賴問題,只需要指明程序(名),pacman 就會將它和它所需的所有其他程序都一起安裝。
- 乾淨卸載:pacman 持有軟件包包含的所有文件的列表。這樣一來,當你決定移除軟件包時,不會無意留下任何文件。
pacman -Syu 軟件包名
, 而不要使用 pacman -Sy 軟件包名
,因為後者可能會導致依賴問題。參見 System maintenance#不支持部分升級一文和 BBS#89328 論壇討論。安裝指定的包[編輯 | 編輯原始碼]
要安裝單個或者一系列軟件包(包含軟件包的依賴),請使用如下命令:
# pacman -S 包名_1 包名_2 ...
要通過正則表達式安裝一系列軟件包(參見這個論壇帖子):
# pacman -S $(pacman -Ssq 包正则表达式)
有時軟件包有多個版本,放在不同的倉庫內(例如 extra 和 testing)。在以下示例中,要安裝 extra 倉庫的版本,需要在包名稱前定義倉庫名:
# pacman -S extra/包名
要安裝多個含有相似名稱的軟件包,可以使用花括號擴展。例如:
# pacman -S plasma-{desktop,mediacenter,nm}
可以多層擴展到需要的層次:
# pacman -S plasma-{workspace{,-wallpapers},pa}
虛包[編輯 | 編輯原始碼]
虛擬軟件包是一個特殊的軟件包,它本身並不存在,但由一或多個其它軟件包提供。虛擬軟件包允許其它軟件包不以某一個特定的包為依賴,以應對有多個候選的情況。虛包不能用它們的名稱安裝,相反它們會在你安裝提供虛包的軟件包時被安裝到你的系統中。一個例子是dbus-units軟件包。
pacman.conf
中倉庫出現的順序排序,同一個倉庫有多個可選再按字母順序排序。安裝包組[編輯 | 編輯原始碼]
一些包屬於一個可以同時安裝的軟件包組。例如,運行下面的命令
$ pacman -S gnome
會提醒用戶選擇 gnome
內需要安裝的包。
有的包組包含大量的軟件包,有時用戶只需其中幾個。除了逐一鍵入序號外,pacman 還支持選擇或排除某個區間內的的軟件包:
Enter a selection (default=all): 1-10 15
這將選中序號 1 至 10 和 15 的軟件包。而
Enter a selection (default=all): ^5-8 ^2
將會選中除了序號 5 至 8 和 2 之外的所有軟件包。
想要查看哪些包屬於 gnome 組,運行:
# pacman -Sg gnome
也可以訪問 https://archlinux.org/groups/ 查看可用的包組。
--needed
選項覆蓋這種行為。刪除軟件包[編輯 | 編輯原始碼]
刪除單個軟件包,保留其全部已經安裝的依賴關係
# pacman -R package_name
刪除指定軟件包,及其所有沒有被其他已安裝軟件包使用的依賴關係:
# pacman -Rs package_name
上面這條命令在移除包含其他所需包的組時有時候會拒絕運行。這種情況下可以嘗試
# pacman -Rsu package_name
要刪除軟件包和所有依賴這個軟件包的程序:
# pacman -Rsc package_name
要刪除一個被其他軟件包依賴的軟件包,但是不刪除依賴這個軟件包的其他軟件包:
# pacman -Rdd package_name
pacman 刪除某些程序時會備份重要配置文件,在其後面加上*.pacsave擴展名。-n 選項可以避免備份這些文件:
pacman -Rn package_name
升級軟件包[編輯 | 編輯原始碼]
- 建議用戶遵守系統維護#更新系統的指導,定期更新系統,並不盲目地執行這些命令。
- Arch 只支持系統完整升級,詳細參見系統維護#不支持部分升級和#安裝軟件包。
一個 pacman 命令就可以升級整個系統。花費的時間取決於系統有多老。這個命令會同步非本地(local)軟件倉庫並升級系統的軟件包:
# pacman -Syu
查詢包數據庫[編輯 | 編輯原始碼]
pacman 使用 -Q
參數查詢本地軟件包數據庫, -S
查詢同步數據庫,以及 -F
查詢文件數據庫。要了解每個參數的子選項,分別參見 pacman -Q --help
,pacman -S --help
和pacman -F --help
。
pacman 可以在包數據庫中查詢軟件包,查詢位置包含了軟件包的名字和描述:
$ pacman -Ss string1 string2 ...
有時,-s
的內置正則會匹配很多不需要的結果,所以應當指定僅搜索包名,而非描述或其他子段:
$ pacman -Ss '^vim-'
要查詢已安裝的軟件包:
$ pacman -Qs string1 string2 ...
按文件名查找軟件庫:
$ pacman -F string1 string2 ...
顯示軟件包的詳盡的信息:
$ pacman -Si package_name
查詢本地安裝包的詳細信息:
$ pacman -Qi package_name
使用兩個 -i
將同時顯示備份文件和修改狀態:
$ pacman -Qii package_name
獲取已安裝軟件包所包含文件路徑(比如用來查看軟件包提供了什麼可執行文件):
$ pacman -Ql package_name
查詢遠程庫中軟件包包含的文件:
$ pacman -Fl package_name
檢查軟件包安裝的文件是否都存在:
$ pacman -Qk package_name
兩個參數k
將會執行一次更徹底的檢查。
查詢數據庫獲取某個文件屬於哪個軟件包:
$ pacman -Qo /path/to/file_name
查詢文件屬於遠程數據庫中的哪個軟件包:
$ pacman -F /path/to/file_name
要羅列所有不再作為依賴的軟件包(孤立orphans):
$ pacman -Qdt
要羅列所有明確安裝而且不被其它包依賴的軟件包:
$ pacman -Qet
更多例子查看pacman tips。
Pactree[編輯 | 編輯原始碼]
要顯示軟件包的依賴樹:
$ pactree package_name
檢查一個安裝的軟件包被那些包依賴,將遞歸標識-r
傳遞給 pactree,或者使用 pkgtoolsAUR中的whoneeds
數據庫結構[編輯 | 編輯原始碼]
pacman數據庫通常位於 /var/lib/pacman/sync
. 對於每一個在/etc/pacman.conf
中指定的軟件倉庫, 這裏都有一個一致的數據庫。數據庫文件夾裏每個tar.gz文件都包含着一個倉庫的軟件包信息。例如which包 包:
$ tree which-2.21-5
which-2.21-5 |-- desc
這個 depends
項列出了該軟件的依賴包, 而desc
有該包的介紹,例如文件大小和MD5值 。
清理軟件包緩存[編輯 | 編輯原始碼]
pacman 將下載的軟件包保存在 /var/cache/pacman/pkg/
並且不會自動移除舊的和未安裝版本的軟件包。這樣做有一些好處:
- 這樣允許降級軟件包而不需要通過其他方式提取舊版本,例如 Arch Linux Archive.
- 被卸載的軟件包可以輕易地直接從緩存文件夾重新安裝,不需要重新從軟件倉庫下載。
然而,需要定期手動清理緩存來避免該文件夾無限制增大。
pacman-contrib包 提供的 paccache(8) 腳本默認會刪除所有緩存的版本和已卸載的軟件包,除了最近的3個會被保留:
# paccache -r
啟用和啟動 paccache.timer
來每周刪除不使用的包。
也可以自己設置保留最近幾個版本:
# paccache -rk1
添加-u
/--uninstalled
開關來限制paccache的行為只作用於卸載的包。例如清理所有卸載的包的緩存版本,可以用以下命令:
# paccache -ruk0
更多參數參見paccache -h
。
pacman也有一些內建參數用於清除緩存和那些不再在/etc/pacman.conf
配置文件中列出的軟件倉庫殘留數據庫文件。然而pacman並不提供保留一定數量的過去版本的功能,因此它比paccache的默認選項更加激進。
要刪除目前沒有安裝的所有緩存的包,和沒有被使用的同步數據庫,執行:
# pacman -Sc
要刪除緩存中的全部文件,使用兩次-c
開關。這是最為激進的方式,將會清空緩存文件夾:
# pacman -Scc
pkgcachecleanAUR以及pacleanerAUR是兩個進一步清理緩存的替代工具
其它命令[編輯 | 編輯原始碼]
升級系統時安裝其他軟件包:
# pacman -Syu package_name1 package_name2 ...
下載包而不安裝它:
# pacman -Sw package_name
安裝一個本地包(不從源裏下載):
# pacman -U /path/to/package/package_name-version.pkg.tar.zst
要將本地包保存至緩存,可執行:
# pacman -U file:///path/to/package/package_name-version.pkg.tar.zst
安裝一個遠程包(不在 pacman 配置的源裏面):
# pacman -U http://www.example.com/repo/example.pkg.tar.zst
查看軟件變動[編輯 | 編輯原始碼]
pacman 會列出需要安裝和刪除的軟件,並在執行動作前要求需要的權限。
要抑制-S
,-U
和 -R
,的動作並列出涉及該動作相關軟件的列表,可以使用--print
或縮寫-p
。
可以添加--print-format
參數將輸出格式化,例如使用--print-format %n
將返回不帶有版本號的列表。
安裝原因[編輯 | 編輯原始碼]
pacman 數據庫將軟件包按照安裝的原因分為兩類:
- 顯式安裝:那些真正地被傳遞給通用pacman
-S
和-U
命令的包; - 依賴:那些雖然(一般)從未被傳遞給pacman安裝命令,但由於被其它顯式安裝的包需要從而被隱式安裝的包
當安裝軟件包時,可以把安裝原因強制設為依賴:
# pacman -S --asdeps package_name
該命令使用的原因通常是顯式安裝的包可能會提供可選安裝包,這些包提供了非必須功能,可供用戶自由選擇。
--asdeps
安裝可選依賴將確保如果你移除孤立包,pacman將會一同移除按照上述方法指定安裝的可選依賴。但是重新安裝該軟件包,當前安裝原因默認會被保留。
顯式安裝的軟件包列表可用pacman -Qe
獲取, 設置為依賴的軟件包可用pacman -Qd
獲取。
改變某個已安裝軟件包的安裝原因,可以執行:
# pacman -D --asdeps package_name
反過來的對應參數--asexplicit
--asdeps
和--asexplicit
選項,例如pacman -Syu package_name --asdeps
,是不被推薦的。這會導致不僅改變要被安裝的軟件包的安裝原因,也會改變被升級的軟件包的安裝原因。查詢一個包含具體文件的包名[編輯 | 編輯原始碼]
同步文件數據庫:
# pacman -Fy
查詢包含某個文件的包名,比如:
# pacman -F pacman core/pacman 5.0.1-4 usr/bin/pacman usr/share/bash-completion/completions/pacman extra/xscreensaver 5.36-1 usr/lib/xscreensaver/pacman
如果需要高級功能請安裝 pkgfile,它使用一個單獨的數據庫來保存文件和它們所關聯的軟件包的信息。
安裝/更新/刪除 軟件包時發生了什麼[編輯 | 編輯原始碼]
動作成功執行時,事務包含五大步驟和事務鈎子程序:
- 如果數據庫未被鎖定,初始化事務
- 確認事務中要添加或刪除的軟件包
- 準備事務,根據參數,對同步數據庫、軟件包和依賴關係進行校驗
- 提交事務:
- 如果需要,下載軟件包 (
_alpm_sync_load
) - 如果有可以執行的 pacman
PreTransaction
鈎子,執行這些鈎子. - 被替換、出現衝突或被指定刪除的軟件包將會被刪除
- 如果需要添加軟件包,每個軟件包都會執行提交
- 如果有安裝腳本,執行
pre_install
函數(更新時執行pre_upgrade
,刪除時執行pre_remove
). - pacman 刪除軟件包之前版本的所有文件 (在更新或刪除軟件包時)。配置文件將會被保留 (請參閱 Pacman/Pacnew and Pacsave).
- pacman 將軟件包文件解壓到系統(安裝或升級軟件包時). 會覆蓋舊的已被手動修改的配置文件時,配置文件會命名為 (.pacnew).
- 如果軟件包有安裝腳本,執行
post_install
函數(更新時執行post_upgrade
,刪除時執行post_remove
).
- 如果有安裝腳本,執行
- 如果pacman
PostTransaction
鈎子可執行,執行這些鈎子.
- 如果需要,下載軟件包 (
- 釋放事務及事務資源 (例如,數據庫鎖)
配置[編輯 | 編輯原始碼]
pacman 的配置文件位於/etc/pacman.conf
。 man pacman.conf 可以查看配置文件的進一步信息。
通用選項[編輯 | 編輯原始碼]
通用選項都在[options]
段。閱讀 man 手冊或者查看默認的 pacman.conf 可以獲得有關信息和用法。
升級前對比版本[編輯 | 編輯原始碼]
要查看舊版和新版的有效安裝包,請取消/etc/pacman.conf
中"VerbosePkgLists"的註釋。修改後的pacman -Syu
輸出如下:
Package (6) Old Version New Version Net Change Download Size extra/libmariadbclient 10.1.9-4 10.1.10-1 0.03 MiB 4.35 MiB extra/libpng 1.6.19-1 1.6.20-1 0.00 MiB 0.23 MiB extra/mariadb 10.1.9-4 10.1.10-1 0.26 MiB 13.80 MiB
啟用並行下載[編輯 | 編輯原始碼]
Pacman 6.0 增加了並行下載選項,將 /etc/pacman.conf
中 [options]
選項 ParallelDownloads
設置成正整數,例如 5
,將會同時下載 5 個軟件包,如果未設置此選項,軟件包將會被依次下載。
在升級時跳過軟件包[編輯 | 編輯原始碼]
要想在升級系統時跳過特定的軟件包,用像如下的命令指明:
IgnorePkg=linux
多軟件包可以用空格隔開,或者用另外的IgnorePkg
行。也可使用 glob 模式。如果只打算忽略一次升級,可以使用 --ignore
選項,這時使用逗號隔開的列表。
忽略了的軟件包依然可通過 pacman -S
升級。這種情況下pacman會提醒你這些軟件包已經被包含在IgnorePkg
聲明中。
在升級時跳過軟件包組[編輯 | 編輯原始碼]
和軟件包一樣,也可以不升級某個軟件包組:
IgnoreGroup = gnome
在升級時跳過文件[編輯 | 編輯原始碼]
所有在NoUpgrade
指令中列出的文件都會在軟件包被安裝/升級時不會被更改,並且新文件會以帶有.pacnew後綴名的形式安裝
NoUpgrade=path/to/file 存在多个跳过文件也可以像这样指定: NoUpgrade=path/to/file1 path/to/file2
在安裝時跳過文件[編輯 | 編輯原始碼]
要總是跳過某些文件夾的安裝,可以將它們放到 NoExtract
中,例如不想安裝 systemd 模塊:
NoExtract=usr/lib/systemd/system/*
後面的規則覆蓋前面的規則,加上 !
可以取消跳過效果。
CheckSpace
參數加入pacman.conf
能夠抑制這種警告,但是要意識到space-check功能將會對所有軟件包禁用。保留多個配置文件[編輯 | 編輯原始碼]
如果你有多個配置文件(比如,主配置和啟用了測試倉庫的配置文件),需要共享一些設置,你可以在配置文件中使用Include
選項,例如:
Include = /path/to/common/settings
/path/to/common/settings
文件中是兩個配置文件共享的相同配置。
鈎子[編輯 | 編輯原始碼]
pacman可以在處理前後,運行/usr/share/libalpm/hooks/
文件夾下的hooks,更多的hooks文件夾可以通過HookDir
選項在pacman.conf
中指明,默認/etc/pacman.d/hooks
。Hook文件必須以.hook為後綴。Pacman hooks不是交互式的。
pacman hooks用於,比如說,和systemd-sysusers
和systemd-tmpfiles
結合來在安裝包時自動創建系統用戶和文件。例如,tomcat8包指明它想要創建一個叫做tomcat8
的系統用戶和一些屬於該用戶的文件。當pacman確定tomcat8包包含文件指明用戶和臨時文件時,pacman hooks systemd-sysusers.hook
和systemd-tmpfiles.hook
喚起systemd-sysusers
和systemd-tmpfiles
。
有關 alpm hooks 的更多信息,參見alpm-hooks(5)。
軟件倉庫[編輯 | 編輯原始碼]
除了特殊的通用選項節, 每個pacman.conf
中的[section]
都定義了一個使用的軟件包倉庫,倉庫是多個軟件包的邏輯上的集合,他們物理上存儲在一個或多個伺服器:這也是為什麼每一個伺服器都叫做這個倉庫的鏡像。
倉庫區分為官方倉庫與非官方倉庫。配置文件中倉庫的順序十分重要;當幾個倉庫出現同名安裝包,不管版本號如何,pacman將使用配置文件中排前的倉庫。要在添加後使用某個倉庫,你需要先升級整個系統
每個倉庫節都可以直接指定鏡像列表或者Include
引用其他的文件:例如,官方鏡像引用了/etc/pacman.d/mirrorlist/
。具體查看Mirrors。
軟件包的緩存目錄[編輯 | 編輯原始碼]
在pacman.conf
通用選項節,CacheDir
指定了Pacman下載的安裝包緩存位置(如果未設置,默認位置為 /var/cache/pacman/pkg/
)。
即使只保留最新版本的安裝包,緩存目錄大小仍然有可能隨着時間增長。
如果要將緩存目錄移動到更方便的地方,只需要完成下列方法中的任意一個:
- 在
pacman.conf
通用選項節,設置CacheDir
為要使用的緩存目錄,並確保目錄以"/"結尾。推薦使用該方法. - 將一個專用分區掛載到默認緩存點
/var/cache/pacman/pkg/
,例如使用Btrfs 子卷。 - 將一個目錄與
/var/cache/pacman/pkg/
綁定掛載。
/var/cache/pacman/pkg/
目錄指向其它位置。 這會導致pacman出現異常,特別是當pacman嘗試升級自己時。軟件包的安全性[編輯 | 編輯原始碼]
pacman 支持軟件包簽名,會為軟件包提供額外的安全性。默認配置,SigLevel = Required DatabaseOptional
將啟用全局簽名驗證,但會被每個軟件倉庫的 SigLevel
行所覆蓋。有關軟件包簽名和簽名驗證的更多細節,參見 pacman-key。
疑難解答[編輯 | 編輯原始碼]
"Failed to commit transaction (conflicting files)" 錯誤[編輯 | 編輯原始碼]
如果碰到如下錯誤:[2]
error: could not prepare transaction error: failed to commit transaction (conflicting files) package: /path/to/file exists in filesystem Errors occurred, no packages were upgraded.
這是因為 pacman 檢測到文件衝突,而且按照設計,pacman 不會覆蓋文件。這是設計功能,不是缺陷。
這個問題通常很容易解決(當然你首先應該嘗試搞清楚這些文件是怎麼變成這樣的)。一個安全的方式是,首先檢查是否有另一個軟件包提供了這個文件 (pacman -Qo /path/to/file
)。如果文件被另一個軟件包所有,請報告問題。如果不是其它軟件包提供,將 'exists in filesystem' 的文件重命名並重新運行update命令。如果一切順利,可以刪掉這個文件。
如果你手動安裝了一個軟件,沒有通過pacman,例如用make install
,你必須將軟件連同它的全部文件一起移除/卸載。參見Pacman/提示和技巧#查找不屬於任何軟件包的文件。
每一個安裝的軟件包都會提供一個 /var/lib/pacman/local/$package-$version/files
文件,包含此軟件包的元數據。如果文件損壞或者丟失,將會導致升級時出現file exists in filesystem
錯誤。此錯誤通常只會影響一個軟件包,除了手動刪除或移動所有的問題文件,你也可以顯式地使用pacman -S --overwrite glob package
讓 pacman 強制覆蓋匹配glob
的文件。
--overwrite
開關。參見System maintenance#避免某些 pacman 命令"Failed to commit transaction (invalid or corrupted package)" 錯誤[編輯 | 編輯原始碼]
看看/var/cache/pacman/pkg
中是否有*.part
結尾的文件,它們是沒有完全下載的文件,刪除它們並重新執行更新。這些程序一般是自定義的XferCommand
下載命令造成的。
# find /var/cache/pacman/pkg/ -iname "*.part" -delete
同樣的錯誤也可能是因為archlinux-keyring過期所致,阻止了pacman驗證簽名。詳情見Pacman/Package signing#Upgrade system regularly以修復並避免在未來遇到同樣問題。
"Failed to init transaction (unable to lock database)" 錯誤[編輯 | 編輯原始碼]
pacman 在改變軟件包數據庫前,比如安裝軟件包時,會創建一個文件鎖 /var/lib/pacman/db.lck
。這會阻止其他 pacman 實例在同一時間修改軟件包數據庫。
如果 pacman 在更新數據庫時被打斷,舊鎖可能保留下來。如果確認沒有 pacman 實例在運行,那麼刪掉文件鎖:
# rm /var/lib/pacman/db.lck
fuser /var/lib/pacman/db.lck
可以確認是否有其它進程仍在使用它。安裝時無法獲取軟件包[編輯 | 編輯原始碼]
錯誤內容包含:Not found in sync db
, Target not found
或 Failed retrieving file
.
首先確認軟件包確實存在(並注意錯別字)。如果確認軟件包存在,可能本地數據庫過時了或者軟件倉庫沒有配置好,試試 pacman -Syyu
強制數據庫更新和升級。
也有可能包含該軟件包的軟件倉庫沒有啟動。例如,該軟件包可能在 multilib 倉庫裏,但該倉庫沒有在 pacman.conf 中啟用。
參閱常見問題#Q) 在官方倉庫中,為什麼只為每個共享連結庫提供一個版本?.
pacman 更新時崩潰[編輯 | 編輯原始碼]
如果 pacman 在刪除、重新安裝或更新軟件包時 "數據庫寫入" 出錯:
- 從 Arch 安裝媒體啟動,最好用最新的安裝媒體
- 掛載根文件系統,例如以 root 身份
mount /dev/sdaX /mnt
,通過df -h
確認根文件目錄包含足夠的空間 - 同樣掛載 proc, sys 和 dev 文件系統:
mount -t proc proc /mnt/proc; mount --rbind /sys /mnt/sys; mount --rbind /dev /mnt/dev
- 如果系統使用默認的數據庫目錄位置,可以通過 root 用戶執行下面命令
pacman --root=/mnt --cachedir=/mnt/var/cache/pacman/pkg -Syu
來更新系統的 pacman 數據庫。 - 如果無法更新,可以重新安裝所有軟件包。
- 更新之後,可以通過下面命令確認是否還存在損壞的包:
find /mnt/usr/lib -size 0
- 通過
pacman --root /mnt --cachedir=/mnt/var/cache/pacman/pkg -S package
重新安裝依然損壞的軟件包
pacman: command not found[編輯 | 編輯原始碼]
如果/var/cache/pacman/pkg
是一個符號連結,pacman在升級自身時會創建該目錄並移除符號連結,這會導致升級失敗,並產生/usr/bin/pacman
與其它 pacman包包中內容丟失的後果。
永遠不要為/var/cache/pacman/pkg
創建軟連接,因為該目錄受pacman控制。使用CacheDir
選項或通過綁定掛載。參見#軟件包的緩存目錄。
如果你已經遇到這個問題,你可以手動提取安裝包中/usr
的內容恢復,並重新安裝pacman。詳情見FS#73306和論壇相關話題
手動重新安裝 pacman[編輯 | 編輯原始碼]
使用 pacman-static[編輯 | 編輯原始碼]
pacman-staticAUR是pacman的靜態編譯版本,因此系統中的庫文件失效時依然可以運行它。當部分升級後pacman無法運行,靜態編譯版本就能夠派上用場。
置頂評論和PKGBUILD提供了直接下載二進制文件的方法,可以用於重新安裝pacman或在部分升級情況下升級整個系統。
使用外部 pacman[編輯 | 編輯原始碼]
如果pacman-static
也無法使用,考慮使用外部pacman。 最簡單的辦法是使用archiso並指定--sysroot
或--root
參數到系統操作的掛載點。參見Chroot#使用 arch-chroot來掛載--sysroot
參數需要的文件系統。
手動提取[編輯 | 編輯原始碼]
即使 pacman 嚴重損壞,你仍可以手動修復它,這需要下載最新的包並把它們解壓到正確的目錄。大致步驟如下:
如果你擁有一個健康的 Arch 系統,你可以這樣查看依賴項的完整列表:
$ pacman -Q $(pactree -u pacman)
但是依據你遇到的問題,你可能只需要更新其中的幾個。解壓一個包的示例是:
# tar -xvpwf package.tar.zst -C / --exclude .PKGINFO --exclude .INSTALL --exclude .MTREE --exclude .BUILDINFO
注意w
參數表示交互模式。以非交互方式運行是非常冒險的,因為你可能就此覆蓋了一個重要文件。你也要注意以正確的順序解壓軟件包(例如先解壓依賴)。
這個帖子包含了一些這個過程的例子,這些例子中只有少量pacman依賴項損壞。
升級系統重啟後,出現"unable to find root device"錯誤,無法登錄[編輯 | 編輯原始碼]
很有可能 initramfs 在內核升級時損壞(例如由錯誤地使用 pacman 的 --overwrite
選項導致)。有兩個選擇;首先嘗試 Fallback啟動項。
Tab
鍵(對於 Syslinux)或者按e
鍵(對於 GRUB 或者 systemd-boot),將它重命名為initramfs-linux-fallback.img
然後按Enter
或者b
(取決於你的啟動加載器以新參數啟動的方式)一旦系統啟動,從控制台或終端(為備用linux包內核)運行這條命令來重建 initramfs 映像:
# mkinitcpio -p linux
如果上面方法不行,從一個最新的 Arch 發行版本(CD/DVD 或者 U盤),分別掛載你的根目錄和啟動分區到/mnt
和/mnt/boot
,然後用 arch-chroot chroot:
# arch-chroot /mnt # pacman -Syu mkinitcpio systemd linux
重新安裝內核(linux包 軟件包)將會自動運行 mkinitcpio -p linux
重新生成 initramfs 鏡像,不需要單獨生成。
之後建議執行 exit
, umount /mnt/{boot,}
然後 reboot
.
'warning: current locale is invalid; using default "C" locale' 錯誤[編輯 | 編輯原始碼]
錯誤信息已經很明確了,locale 設置不正確,請閱讀Locale進行設置。
Pacman 不使用我的代理設置[編輯 | 編輯原始碼]
正確設置環境變量($http_proxy
, $ftp_proxy
等)。如果使用 sudo,需要讓 sudo 將這些變量傳遞給 pacman。另外,在更新密鑰前確保/etc/pacman.d/gnupg/dirmngr.conf
路徑的 dirmngr配置文件honor-http-proxy
變量設置正確。
如何重裝所有包並保留安裝和依賴信息?[編輯 | 編輯原始碼]
重裝所有軟件包:pacman -S $(pacman -Qnq)
(-S
選項會保留安裝緣由)。
接着需要重裝外來包(不在官方倉庫裏的軟件包)。外來包可通過pacman -Qmq
查看。
[編輯 | 編輯原始碼]
有可能是前一次 pacman 事務中刪除或者損壞了 pacman 自身需要的一些共享庫。
要修復這種情況,你需要手動解壓那些共享庫文件到文件系統中合適的地方。首先請查明哪個包中包含有所需的庫文件,然後在 pacman 緩存中 (/var/cache/pacman/pkg/
) 找到對應的包。解壓出需要的庫文件到文件系統的對應位置,如此可以繼續使用 pacman 。
之後需要重新安裝損壞的軟件包。注意你可能需要使用 --overwrite
選項覆蓋掉你剛剛解壓出的系統文件,因為 pacman 可能沒有跟蹤到對應的文件信息。 pacman 隨後會使用包中的文件正確替換掉共享庫文件。如此能修好您的 pacman ,然後請繼續更新系統中剩下的軟件包。
軟件包下載停滯[編輯 | 編輯原始碼]
一些網絡問題可能會報告阻止了 pacman 更新和同步倉庫。[3] [4] 在實體機中安裝 Arch Linux 時,這些問題已經通過替換默認的 pacman 文件下載器得到了解決 (更多細節請參閱 Pacman/提示和技巧#性能 ) 。當在 VirtualBox 中安裝 Arch Linux 作為客戶作業系統時,這個問題也通過在主機屬性中使用主機界面而不是 NAT 來解決。
無法從鏡像伺服器獲取 'core.db'[編輯 | 編輯原始碼]
error: 'local-package.pkg.tar': permission denied[編輯 | 編輯原始碼]
如果你想要在一個 sshfs 上使用pacman -U
安裝軟件包並遇到了這個錯誤,將包移動到本地目錄,再試一次。
error: could not determine cachedir mount point /var/cache/pacman/pkg[編輯 | 編輯原始碼]
在 chroot 環境中執行 pacman -Syu
可能發生此錯誤:
error: could not determine cachedir mount point /var/cache/pacman/pkg error: failed to commit transaction (not enough free disk space)
通常是因為進入 chroot 時,進入的目錄不是掛載點。解決方法請參考從現有 Linux 發行版安裝 Arch Linux#下載基本工具, arch-chroot(8) 解釋問題的原因,並提供了一個通過 bind mount 解決問題的方法。
error: GPGME error: No data[編輯 | 編輯原始碼]
如果你無法更新包,並遇到了該問題,嘗試
rm -r /var/lib/pacman/sync/
後再次更新。
如果刪除sync中的同步文件不能解決問題,請通過file /var/lib/pacman/sync/*
檢查同步文件是否為gzip compressed data
,使用路由或代理可能會損壞下載的文件。
如果同步文件是正確的類型,那麼問題可能出在鏡像源上。使用pacman-conf -r core
和pacman-conf -r extra
查詢使用的鏡像源,將命令輸出的第一個URL粘貼到瀏覽器訪問,檢查返回的文件。如果返回有問題,在{ic|/etc/pacman.d/mirrorlist}}裏修改為其他可用鏡像源。