pacman詳解及常見問題


安裝軟件包:
軟件包有很多可選依賴,是為軟件提供額外功能, 安裝軟件時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、開源等技術


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM