pacman 查询_pacman (简体中文)
翻譯狀態(tài):本文是 pacman 的翻譯。上次翻譯日期:2020-10-20。如果英文版本有所更改,則您可以幫助同步翻譯。
pacman軟件包管理器是 Arch Linux 的一大亮點(diǎn)。它將一個(gè)簡(jiǎn)單的二進(jìn)制包格式和易用的構(gòu)建系統(tǒng)結(jié)合了起來(lái)。pacman的目標(biāo)是簡(jiǎn)化對(duì)軟件包的管理,無(wú)論軟件包是來(lái)自官方軟件倉(cāng)庫(kù)還是來(lái)自用戶(hù)自己的創(chuàng)建。
pacman 通過(guò)和主服務(wù)器同步軟件包列表來(lái)進(jìn)行系統(tǒng)更新。這種服務(wù)器/客戶(hù)端模式可在使用一條命令就下載或安裝軟件包的同時(shí),也安裝其必需的依賴(lài)包。
pacman 用 C 語(yǔ)言編寫(xiě),使用tar作為打包格式。
提示: makepkg和pactree、checkupdates等可在曾是 pacman 的內(nèi)置工具)中找到。你可以通過(guò) pacman -Ql pacman | grep -E 'bin/.+' 獲取全部的工具列表。
用法
下面pacman可以執(zhí)行的操作的一小部分,pacman 的其他示例請(qǐng)閱讀
提示: 使用過(guò)其它發(fā)行版的用戶(hù),可以參考 Pacman Rosetta 中的對(duì)比.
安裝軟件包
一個(gè)軟件包是一個(gè)歸檔,它包含:
一個(gè)應(yīng)用的所有(編譯好的)文件
有關(guān)該應(yīng)用的元數(shù)據(jù),例如應(yīng)用名稱(chēng),版本,依賴(lài)……
供 pacman 使用的安裝文件和指令
(可選)使軟件更易操作的額外文件,例如啟動(dòng)/終止腳本
Arch 的軟件包管理器 pacman 可以安裝,更新,和刪除這些軟件包。使用軟件包而不是自己編譯安裝有如下優(yōu)勢(shì):
輕松升級(jí):pacman 會(huì)在更新可用時(shí)立即更新已安裝的軟件包
依賴(lài)檢查:pacman 負(fù)責(zé)為你處理依賴(lài)問(wèn)題,你只需要指明程序,pacman 就會(huì)把它和它所需的所有其他程序都一起安裝。
干凈卸載:pacman 有著一個(gè)軟件包所有文件的列表。這樣,當(dāng)你決定移除軟件包時(shí),不會(huì)無(wú)意留下文件。
注意: 軟件包通常有很多可選依賴(lài), 它們?yōu)檐浖峁╊~外功能, 并不強(qiáng)制要求安裝它們。 安裝軟件時(shí), pacman 將會(huì)輸出它的可選依賴(lài), 但是這個(gè)輸出不會(huì)在 pacman.log中;當(dāng)你想瀏覽已安裝軟件的可選依賴(lài)時(shí)可以使用pacman -Si ,得到關(guān)于可選依賴(lài)的簡(jiǎn)短描述。
警告: 在A(yíng)rch下安裝軟件包時(shí),未更新系統(tǒng)前,不要更新軟件包數(shù)據(jù)庫(kù)(例如,可能出現(xiàn)某軟件包不再出現(xiàn)在官方庫(kù))。操作時(shí),應(yīng)使用pacman -Syu package_name, 而不要使用(pacman -Sy package_name),否則可能會(huì)有依賴(lài)問(wèn)題。參見(jiàn) System maintenance (簡(jiǎn)體中文)#不支持部分升級(jí) 和 BBS#89328.
安裝指定的包
安裝或者升級(jí)單個(gè)軟件包,或者一列軟件包(包含依賴(lài)包),使用如下命令:
# pacman -S package_name1 package_name2 ...
用正則表達(dá)式安裝多個(gè)軟件包(參見(jiàn) 這個(gè)帖子):
# pacman -S $(pacman -Ssq package_regex)
有時(shí)候在不同的軟件倉(cāng)庫(kù)中,一個(gè)軟件包有多個(gè)版本(比如[extra]和[testing])。可以選擇一個(gè)來(lái)安裝:
# pacman -S extra/package_name
安裝多個(gè)含有相似名稱(chēng)的軟件包,而并非整個(gè)包組或全部匹配的軟件包; 例如,
# pacman -S plasma-{desktop,mediacenter,nm}
當(dāng)然,可以多層擴(kuò)展,并不作限制:
# pacman -S plasma-{workspace{,-wallpapers},pa}
虛包
虛擬軟件包是一個(gè)特殊的軟件包,它本身并不存在,但由一或多個(gè)其它軟件包提供。虛擬軟件包允許其它軟件包不以某一個(gè)特定的包為依賴(lài),以應(yīng)對(duì)有多個(gè)候選的情況。虛包不能用它們的名稱(chēng)安裝,相反它們會(huì)在你安裝提供虛包的軟件包時(shí)被安裝到你的系統(tǒng)中。
安裝包組
一些包屬于一個(gè)可以同時(shí)安裝的軟件包組。例如,運(yùn)行下面的命令
# pacman -S gnome
會(huì)提醒用戶(hù)選擇 gnome 內(nèi)需要安裝的包。
有的包組包含大量的軟件包,有時(shí)用戶(hù)只需其中幾個(gè)。除了逐一鍵入序號(hào)外,pacman 還支持選擇或排除某個(gè)區(qū)間內(nèi)的的軟件包:
Enter a selection (default=all): 1-10 15
這將選中序號(hào) 1 至 10 和 15 的軟件包。而
Enter a selection (default=all): ^5-8 ^2
將會(huì)選中除了序號(hào) 5 至 8 和 2 之外的所有軟件包。
想要查看哪些包屬于 gnome 組,運(yùn)行:
# pacman -Sg gnome
注意: 如果列表中的包已經(jīng)安裝在系統(tǒng)中,它會(huì)被重新安裝,即使它已經(jīng)是最新的。可以用 --needed 選項(xiàng)覆蓋這種行為。
刪除軟件包
刪除單個(gè)軟件包,保留其全部已經(jīng)安裝的依賴(lài)關(guān)系
# pacman -R package_name
刪除指定軟件包,及其所有沒(méi)有被其他已安裝軟件包使用的依賴(lài)關(guān)系:
# pacman -Rs package_name
上面這條命令在移除包含其他所需包的組時(shí)有時(shí)候會(huì)拒絕運(yùn)行。這種情況下可以嘗試
# pacman -Rsu package_name
要?jiǎng)h除軟件包和所有依賴(lài)這個(gè)軟件包的程序:
警告: 此操作是遞歸的,請(qǐng)小心檢查,可能會(huì)一次刪除大量的軟件包。
# pacman -Rsc package_name
要?jiǎng)h除一個(gè)被其他軟件包依賴(lài)的軟件包,但是不刪除依賴(lài)這個(gè)軟件包的其他軟件包:
警告: 此操作有破壞系統(tǒng)的能力,應(yīng)該盡量避免使用。詳情請(qǐng)看 避免某些 Pacman 命令。
# pacman -Rdd package_name
pacman 刪除某些程序時(shí)會(huì)備份重要配置文件,在其后面加上*.pacsave擴(kuò)展名。-n 選項(xiàng)可以避免備份這些文件:
pacman -Rn package_name
注意: pacman 不會(huì)刪除軟件自己創(chuàng)建的文件(例如主目錄中的“點(diǎn)文件”不會(huì)被刪除。)
升級(jí)軟件包
一個(gè) pacman 命令就可以升級(jí)整個(gè)系統(tǒng)。花費(fèi)的時(shí)間取決于系統(tǒng)有多老。這個(gè)命令會(huì)同步非本地(local)軟件倉(cāng)庫(kù)并升級(jí)系統(tǒng)的軟件包:
# pacman -Syu
查詢(xún)包數(shù)據(jù)庫(kù)
pacman 可以在包數(shù)據(jù)庫(kù)中查詢(xún)軟件包,查詢(xún)位置包含了軟件包的名字和描述:
$ pacman -Ss string1 string2 ...
有時(shí),-s的內(nèi)置正則會(huì)匹配很多不需要的結(jié)果,所以應(yīng)當(dāng)指定僅搜索包名,而非描述或其他子段:
$ pacman -Ss '^vim-'
要查詢(xún)已安裝的軟件包:
$ pacman -Qs string1 string2 ...
按文件名查找軟件庫(kù):
$ pacman -F string1 string2 ...
顯示軟件包的詳盡的信息:
$ pacman -Si package_name
查詢(xún)本地安裝包的詳細(xì)信息:
$ pacman -Qi package_name
使用兩個(gè) -i 將同時(shí)顯示備份文件和修改狀態(tài):
$ pacman -Qii package_name
要獲取已安裝軟件包所包含文件的列表:
$ pacman -Ql package_name
查詢(xún)遠(yuǎn)程庫(kù)中軟件包包含的文件:
$ pacman -Fl package_name
檢查軟件包安裝的文件是否都存在:
$ pacman -Qk package_name
兩個(gè)參數(shù)k將會(huì)執(zhí)行一次更徹底的檢查。
查詢(xún)數(shù)據(jù)庫(kù)獲取某個(gè)文件屬于哪個(gè)軟件包:
$ pacman -Qo /path/to/file_name
查詢(xún)文件屬于遠(yuǎn)程數(shù)據(jù)庫(kù)中的哪個(gè)軟件包:
$ pacman -F /path/to/file_name
要羅列所有不再作為依賴(lài)的軟件包(孤立orphans):
$ pacman -Qdt
提示: 將上述命令添加到 pacman 的一個(gè)處理后 hook用于在如果有處理產(chǎn)生孤立包后獲得提示。這在當(dāng)有軟件包被倉(cāng)庫(kù)放棄時(shí)是有用的,因?yàn)槿魏伪粧仐壍陌紩?huì)成為本地的一個(gè)孤立包(除非它是被顯式安裝的)。要避免在沒(méi)有找到孤立包時(shí)"failed to execute command”的錯(cuò)誤,在你的 hook 中為Exec使用如下的指令: /usr/bin/bash -c "/usr/bin/pacman -Qtd || /usr/bin/echo '=> None found.'"
要羅列所有明確安裝而且不被其它包依賴(lài)的軟件包:
$ pacman -Qet
Pactree
要顯示軟件包的依賴(lài)樹(shù):
$ pactree package_name
檢查一個(gè)安裝的軟件包被那些包依賴(lài),將遞歸標(biāo)識(shí)-r傳遞給 pactree,或者使用 AUR中的whoneeds
數(shù)據(jù)庫(kù)結(jié)構(gòu)
pacman數(shù)據(jù)庫(kù)通常位于 /var/lib/pacman/sync. 對(duì)于每一個(gè)在/etc/pacman.conf中指定的軟件倉(cāng)庫(kù), 這里都有一個(gè)一致的數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)文件夾里每個(gè)tar.gz文件都包含著一個(gè)倉(cāng)庫(kù)的軟件包信息。例如
$ tree which-2.21-5
which-2.21-5
|-- desc
這個(gè) depends 項(xiàng)列出了該軟件的依賴(lài)包, 而desc有該包的介紹,例如文件大小和MD5值 。
清理軟件包緩存
pacman 將下載的軟件包保存在 /var/cache/pacman/pkg/ 并且不會(huì)自動(dòng)移除舊的和未安裝版本的軟件包。這樣做有一些好處:
這樣允許降級(jí)軟件包而不需要通過(guò)其他方式提取舊版本,例如 Arch Linux Archive.
被卸載的軟件包可以輕易地直接從緩存文件夾重新安裝,不需要重新從軟件倉(cāng)庫(kù)下載。
然而,需要定期手動(dòng)清理緩存來(lái)避免該文件夾無(wú)限制增大。
# paccache -r
啟用 和 啟動(dòng) paccache.timer來(lái)每周刪除不使用的包。
也可以自己設(shè)置保留最近幾個(gè)版本:
# paccache -rk1
添加-u/--uninstalled開(kāi)關(guān)來(lái)限制paccache的行為只作用于卸載的包。例如清理所有卸載的包的緩存版本,可以用以下命令:
# paccache -ruk0
或者你可以將安裝其結(jié)合,同時(shí)作用于安裝的和卸載的包,例如想要保留最近兩個(gè)安裝的包但是移除所有卸載的包的緩存版本,使用以下命令:
# paccache -rk2 -ruk0
更多參數(shù)參見(jiàn)paccache -h。
pacman也有一些內(nèi)建參數(shù)用于清除緩存和那些不再在/etc/pacman.conf配置文件中列出的軟件倉(cāng)庫(kù)殘留數(shù)據(jù)庫(kù)文件。然而pacman并不提供保留一定數(shù)量的過(guò)去版本的功能,因此它比paccache的默認(rèn)選項(xiàng)更加激進(jìn)。
要?jiǎng)h除目前沒(méi)有安裝的所有緩存的包,和沒(méi)有被使用的同步數(shù)據(jù)庫(kù),執(zhí)行:
# pacman -Sc
要?jiǎng)h除緩存中的全部文件,使用兩次-c開(kāi)關(guān)。這是最為激進(jìn)的方式,將會(huì)清空緩存文件夾:
# pacman -Scc
警告: 應(yīng)當(dāng)避免從緩存中刪除所有過(guò)去版本和卸載的包,除非需要更多磁盤(pán)空間。這樣會(huì)導(dǎo)致無(wú)法降級(jí)或重新安裝包而不再次下載他們
AUR以及AUR是兩個(gè)進(jìn)一步清理緩存的替代工具
其它命令
升級(jí)系統(tǒng)時(shí)安裝其他軟件包:
# pacman -Syu package_name1 package_name2 ...
下載包而不安裝它:
# pacman -Sw package_name
安裝一個(gè)本地包(不從源里下載):
# pacman -U /path/to/package/package_name-version.pkg.tar.xz
要將本地包保存至緩存,可執(zhí)行:
# pacman -U file:///path/to/package/package_name-version.pkg.tar.xz
安裝一個(gè)遠(yuǎn)程包(不在 pacman 配置的源里面):
# pacman -U http://www.example.com/repo/example.pkg.tar.xz
要禁用 -S, -U 和 -R 動(dòng)作,可以使用 -p 選項(xiàng).
pacman 會(huì)列出需要安裝和刪除的軟件,并在執(zhí)行動(dòng)作前要求需要的權(quán)限。
安裝原因
pacman數(shù)據(jù)庫(kù)按照軟件包被安裝的原因,將其分為兩類(lèi):
顯式安裝:那些真正地被傳遞給通用pacman-S和-U命令的包;
依賴(lài):那些雖然(一般)從未被傳遞給pacman安裝命令,但由于被其它顯式安裝的包需要從而被隱式安裝的包
當(dāng)安裝軟件包時(shí),可以把安裝原因強(qiáng)制設(shè)為依賴(lài):
# pacman -S --asdeps package_name
提示: 用--asdeps安裝可選依賴(lài)將導(dǎo)致如果你移除孤立包,pacman將會(huì)一同移除剩下的可選依賴(lài)。
但是當(dāng)重新安裝該軟件包時(shí),安裝原因?qū)?huì)被設(shè)為軟件包所默認(rèn)的。
顯式安裝的軟件包列表可用pacman -Qe獲取, 與之互補(bǔ)的已安裝的依賴(lài)包可用pacman -Qd獲取。
改變某個(gè)已安裝軟件包的安裝原因,可以執(zhí)行:
# pacman -D --asdeps package_name
注意: 在升級(jí)時(shí)使用--asdeps和--asexplicit選項(xiàng),例如pacman -Syu package_name --asdeps,是不被推薦的。這會(huì)導(dǎo)致不僅改變要被安裝的軟件包的安裝原因,也會(huì)改變被升級(jí)的軟件包的安裝原因。
查詢(xún)一個(gè)包含具體文件的包名
同步文件數(shù)據(jù)庫(kù):
# pacman -Fy
查詢(xún)包含某個(gè)文件的包名,比如:
# 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
提示: 可以設(shè)置一個(gè) crontab 或者 systemd timer 來(lái)定期同步文件信息數(shù)據(jù)庫(kù)。
如果需要高級(jí)功能請(qǐng)安裝 pkgfile,它使用一個(gè)單獨(dú)的數(shù)據(jù)庫(kù)來(lái)保存文件和它們所關(guān)聯(lián)的軟件包的信息。
配置
pacman 的配置文件位于/etc/pacman.conf。 man pacman.conf 可以查看配置文件的進(jìn)一步信息。
通用選項(xiàng)
通用選項(xiàng)都在[options]段。閱讀 man 手冊(cè)或者查看默認(rèn)的 pacman.conf 可以獲得有關(guān)信息和用法。
升級(jí)前對(duì)比版本
要查看舊版和新版的有效安裝包,請(qǐng)取消/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
在升級(jí)時(shí)跳過(guò)軟件包
警告: 在跳過(guò)軟件包時(shí)要小心,因?yàn)椴糠稚?jí)不受支持
要想在升級(jí)系統(tǒng)時(shí)跳過(guò)特定的軟件包,用像如下的命令指明:
IgnorePkg=linux
多軟件包可以用空格隔開(kāi),或者用另外的IgnorePkg行。也可使用 glob 模式。如果只打算忽略一次升級(jí),可以使用 --ignore 選項(xiàng),這時(shí)使用逗號(hào)隔開(kāi)的列表。
忽略了的軟件包依然可通過(guò) pacman -S 升級(jí)。這種情況下pacman會(huì)提醒你這些軟件包已經(jīng)被包含在IgnorePkg聲明中。
在升級(jí)時(shí)跳過(guò)軟件包組
警告: 在跳過(guò)軟件包時(shí)要小心,因?yàn)椴糠稚?jí)不受支持
和軟件包一樣,也可以不升級(jí)某個(gè)軟件包組:
IgnoreGroup = gnome
在升級(jí)時(shí)跳過(guò)文件
所有在NoUpgrade指令中列出的文件都會(huì)在軟件包被安裝/升級(jí)時(shí)不會(huì)被更改,并且新文件會(huì)以帶有.pacnew后綴名的形式安裝
NoUpgrade=path/to/file
注意: 這個(gè)路徑指軟件包中的文件,所以不要包括開(kāi)頭的斜線(xiàn)。
在安裝時(shí)跳過(guò)文件
要總是跳過(guò)某些文件夾的安裝,可以將它們放到 NoExtract 中,例如不想安裝 systemd 模塊:
NoExtract=usr/lib/systemd/system/*
后面的規(guī)則覆蓋前面的規(guī)則,加上 ! 可以取消跳過(guò)效果。
提示: pacman會(huì)在更新locales已經(jīng)被localepurge或者bleachbit清除的包時(shí)發(fā)出警告。將CheckSpace參數(shù)加入pacman.conf能夠抑制這種警告,但是要意識(shí)到space-check功能將會(huì)對(duì)所有軟件包禁用。
保留多個(gè)配置文件
如果你有多個(gè)配置文件(比如,主配置和啟用了測(cè)試倉(cāng)庫(kù)的配置文件),需要共享一些設(shè)置,你可以在配置文件中使用Include選項(xiàng),例如:
Include = /path/to/common/settings
/path/to/common/settings文件中是兩個(gè)配置文件共享的相同配置。
Hooks
pacman可以在處理前后,運(yùn)行/usr/share/libalpm/hooks/文件夾下的hooks,更多的hooks文件夾可以通過(guò)HooDir選項(xiàng)在pacman.conf中指明,默認(rèn)/etc/pacman.d/hooks。Hook文件必須以.hook為后綴。Pacman hooks不是交互式的。
pacman hooks用于,比如說(shuō),和systemd-sysusers和systemd-tmpfiles結(jié)合來(lái)在安裝包時(shí)自動(dòng)創(chuàng)建系統(tǒng)用戶(hù)和文件。例如,tomcat8的系統(tǒng)用戶(hù)和一些屬于該用戶(hù)的文件。當(dāng)pacman確定pacman hooks systemd-sysusers.hook和systemd-tmpfiles.hook喚起systemd-sysusers和systemd-tmpfiles。
有關(guān) alpm hooks 的更多信息,參見(jiàn)
軟件倉(cāng)庫(kù)
除了特殊的通用選項(xiàng)節(jié), 每個(gè)pacman.conf中的[section]都定義了一個(gè)使用的軟件包倉(cāng)庫(kù),倉(cāng)庫(kù)是多個(gè)軟件包的邏輯上的集合,他們物理上存儲(chǔ)在一個(gè)或多個(gè)服務(wù)器:這也是為什么每一個(gè)服務(wù)器都叫做這個(gè)倉(cāng)庫(kù)的鏡像。
倉(cāng)庫(kù)區(qū)分為官方倉(cāng)庫(kù)與非官方倉(cāng)庫(kù)。配置文件中倉(cāng)庫(kù)的順序十分重要;當(dāng)幾個(gè)倉(cāng)庫(kù)出現(xiàn)同名安裝包,不管版本號(hào)如何,pacman將使用配置文件中排前的倉(cāng)庫(kù)。要在添加后使用某個(gè)倉(cāng)庫(kù),你需要先升級(jí)整個(gè)系統(tǒng)
每個(gè)倉(cāng)庫(kù)節(jié)都可以直接指定鏡像列表或者Include引用其他的文件:例如,官方鏡像引用了/etc/pacman.d/mirrorlist/。具體查看Mirrors (簡(jiǎn)體中文)。
軟件包的安全性
pacman 支持軟件包簽名,會(huì)為軟件包提供額外的安全性。默認(rèn)配置,SigLevel = Required DatabaseOptional 將啟用全局簽名驗(yàn)證,但會(huì)被每個(gè)軟件倉(cāng)庫(kù)的 SigLevel 行所覆蓋。有關(guān)軟件包簽名和簽名驗(yàn)證的更多細(xì)節(jié),參見(jiàn) pacman-key。
疑難解答
"Failed to commit transaction (conflicting files)" 錯(cuò)誤
如果碰到如下錯(cuò)誤:[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.
這是因?yàn)?pacman 檢測(cè)到文件沖突,而且按照設(shè)計(jì),pacman 不會(huì)覆蓋文件。這是設(shè)計(jì)功能,不是缺陷。
這個(gè)問(wèn)題通常很容易解決。一個(gè)安全的方式是,首先檢查是否有另一個(gè)軟件包提供了這個(gè)文件 (pacman -Qo /path/to/file)。如果文件被另一個(gè)軟件包所有,請(qǐng)報(bào)告問(wèn)題。如果不是其它軟件包提供,將 'exists in filesystem' 的文件重命名并重新運(yùn)行update命令。如果一切順利,可以刪掉這個(gè)文件。
如果你手動(dòng)安裝了一個(gè)軟件,沒(méi)有通過(guò)pacman,例如用make install,你必須將軟件連同它的全部文件一起移除/卸載。參見(jiàn)Pacman/Tips and tricks#Identify files not owned by any package。
每一個(gè)安裝的軟件包都會(huì)提供一個(gè) /var/lib/pacman/local/$package-$version/files 文件,包含此軟件包的元數(shù)據(jù)。如果文件損壞或者丟失,將會(huì)導(dǎo)致升級(jí)時(shí)出現(xiàn)file exists in filesystem 錯(cuò)誤。此錯(cuò)誤通常只會(huì)影響一個(gè)軟件包,除了手動(dòng)刪除或移動(dòng)所有的問(wèn)題文件,你也可以顯式地使用pacman -S --overwrite glob package讓 pacman 強(qiáng)制覆蓋匹配glob的文件。
"Failed to commit transaction (invalid or corrupted package)" 錯(cuò)誤
看看/var/cache/pacman/pkg中是否有*.part結(jié)尾的文件,它們是沒(méi)有完全下載的文件,刪除它們并重新執(zhí)行更新。這些程序一般是自定義的XferCommand 下載命令造成的。
# find /var/cache/pacman/pkg/ -iname "*.part" -delete
"Failed to init transaction (unable to lock database)" 錯(cuò)誤
pacman 在改變軟件包數(shù)據(jù)庫(kù)前,比如安裝軟件包時(shí),會(huì)創(chuàng)建一個(gè)文件鎖 /var/lib/pacman/db.lck。這會(huì)阻止其他 pacman 實(shí)例在同一時(shí)間修改軟件包數(shù)據(jù)庫(kù)。
如果 pacman 在更新數(shù)據(jù)庫(kù)時(shí)被打斷,舊鎖可能保留下來(lái)。如果確認(rèn)沒(méi)有 pacman 實(shí)例在運(yùn)行,那么刪掉文件鎖:
# rm /var/lib/pacman/db.lck
安裝時(shí)無(wú)法獲取軟件包
錯(cuò)誤內(nèi)容包含:Not found in sync db, Target not found 或 Failed retrieving file.
首先確認(rèn)軟件包確實(shí)存在(并注意錯(cuò)別字)。如果確認(rèn)軟件包存在,可能本地?cái)?shù)據(jù)庫(kù)過(guò)時(shí)了或者軟件倉(cāng)庫(kù)沒(méi)有配置好,試試 pacman -Syyu 強(qiáng)制數(shù)據(jù)庫(kù)更新和升級(jí)。
也有可能包含該軟件包的軟件倉(cāng)庫(kù)沒(méi)有啟動(dòng)。例如,該軟件包可能在 multilib 倉(cāng)庫(kù)里,但該倉(cāng)庫(kù)沒(méi)有在 pacman.conf 中啟用。
pacman 更新時(shí)崩潰
如果 pacman 在刪除、重新安裝或更新軟件包時(shí) "數(shù)據(jù)庫(kù)寫(xiě)入" 出錯(cuò):
從 Arch 安裝媒體啟動(dòng),最好用最新的安裝媒體
掛載根文件系統(tǒng),例如以 root 身份mount /dev/sdaX /mnt,通過(guò) df -h 確認(rèn)根文件目錄包含足夠的空間
同樣掛載 proc, sys 和 dev 文件系統(tǒng):mount -t proc proc /mnt/proc; mount --rbind /sys /mnt/sys; mount --rbind /dev /mnt/dev
如果系統(tǒng)使用默認(rèn)的數(shù)據(jù)庫(kù)目錄位置,可以通過(guò) root 用戶(hù)執(zhí)行下面命令pacman --sysroot /mnt -Syu來(lái)更新系統(tǒng)的 pacman 數(shù)據(jù)庫(kù)。
更新之后,可以通過(guò)下面命令確認(rèn)是否還存在損壞的包:find /mnt/usr/lib -size 0
通過(guò)pacman --sysroot /mnt -S package重新安裝依然損壞的軟件包
手動(dòng)重新安裝 pacman
警告: 這種方式極其容易破壞你的系統(tǒng),把它變得更糟。這個(gè)方式只是作為最后的措施,以防萬(wàn)一#pacman 更新時(shí)崩潰不起作用
即使 pacman 嚴(yán)重?fù)p壞,你仍可以手動(dòng)修復(fù)它,這需要下載最新的包并把它們解壓到正確的目錄。大致步驟如下:
確定要安裝的
從你選擇的mirror下載每個(gè)包
把每個(gè)包解壓到 root
使用pacman -S --overwrite重新安裝這些包來(lái)更新相應(yīng)的軟件包數(shù)據(jù)庫(kù)
進(jìn)行完整系統(tǒng)更新
如果你擁有一個(gè)健康的 Arch 系統(tǒng),你可以這樣查看依賴(lài)項(xiàng)的完整列表:
$ pacman -Q $(pactree -u pacman)
但是依據(jù)你遇到的問(wèn)題,你可能只需要更新其中的幾個(gè)。解壓一個(gè)包的示例是:
# tar -xvpwf package.tar.xz -C / --exclude .PKGINFO --exclude .INSTALL --exclude .MTREE --exclude .BUILDINFO
注意w參數(shù)表示交互模式。以非交互方式運(yùn)行是非常冒險(xiǎn)的,因?yàn)槟憧赡芫痛烁采w了一個(gè)重要文件。你也要注意以正確的順序解壓軟件包(例如先解壓依賴(lài))。
這個(gè)帖子包含了一些這個(gè)過(guò)程的例子,這些例子中只有少量pacman依賴(lài)項(xiàng)損壞。
升級(jí)系統(tǒng)重啟后,出現(xiàn)"unable to find root device"錯(cuò)誤,無(wú)法登陸
很有可能 initramfs 在內(nèi)核升級(jí)時(shí)損壞(例如由錯(cuò)誤地使用 pacman 的 --overwrite 選項(xiàng)導(dǎo)致)。有兩個(gè)選擇;首先嘗試 Fallback啟動(dòng)項(xiàng)。
提示: 萬(wàn)一你刪除了 Fallback 啟動(dòng)項(xiàng),你總可以在啟動(dòng)加載器菜單顯示出來(lái)的時(shí)候按Tab鍵(對(duì)于 Syslinux)或者按e鍵(對(duì)于 GRUB 或者 systemd-boot),將它重命名為initramfs-linux-fallback.img然后按Enter或者b(取決于你的啟動(dòng)加載器以新參數(shù)啟動(dòng)的方式)
一旦系統(tǒng)啟動(dòng),從控制臺(tái)或終端(為備用
# mkinitcpio -p linux
如果上面方法不行,從一個(gè)當(dāng)前的 Arch 發(fā)行(CD/DVD 或者 U盤(pán)),掛載你的根目錄和啟動(dòng)分區(qū),然后用 arch-chroot chroot
# arch-chroot /mnt
# pacman -Syu mkinitcpio systemd linux
注意:
如果你沒(méi)有一個(gè)當(dāng)前的發(fā)行或者你只有某些其他的 "live" Linux 發(fā)行版,你可以用老式的方法chroot。顯然,這種方式比簡(jiǎn)單地運(yùn)行arch-chroot腳本需要更多的輸入
如果 pacman 伴隨Could not resolve host運(yùn)行失敗,請(qǐng)檢查你的網(wǎng)絡(luò)連接
如果無(wú)法進(jìn)入 arch-chroot 或 chroot 環(huán)境,但是需要重新安裝軟件包,可以使用 pacman --sysroot /mnt -Syu foo bar 從而在你的根分區(qū)下使用 pacman
重新安裝內(nèi)核(mkinitcpio -p linux 重新生成 initramfs 鏡像,不需要單獨(dú)生成。
之后建議執(zhí)行 exit, umount /mnt/{boot,} 然后 reboot.
Signature from "User " is unknown trust, installation failed
試試以下途徑:
更新已知密鑰:pacman-key --refresh-keys;
手動(dòng)升級(jí)archlinux-keyring軟件包:pacman -Sy archlinux-keyring && pacman -Su.
請(qǐng)求導(dǎo)入 PGP keys
如果用過(guò)時(shí)的 ISO 安裝 Arch,你很有可能被提示要導(dǎo)入 PGP keys。同意下載密鑰來(lái)繼續(xù)。如果你無(wú)法成功添加 PGP keys,更新或升級(jí) keyring above).
Error: key "0123456789ABCDEF" could not be looked up remotely
如果軟件包使用了新的密鑰,且該密鑰最近才被添加到 #Signature from "User " is unknown trust, installation failed 所述更新
不停看到錯(cuò)誤 "PackageName: signature from "User " is invalid"
當(dāng)系統(tǒng)時(shí)間錯(cuò)誤時(shí),簽名密鑰將會(huì)被認(rèn)為過(guò)期(或無(wú)效)并且簽名檢查將會(huì)失敗,提示以下錯(cuò)誤信息:
error: PackageName: signature from "User " is invalid
error: failed to commit transaction (invalid or corrupted package (PGP signature))
Errors occured, no packages were upgraded.
確保矯正系統(tǒng)時(shí)間,例如在安裝或升級(jí)前從 root 執(zhí)行 ntpd -qg ,和 hwclock -w。
'warning: current locale is invalid; using default "C" locale' 錯(cuò)誤
錯(cuò)誤信息已經(jīng)很明確了,locale 設(shè)置不正確,請(qǐng)閱讀Locale進(jìn)行設(shè)置。
Pacman 不使用我的代理設(shè)置
正確設(shè)置環(huán)境變量($http_proxy, $ftp_proxy 等)如果使用 sudo,需要讓 sudo 將這些變量傳遞給 pacman.
如何重裝所有包并保留安裝和依賴(lài)信息?
重裝所有軟件包:pacman -S $(pacman -Qnq)(-S 選項(xiàng)會(huì)保留安裝緣由)。
接著需要重裝外來(lái)包(不在官方倉(cāng)庫(kù)里的軟件包)。外來(lái)包可通過(guò)pacman -Qmq查看。
"Cannot open shared object file" 錯(cuò)誤
有可能是前一次 pacman 事務(wù)中刪除或者損壞了 pacman 自身需要的一些共享庫(kù)。
要修復(fù)這種情況,你需要手動(dòng)解壓那些共享庫(kù)文件到文件系統(tǒng)中合適的地方。首先請(qǐng)查明哪個(gè)包中包含有所需的庫(kù)文件,然后在 pacman 緩存中 (/var/cache/pacman/pkg/) 找到對(duì)應(yīng)的包。解壓出需要的庫(kù)文件到文件系統(tǒng)的對(duì)應(yīng)位置,如此可以繼續(xù)使用 pacman 。
之后需要重新安裝損壞的軟件包。注意你可能需要使用 --overwrite 選項(xiàng)覆蓋掉你剛剛解壓出的系統(tǒng)文件,因?yàn)?pacman 可能沒(méi)有跟蹤到對(duì)應(yīng)的文件信息。 pacman 隨后會(huì)使用包中的文件正確替換掉共享庫(kù)文件。如此能修好您的 pacman ,然后請(qǐng)繼續(xù)更新系統(tǒng)中剩下的軟件包。
軟件包下載停滯
Some issues have been reported regarding network problems that prevent pacman from updating/synchronizing repositories. [3] [4] When installing Arch Linux natively, these issues have been resolved by replacing the default pacman file downloader with an alternative (see Improve pacman performance for more details). When installing Arch Linux as a guest OS in VirtualBox, this issue has also been addressed by using Host interface instead of NAT in the machine properties.
無(wú)法從鏡像服務(wù)器獲取 'core.db'
如果從正確的鏡像服務(wù)器收到此錯(cuò)誤,請(qǐng)換一個(gè)域名解析服務(wù)器。
error: 'local-package.pkg.tar': permission denied
如果你想要在一個(gè) sshfs 上使用pacman -U安裝軟件包并遇到了這個(gè)錯(cuò)誤,將包移動(dòng)到本地目錄,再試一次。
另請(qǐng)參見(jiàn)
總結(jié)
以上是生活随笔為你收集整理的pacman 查询_pacman (简体中文)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 骑车望山
- 下一篇: Metro Studio——轻松创建Me