package: /path/to/file exists in filesystem Errors occurred, no packages were upgraded.
不知道幹了什麼以後,只要經過pacman -Sy 安裝(譬如安裝sudo 還有mutt)都會報上述的錯誤。摸了一個晚上都解決不了。後來查看wiki,說明以下:php
pacman 檢測到文件衝突,並且按照設計,pacman 不會覆蓋文件。這是設計功能,不是缺陷。 先用 (pacman -Qo 文件的完整路徑 檢查哪一個軟件包提供了文件。若是是其它軟件包,請報告問題。若是不是其它軟件包提供,將已經存在的文件重命名並從新升級。若是一切順利,能夠刪掉備份文件。 若是是經過 make install 等非 pacman 方式安裝的軟件,安裝的文件不屬於任何軟件包!須要先手動刪除這些文件,這樣就能夠正常安裝軟件了。不屬於任何軟件包的文件列表一文中提供了查找這些文件的腳本。 每個安裝的軟件包都會提供一個 /var/lib/pacman/local/$package-$version/files 文件,包含此軟件包的元數據。若是文件損壞或者丟失,將會致使升級時出現file exists in filesystem 錯誤。此錯誤一般只會影響一個軟件包,除了手動刪除或移動全部的問題文件,能夠做爲特例使用pacman -S --force $package讓 pacman 強制覆蓋這些文件。 警告: --force 選項很是危險,建議在 Arch 新聞中明確通知的時候才使用它,不然可能致使系統沒法啓動。
因爲報錯文件估摸上百個,因此只拿了最後一個文件經過pacman -Qo 文件絕對路徑 ,查看文件所屬。可是結果上該文件沒有所屬,手動刪臣妾又作不到。後來就壯着膽經過pacman -S --force 包名 進行強制安裝,終得解決,只是不知有沒其餘後遺症。html
pacman -S --force sudo
下面只是一個可執行操做的小部分示範,pacman 的其餘示例請閱讀pacman(8)。linux
提示: 使用過其它發行版的用戶,能夠參考 Pacman Rosetta 中的對比.git
注意: 軟件包一般有不少可選依賴, 它們爲軟件提供額外功能, 並不強制要求安裝它們。 安裝軟件時, pacman 將會輸出它的可選依賴, 可是這個輸出不會在 pacman.log
中;當你想瀏覽已安裝軟件的可選依賴時可使用pacman -Si
,獲得關於可選依賴的簡短描述。正則表達式
警告: 在Arch下安裝軟件包時,未更新系統前,不要更新軟件包數據庫(例如,可能出現某軟件包再也不出如今官方庫)。操做時,應使用pacman -Syu package_name
, 而不要使用(pacman -Sy package_name
),不然可能會有依賴問題。參見 System maintenance (簡體中文)#不支持部分升級 和 BBS#89328.數據庫
安裝或者升級單個軟件包,或者一列軟件包(包含依賴包),使用以下命令:vim
# pacman -S package_name1 package_name2 ...
用正則表達式安裝多個軟件包(參見 pacman 小貼士[broken link: invalid section]和這個帖子):緩存
# pacman -S $(pacman -Ssq package_regex)
有時候在不一樣的軟件倉庫中,一個軟件包有多個版本(好比[extra]和[testing])。能夠選擇一個來安裝:安全
# pacman -S extra/package_name
安裝多個含有類似名稱的軟件包,而並不是整個包組或所有匹配的軟件包; 例如,plasma:bash
# pacman -S plasma-{desktop,mediacenter,nm}
固然,能夠多層擴展,並不做限制:
# pacman -S plasma-{workspace{,-wallpapers},pa}
一些包屬於一個能夠同時安裝的軟件包組。例如,運行下面的命令
# 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://www.archlinux.org/groups/ 查看可用的包組。
注意: 若是列表中的包已經安裝在系統中,它會被從新安裝,即便它已是最新的。能夠用 --needed
選項覆蓋這種行爲。
刪除單個軟件包,保留其所有已經安裝的依賴關係
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
文件不會被刪除。
警告: * 建議全部用戶都 常常性的更新系統。
一個 pacman 命令就能夠升級整個系統。花費的時間取決於系統有多老。這個命令會同步非本地(local)軟件倉庫並升級系統的軟件包:
# pacman -Syu
pacman 使用 -Q
參數查詢本地軟件包數據庫。參見:
$ pacman -Q --help
使用 -S
參數來查詢遠程同步的數據庫。參見:
$ pacman -S --help
pacman 能夠在包數據庫中查詢軟件包,查詢位置包含了軟件包的名字和描述:
$ 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
查詢遠程庫中軟件包包含的文件:
$ pacman -Fl package_name
檢查軟件包安裝的文件是否都存在:
$ pacman -Qk package_name
兩個參數k
將會執行一次更完全的檢查。 查詢數據庫獲取某個文件屬於哪一個軟件包:
$ 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 tips。
pacman數據庫一般位於 /var/lib/pacman/sync
. 對於每個在/etc/pacman.conf
中指定的軟件倉庫, 這裏都有一個一致的數據庫。數據庫文件夾裏每一個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
Tip: 可使用 pacman hooks 自動執行清理,這裏是參考示例。
也能夠本身設置保留最近幾個版本:
# paccache -rk 1
清理全部未安裝包的緩存文件,再此運行paccache
:
# paccache -ruk0
更多功能參見paccache -h
。
paccache,還可使用 Arch User Repository 中的 pkgcachecleanAUR:
# pkgcacheclean
,以及pacleanerAUR,這兩個是將來的替代工具.
升級系統時安裝其餘軟件包:
# 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數據庫按照軟件包被安裝的緣由,將其分爲兩類:
-S
或者-U
指令安裝的軟件包。當安裝軟件包時,能夠把安裝緣由指定設爲依賴:
# 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
來按期同步文件信息數據庫。
若是須要高級功能請安裝 pkgfile,它使用一個單獨的數據庫來保存文件和它們所關聯的軟件包的信息。
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 具備顏色選項,取消 "Color" 行的註釋便可.
若是因爲某種緣由,用戶不但願升級某個軟件包,能夠加入內容以下:
IgnorePkg = 軟件包名
多軟件包能夠用空格隔開,也但是用 glob 模式。若是隻打算忽略一次升級,可使用 --ignore
選項。
忽略了的軟件包可經過 pacman -S
升級。
和軟件包同樣,也能夠不升級某個軟件包組:
IgnoreGroup = gnome
Warning: 跳過軟件包時請考慮清楚,Arch 官方並不支持 部分更新。
要跳過某些文件夾的安裝,能夠將它們放到 NoExtract
中,例如不想安裝 systemd unit 文件:
NoExtract=usr/lib/systemd/system/*
後面的規則覆蓋前面的規則,加上 !
能夠取消跳過效果.
若是你有多個配置文件(好比,主配置和測試testing倉庫生效的配置文件),須要共享一些設置:
Include = /path/to/common/settings
/path/to/common/settings
文件中是兩個配置文件共享的相同配置。
pacman能夠在更新安裝先後時,運行/usr/share/libalpm/hooks/
文件夾下的hooks,更多的hooks文件夾HooDir
能夠在pacman.conf
中設置,默認/etc/pacman.d/hooks
。Hook文件必須以.hook結尾。
除了特殊的options[broken link: invalid section]section, 每一個pacman.conf
中的section
都定義了一個使用的軟件包倉庫,倉庫是多個軟件包的邏輯上的集合,他們物理上存儲在一個或多個服務器:這也是爲何每個服務器都叫作這個倉庫的鏡像。
倉庫區分爲官方]與[Unofficial user repositories|非官方兩類。配置文件中倉庫的順序十分重要;當幾個倉庫出現同名安裝包,無論版本號是否相同,pacman將使用配置文件中排前的倉庫。upgrade[broken link: invalid section]升級整個系統,來讓新添加的倉庫生效。
每一個倉庫設置均可以直接指定鏡像列表或者Include
引用其餘的文件:例如,官方鏡像引用了/etc/pacman.d/mirrorlist/
。具體查看Mirrors。
pacman 4 支持軟件包簽名。語句 SigLevel = Required DatabaseOptional
將啓用全局簽名驗證,但會被每一個軟件倉庫的 SigLevel
行所覆蓋。詳情參見 pacman-key.
警告: 當心使用 --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 檢測到文件衝突,並且按照設計,pacman 不會覆蓋文件。這是設計功能,不是缺陷。
先用 (pacman -Qo 文件的完整路徑
檢查哪一個軟件包提供了文件。若是是其它軟件包,請報告問題。若是不是其它軟件包提供,將已經存在的文件重命名並從新升級。若是一切順利,能夠刪掉備份文件。
若是是經過 make install
等非 pacman 方式安裝的軟件,安裝的文件不屬於任何軟件包!須要先手動刪除這些文件,這樣就能夠正常安裝軟件了。不屬於任何軟件包的文件列表一文中提供了查找這些文件的腳本。
每個安裝的軟件包都會提供一個 /var/lib/pacman/local/$package-$version/files
文件,包含此軟件包的元數據。若是文件損壞或者丟失,將會致使升級時出現file exists in filesystem
錯誤。此錯誤一般只會影響一個軟件包,除了手動刪除或移動全部的問題文件,能夠做爲特例使用pacman -S --force $package
讓 pacman 強制覆蓋這些文件。
警告: --force
選項很是危險,建議在 Arch 新聞中明確通知的時候才使用它,不然可能致使系統沒法啓動。
看看/var/cache/pacman/pkg
中是否有*.part
結尾的文件,它們是沒有徹底下載的文件,刪除它們並從新執行更新。這些程序通常是自定義的XferCommand
下載命令形成的。
# find /var/cache/pacman/pkg/ -iname "*.part" -exec rm {} \;
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 中啓用。
參閱FAQ#Why is there only a single version of each shared library in the official repositories?.
注意: pacman 版本 3.4 在遇到重複條目時會顯示錯誤,所以這個問題過期了。
這是由於在 /var/lib/pacman/local/
有重複的條目,例若有兩個 linux
條目。pacman -Qi
輸出正確的版本,可是 pacman -Qu
識別了舊版本,所以嘗試升級。
解決方法:刪除 /var/lib/pacman/local/
中多餘的條目。
若是 pacman 徹底壞掉不能使用,須要手動下載或構建須要的軟件包(openssl, libarchive 和 pacman) 並解壓到根目錄。pacman 會和默認配置文件一塊兒恢復。以後,用 pacman 從新安裝這些軟件包以保證數據庫的完整性。
若是 pacman 在刪除、從新安裝或更新軟件包時 "數據庫寫入" 出錯:
df -h
確認根文件目錄包含足夠的空間pacman --root=/mnt --cachedir=/mnt/var/cache/pacman/pkg -Syyu
find /mnt/usr/lib -size 0
pacman --root /mnt --cachedir=/mnt/var/cache/pacman/pkg -S package
.The official installation media (ISO) before version 10.2015 are not setup to be updated itself at runtime. Running pacman -Syu
from a booted install media console may crash unexpectedly any time, as soon as memory is depleted. This happens because the install media image build reports an arbitrary capacity (of 32GB) to pacman, regardless of available free memory.[1] At the same time the ISO reserves only a low static memory allotment for operations (/run/archiso/cowspace
of 256MB
RAM) of the live system, in order to allow installation on machines with low resources. If the machine has more RAM available, you can override the allotment by setting the cow_spacesize=
kernel option for the ISO manually, e.g. cow_spacesize=2GB
.
If you use the install media to update an installed system, you simply have to use the --root=
option along with a --cachedir=
path to point pacman to available real storage. For example, see #pacman 更新時崩潰.
If you require an install media with persistent dataspace, the Archiso build script can be used to create one along with its boot options.
頗有可能 initramfs 在內核升級時損壞,例如錯誤的使用 pacman 的 --force
選項。有兩個選擇:
提示: 若是刪除了此啓動項,能夠在啓動時進入啓動加載器的手動模式,將 initramfs 修改成 initramfs-linux-fallback.img
繼續啓動。
若是系統能夠啓動,運行以下命令能夠生產原始內核 linux 的 initramfs:
# mkinitcpio -p linux
若是上面方法不行,請下載最新的安裝程序進行啓動,執行:
# mount /dev/sdxY /mnt #Your root partition. # mount /dev/sdxZ /mnt/boot #If you use a separate /boot partition. # arch-chroot /mnt # pacman -Syu mkinitcpio systemd-tools linux
從新安裝內核(linux 軟件包)將會自動運行 mkinitcpio -p linux
從新生成 initramfs 鏡像,不須要單獨生成。
以後建議執行 exit
, umount /mnt/{boot,}
而後 reboot
.
Note: 若是沒法進入 arch-chroot 或 chroot 環境,可是須要從新安裝軟件包,可使用 pacman -r /mnt -Syu foo bar
試試如下途徑:
pacman-key --refresh-keys
;archlinux-keyring
軟件包:pacman -Sy archlinux-keyring && pacman -Su
.If installing Arch with an outdated ISO, you are likely prompted to import PGP keys. Agree to download the key to proceed. If you are unable to add the PGP key successfully, update the keyring or upgrade archlinux-keyring (see above).
If packages are signed with new keys, which were only recently added to archlinux-keyring, these keys are not locally available during update (chicken-egg-problem). The installed archlinux-keyring does not contain the key, until it is updated. Pacman tries to bypass this by a lookup through a key-server, which might not be possible e.g. behind proxys or firewalls and results in the stated error. Upgrade archlinux-keyring first as shown above.
When the system time is faulty, signing keys are considered expired (or invalid) and signature checks on packages will fail with the following error:
error: PackageName: signature from "User <email@archlinux.org>" is invalid error: failed to commit transaction (invalid or corrupted package (PGP signature)) Errors occured, no packages were upgraded.
Make sure to correct the time, for example with ntpd -qg
run as root, and run hwclock -w
as root before subsequent installations or upgrades.
錯誤信息已經很明確了,locale 設置不正確,請閱讀Locale進行設置。
正確設置環境變量($http_proxy
, $ftp_proxy
etc.)若是使用sudo,須要讓 sudo 將這些變量傳遞給 pacman.
重裝全部軟件包:pacman -S $(pacman -Qnq)
(-S
選項會保留安裝原因)。
接着須要重裝外來包(不在官方倉庫裏的軟件包)。外來包可經過pacman -Qmq
查看。
It looks like previous pacman transaction removed or corrupted shared libraries needed for pacman itself.
To recover from this situation you need to unpack required libraries to your filesystem manually. First find what package contains the missed library and then locate it in the pacman cache (/var/cache/pacman/pkg/
). Unpack required shared library to the filesystem. This will allow to run pacman.
須要從新安裝損壞的軟件包. Note that you need to use --force
flag as you just unpacked system files and pacman does not know about it. pacman will correctly replace our shared library file with one from package.
That's it. Update the rest of the system.
Some issues have been reported regarding network problems that prevent pacman from updating/synchronizing repositories. [2] [3] When installing Arch Linux natively, these issues have been resolved by replacing the default pacmanfile 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.