安裝軟件包:
軟件包有很多可選依賴,是為軟件提供額外功能, 安裝軟件時pacman 會輸出可選依賴, 但不會在 pacman.log中,瀏覽安裝軟件的可選以來可用pacman -Si得到可選依賴的簡短描述
安裝指定的包:
安裝或者升級單個軟件包,或者一列軟件包(包含依賴包)
pacman -S package_name1 package_name2 ...
用正則表達式安裝多個軟件包:
pacman -S $(pacman -Ssq package_regex)
有時候在不同的軟件倉庫中,一個軟件包有多個版本(比如[extra]和[testing]):(就是指定包的精確位置)
pacman -S extra/package_name
安裝多個含有相似名稱的軟件包,而並非整個包組或全部匹配的軟件包:
pacman -S plasma-{desktop,mediacenter,nm}
可以多層擴展,並不作限制:
pacman -S plasma-{workspace{,-wallpapers},pa}
安裝包組:
一些包屬於一個可以同時安裝的軟件包組:
pacman -S gnome
會提醒用戶選擇 gnome 內需要安裝的包。
刪除軟件包:
刪除單個軟件包,保留其全部已經安裝的依賴關系
pacman -R package_name
刪除指定軟件包,及其所有沒有被其他已安裝軟件包使用的依賴關系:
pacman -Rs package_name
要刪除軟件包和所有依賴這個軟件包的程序:
警告: 此操作是遞歸的,請小心檢查,可能會一次刪除大量的軟件包。
pacman -Rsc package_name
要刪除軟件包,但是不刪除依賴這個軟件包的其他程序:
pacman -Rdd package_name
pacman刪除某些程序時會備份重要配置文件,備份出來的文件是在其后面加上*.pacsave擴展名。
-n 選項可以避免備份這些文件:
pacman -Rn package_name
注意: pacman 不會刪除軟件自己創建的文件(例如主目錄中的 .dot 文件不會被刪除。
升級軟件包
警告: * 建議所有用戶都 經常性的更新系統。Arch 只支持系統完整升級
一個 pacman 命令就可以升級整個系統。花費的時間取決於系統有多老。這個命令會同步非本地(local)軟件倉庫並升級系統的軟件包:
# pacman -Syu
查詢包數據庫:
-Q 參數查詢本地軟件包數據庫:
$ pacman -Q --help
-S 參數來查詢遠程同步的數據庫:
$ pacman -S --help
在包數據庫中查詢軟件包,查詢位置包含了軟件包的名字和描述:
$ pacman -Ss string1 string2 ...
-s的內置正則會匹配很多不需要的結果,所以應當指定僅搜索包名,而非描述或其他子段,下面的命令返回不必要結果:
$ pacman -Ss '^vim-'
要查詢已安裝的軟件包:
$ pacman -Qs string1 string2 ...
按文件名查找軟件庫:
$ pacman -Fs string1 string2 ...
顯示軟件包的詳細信息:
$ pacman -Si package_name
查詢本地安裝包的詳細信息:
$ pacman -Qi package_name
使用兩個 -i 將同時顯示備份文件和修改狀態:
$ pacman -Qii package_name
要獲取已安裝軟件包所包含文件的列表:
$ pacman -Ql package_name #相當於centos中的rpm -ql+包名 命令
查詢遠程庫中軟件包包含的文件:
$ pacman -Fl package_name #相當於centos中的rpm -qpi+包名 命令
檢查軟件包安裝的文件是否都存在,兩個k將會更徹底的檢查:
$ pacman -Qk package_name
查詢數據庫獲取某個文件屬於哪個軟件包:
$ pacman -Qo /path/to/file_name
查詢文件屬於遠程數據庫中的哪個軟件包:
$ pacman -Fo /path/to/file_name
列出所有不再作為依賴的軟件包(孤立orphans):
$ pacman -Qdt
列出所有明確安裝而且不被其它包依賴的軟件包:
$ pacman -Qet
顯示軟件包的依賴樹:
$ pactree package_name
檢查一個安裝的軟件包被那些包依賴,可使用pkgtoolsAUR中的whoneeds:
$ whoneeds package_name
或者pactree中使用-r:
$ pactree -r package_name
數據庫結構:
pacman數據庫通常位於 /var/lib/pacman/sync. 對於每一個在/etc/pacman.conf中指定的軟件倉庫, 這里都有一個一致的數據庫。/var/lib/pacman/local數據庫文件夾里每個tar.gz文件都包含着一個倉庫的軟件包信息。例如which 包:
% tree which-2.20-6
which-2.20-6
|-- depends
`-- desc
上面depends 項列出了該軟件的依賴包, 而desc有該包的介紹,例如文件大小和MD5值 。
清理軟件包緩存:
pacman 將下載的軟件包保存在 /var/cache/pacman/pkg/ 並且不會自動移除舊的和未安裝版本的軟件包,因此需要手動清理,以免該文件夾過於龐大。
使用內建選項即可清除未安裝軟件包的緩存:
# pacman -Sc
警告:
僅在確定當前安裝的軟件包足夠穩定且不需要降級時才執行清理。pacman -Sc僅會保留軟件包的當前有效版本,舊版本的軟件包被清理后,只能從其他地方如 Arch Linux Archive (簡體中文)中獲取了。
pacman -Scc 可以清理所有緩存,但這樣 pacman 在重裝軟件包時就只能重新下載了。除非空間不足,否則不應這么做。
由於以上種種局限,建議使用專門的腳本去處理清理哪些、清理多少緩存:
pacman 提供的 paccache 命令默認會刪除近3個版本前的軟件包
# paccache -r
或者使用 pacman hooks 自動執行清理
也可以自己設置保留最近幾個版本:
# paccache -rk 1
清理所有未安裝包的緩存文件:
# paccache -ruk0
升級系統時安裝其他軟件包:
# pacman -Syu package_name1 package_name2 ...
下載包而不安裝它:
# pacman -Sw package_name
安裝一個本地包(不從源里下載):
# pacman -U /path/to/package/package_name-version.pkg.tar.xz
要將本地包保存至緩存,可執行:
# pacman -U file://path/to/package/package_name-version.pkg.tar.xz
安裝一個遠程包(不在 pacman 配置的源里面):
# pacman -U http://www.example.com/repo/example.pkg.tar.xz
要禁用 -S, -U 和 -R 動作,可以使用 -p 選項.
pacman 會列出需要安裝和刪除的軟件,並在執行動作前要求需要的權限。
安裝原因:
pacman數據庫按照軟件包被安裝的原因,將其分為兩類:
1、指定安裝包:通過pacman-S或者-U指令安裝的軟件包。
2、依賴包:指定安裝包所依賴的軟件包,盡管命令中未傳入,但仍然會被安裝。
當安裝軟件包時,可以把安裝原因指定設為依賴:
# pacman -S --asdeps package_name
但是當重新安裝該軟件包時,安裝原因將會被設為軟件包所默認的。 指定安裝的軟件包列表可用pacman -Qe, 已安裝的依賴包可用pacman -Qd獲取。 改變某個已安裝軟件包的安裝原因,可以執行:
# pacman -D --asdeps package_name
使用--asexplicit改為指定安裝。
查詢一個包含具體文件的包名
同步文件數據庫:
# pacman -Fy
查詢包含某個文件的包名,比如:
# pacman -Fs 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
提示: 可以設置一個 crontab 或者 systemd timer 來定期同步文件信息數據庫。
配置:
pacman 的配置文件位於/etc/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 具有顏色選項,在/etc/pacman.conf文件中取消 "Color" 的注釋行即可.
不升級軟件包
如果由於某種原因,用戶不希望升級某個軟件包,可以加入內容如下:
IgnorePkg = 軟件包名
多軟件包可以用空格隔開,如果只打算忽略一次升級,可以使用 --ignore 選項。
忽略了的軟件包可通過 pacman -S 升級
不升級軟件包組:
IgnoreGroup = gnome
跳過軟件包文件
Warning: 跳過軟件包時請考慮清楚,Arch 官方並不支持 部分更新。
要跳過某些文件夾的安裝,可以將它們放到 NoExtract 中,例如不想安裝 systemd unit 文件:
NoExtract=usr/lib/systemd/system/*
軟件倉庫
除了特殊的options section, 每個pacman.conf中的section都定義了一個使用的軟件包倉庫,倉庫是多個軟件包的邏輯上的集合,他們物理上存儲在一個或多個服務器:這也是為什么每一個服務器都叫做這個倉庫的鏡像。
倉庫區分為:官方與非官方兩類。
配置文件中倉庫的順序十分重要,當幾個倉庫出現同名安裝包,不管版本號是否相同,pacman將使用配置文件中排前的倉庫。upgrade升級整個系統來讓新添加的倉庫生效。
每個倉庫設置都可以直接指定鏡像列表或者Include引用其他的文件:例如,官方鏡像引用了/etc/pacman.d/mirrorlist/
軟件包的安全性
pacman 4 支持軟件包簽名。語句 SigLevel = Required DatabaseOptional 將啟用全局簽名驗證,但會被每個軟件倉庫的 SigLevel 行所覆蓋。
小心使用 --force(強制的意思)開關。使用不當會造成大問題。 如果 Arch 沒有特殊聲明要用,需慎重使用。
pacman 附帶了許多實用工具能讓系統使用更加便捷。所有工具功能都能通過 --help 開關查看:
$ pacman -Ql pacman | awk -F"[/ ]" '/\/usr\/bin/ {print $5}' 來查看完整列表
常見問題:
升級時遇到的問題:
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 -Qo 文件的完整路徑 檢查哪個軟件包提供了文件。如果不是其它軟件包提供,將已經存在的文件重命名並重新升級。如果升級成功,可以刪掉備份文件。
如果是通過 make install 等非 pacman 方式安裝的軟件,安裝的文件不屬於任何軟件包!需要先手動刪除這些文件即可正常安裝軟件。
每一個安裝的軟件包都會提供一個 /var/lib/pacman/local/$package-$version/files 文件,包含此軟件包的元數據。如果文件損壞或者丟失將會導致升級時出現file exists in filesystem 錯誤。這種錯誤通常只會影響一個軟件包,除了手動刪除或移動所有的問題文件,可以作為特例使用pacman -S --force $package讓 pacman 強制覆蓋這些文件。
警告: --force 選項非常危險,建議在 Arch 新聞中明確通知的時候才使用它,否則可能導致系統無法啟動。
"failed to commit transaction (invalid or corrupted package" 錯誤
看看/var/cache/pacman/pkg中是否有*.part結尾的文件,它們是沒有完全下載的文件,刪除它們並重新執行更新。這些程序一般是自定義的XferCommand 下載命令造成的。
# find /var/cache/pacman/pkg/ -iname "*.part" -exec rm {} \;
"error: failed to init transaction (unable to lock database)" 錯誤
pacman 在更新軟件包數據庫前,比如安裝軟件包時會創建一個文件鎖 /var/lib/pacman/db.lck。該文件會阻止其他 pacman 實例在同一時間修改軟件包數據庫。如果 pacman 在更新數據庫時收到干擾,舊鎖會一直存在。
如果確認 pacman 沒有在運行,那么刪掉文件鎖:
# rm /var/lib/pacman/db.lck
安裝時無法獲取軟件包
錯誤內容包含:Not found in sync db, Target not found 或 Failed retrieving file.
首先確認軟件包確實存在(並注意錯別字)。如果確認軟件包存在,可能本地數據庫過時了或者軟件倉庫沒有配置好,試試 pacman -Syyu 強制數據庫更新和升級。
也有可能包含該軟件包的軟件倉庫沒有啟動。
例如,該軟件包可能在 multilib 倉庫里,但該倉庫沒有在 pacman.conf 中啟用。
pacman 完全壞掉修復過程:
如果 pacman 完全壞掉不能使用,需要手動下載或構建需要的軟件包(openssl, libarchive 和 pacman) 並解壓到根目錄。pacman 會和默認配置文件一起恢復。然后用 pacman 重新安裝這些軟件包以保證數據庫的完整性。
pacman 更新時崩潰
如果 pacman 在刪除、重新安裝或更新軟件包時 "數據庫寫入" 出錯:
1、從 Arch 安裝媒體啟動,最好用最新的安裝媒體
2、掛載根文件系統,通過 df -h 確認根文件目錄包含足夠的空間
3、如果系統使用默認的數據庫目錄位置,可以通過root用戶執行下面命令:
# pacman --root=/mnt --cachedir=/mnt/var/cache/pacman/pkg -Syyu
4、更新之后,可以通過下面命令確認是否還存在損壞的包:find /mnt/usr/lib -size 0
5、通過下面命令重新安裝依然損壞的軟件包:
#pacman --root /mnt --cachedir=/mnt/var/cache/pacman/pkg -S package.
升級系統重啟后,出現"unable to find root device"錯誤,無法登陸
很有可能 initramfs 在內核升級時損壞,例如錯誤的使用 pacman 的 --force 選項。有兩個選擇:
Fallback 啟動項
提示: 如果刪除了此啟動項,可以在啟動時進入啟動加載器的手動模式,將 initramfs 修改為 initramfs-linux-fallback.img 繼續啟動。
如果系統可以啟動,運行如下命令可以生產原始內核 linux 的 initramfs:
# mkinitcpio -p linux
待續..........
歡迎加入QQ群一起討論Linux、開源等技術