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.