Pacman (简体中文)
相关文章
- Downgrading packages
- Improve pacman performance
- Pacman GUI Frontends
- Pacman Rosetta
- Pacman tips
- Pacman package signing
- FAQ#Package Management
- pacman-key
- Pacnew and Pacsave files
- List of Applications/Utilities#Package management
- Arch Build System
- Official repositories (简体中文)
- Arch User Repository (简体中文)
pacman 包管理器是 Arch Linux 的一大亮点。它将一个简单的二进制包格式和易用的构建系统结合了起来(参见makepkg和ABS)。不管软件包是来自官方的 Arch 库还是用户自己创建,pacman 都能方便得管理。
pacman 通过和主服务器同步软件包列表来进行系统更新,这使得注重安全的系统管理员的维护工作成为轻而易举的事情。这种服务器/客户端模式可以使用一条命令就下载/安装软件包,同时安装必需的依赖包。
pacman 用 C 语言编写,使用 .pkg.tar.xz
打包格式。
Contents
- 1 配置
- 2 用法
-
3 问题解决
- 3.1 软件包 XYZ 升级搞坏了系统!
- 3.2 我知道软件包 ABC 已经发布,但 pacman 说系统已经是最新!
- 3.3 升级时遇到问题: "file exists in filesystem"(文件系统上已经存在文件)!
- 3.4 安装软件包时提示 "not found in sync db"
- 3.5 安装软件包出错:“target not found”
- 3.6 pacman 重复升级同一个包!
- 3.7 pacman 更新时崩溃!
- 3.8 我通过 make install 安装软件,它们不属于任何软件包!
- 3.9 我需要有一个指定文件的包。我怎么知道谁提供了这个文件?
- 3.10 pacman 完全坏掉,如何修复?
- 3.11 升级系统重启后,出现"unable to find root device"错误,无法登陆
- 3.12 Signature from "User <email@gmail.com>" is unknown trust, installation failed
- 3.13 不停看到错误 "PackageName: signature from "User <email@archlinux.org>" is invalid"
- 3.14 不停收到错误error: failed to commit transaction (invalid or corrupted package)
- 3.15 如果每次使用 pacman 时都报告:'warning: current locale is invalid; using default "C" locale'. 怎么办?
- 3.16 怎样让pacman使用我的代理设置?
- 3.17 如何重装所有包并保留安装和依赖信息?
- 3.18 pacman 出错:"error: failed to init transaction (unable to lock database)"
- 4 参见
配置
pacman 的配置文件位于/etc/pacman.conf
。 man pacman.conf 可以查看配置文件的进一步信息。
通用选项
通用选项都在[options]
段。阅读 man 手册或者查看默认的 pacman.conf 可以获得有关信息和用法。
不升级软件包
如果由于某种原因,用户不希望升级某个软件包,可以加入内容如下:
IgnorePkg = 软件包名
多软件包可以用空格隔开,也可是用 glob 模式。如果只打算忽略一次升级,可以使用 --ignore
选项。
忽略了的软件包可通过 pacman -S
升级。
不升级软件包组
和软件包一样,也可以不升级某个软件包组:
IgnoreGroup = gnome
跳过
要跳过某些文件夹的安装,可以将它们放到 NoExtract
中,例如不想安装 systemd unit 文件:
NoExtract=usr/lib/systemd/system/*
软件仓库
这部分定义使用的软件仓库,在 /etc/pacman.conf
中引用,可以直接设置或者从其它文件包含。
所有官方软件仓库都使用同一个包含了'$repo
' 的 /etc/pacman.d/mirrorlist
文件,因此只需要维护一个列表。
下面例子中使用官方软件仓库,用 mirrorlist 设定镜像的一个范例。
#[testing] #SigLevel = PackageRequired #Include = /etc/pacman.d/mirrorlist [core] SigLevel = PackageRequired Include = /etc/pacman.d/mirrorlist [extra] SigLevel = PackageRequired Include = /etc/pacman.d/mirrorlist #[community-testing] #SigLevel = PackageRequired #Include = /etc/pacman.d/mirrorlist [community] SigLevel = PackageRequired Include = /etc/pacman.d/mirrorlist # 如果打算在 x86_64 系统上运行32位软件,启用 multilib 软件仓库。 #[multilib-testing] #SigLevel = PackageRequired #Include = /etc/pacman.d/mirrorlist #[multilib] #SigLevel = PackageRequired #Include = /etc/pacman.d/mirrorlist # 自定义软件仓库实例,如何创建软件仓库参见 pacman man手册页。 #[custom] #SigLevel = Optional TrustAll #Server = file:///home/custompkgs
软件包的安全性
pacman 4 支持软件包签名。语句 SigLevel = Required DatabaseOptional
将启用全局签名验证,但会被每个软件仓库的 SigLevel
行所覆盖。详情参见 pacman-key.
用法
pacman 的其他示例请阅读man pacman。下面只是一个可执行操作的小部分示范。
安装软件包
安装指定的包
安装或者升级单个软件包,或者一列软件包(包含依赖包),使用如下命令:
# pacman -S package_name1 package_name2 ...
用正则表达式安装多个软件包(参见 pacman 小贴士和这个帖子):
# pacman -S $(pacman -Ssq package_regex)
有时候在不同的软件仓库中,一个软件包有多个版本(比如[extra]和[testing])。可以选择一个来安装:
# pacman -S extra/package_name
安装包组
一些包属于一个可以同时安装的包组。例如,运行下面的命令
# 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/ 查看可用的包组。
删除软件包
删除单个软件包,保留其全部已经安装的依赖关系
pacman -R package_name
删除指定软件包,及其所有没有被其他已安装软件包使用的依赖关系:
pacman -Rs package_name
要删除软件包和所有依赖这个软件包的程序:
# pacman -Rsc package_name
要删除软件包,但是不删除依赖这个软件包的其他程序:
# pacman -Rdd package_name
pacman 删除某些程序时会备份重要配置文件,在其后面加上*.pacsave扩展名。-n 选项可以删除这些文件:
pacman -Rn package_name pacman -Rsn package_name
升级软件包
一个 pacman 命令就可以升级整个系统。花费的时间取决于系统有多老。这个命令会同步非本地(local)软件仓库并升级系统的软件包:
# pacman -Syu
pacman 是强大的软件包管理工具,但是不会做所有的事情。若有疑问,请阅读Arch 之道。用户需要负责维护自己的系统。执行系统升级时,请务必阅读 pacman 输出的所有信息。如果修改过的配置文件需要更新,新的配置文件会被保存为 .pacnew
文件以免覆盖了用户的配置。pacman 会提醒用户合并新旧文件。这些文件需要手动干预。在升级或删除软件包后,应该立即着手处理。参见 Pacnew 和 pacsave 文件。
建议升级前访问 Arch Linux 主页查看最新消息(或订阅 RSS,或订阅 arch-announce 邮件列表,或关注 @archlinux。如果升级需要不寻常的用户介入(无法简单地按照 pacman 的输出信息处理),总会给出合适的方法。
如果遇到问题,无法按照给出方法解决。请搜索下论坛,很有可能已经有人遇到并解决了。
查询包数据库
pacman 使用 -Q 参数查询本地软件包数据库。参见:
$ pacman -Q --help
使用 -S 参数来查询远程同步的数据库。参见:
$ pacman -S --help
pacman 可以在包数据库中查询软件包,查询位置包含了软件包的名字和描述:
$ pacman -Ss string1 string2 ...
要查询已安装的软件包:
$ pacman -Qs string1 string2 ...
显示软件包的详尽的信息:
$ pacman -Si package_name
查询本地安装包的详细信息:
$ pacman -Qi package_name
使用两个 -i
将同时显示备份文件和修改状态:
$ pacman -Qii package_name
要获取已安装软件包所包含文件的列表:
$ pacman -Ql package_name
未安装的软件包使用 pkgfile。
检查软件包安装的文件是否都存在:
$ pacman -Qk package_name
查询数据库获取某个文件属于哪个软件包:
$ pacman -Qo /path/to/file_name
要罗列所有不再作为依赖的软件包(孤立orphans):
$ pacman -Qdt
要显示软件包的依赖树:
$ pactree package_name
检查一个安装的软件包被那些包依赖,可以使用 pkgtools 提供的 whoneeds
:
$ whoneeds package_name
清理软件包缓存
pacman 将下载的软件包保存在 /var/cache/pacman/pkg/
并且不会自动移除旧的和未安装版本的软件包,因此需要手动清理,以免该文件夹过于庞大。
使用内建选项即可清除未安装软件包的缓存:
# pacman -Sc
由于以上种种局限,建议使用专门的脚本去处理清理哪些、清理多少缓存:
- pacman 提供的 paccache 命令默认会删除近3个版本前的软件包:
$ paccache -r
但是 paccache 不会检查某一个包是否安装了,因此会遗留未安装的包。运行一次,再运行$ paccache -ruk0
可解决此问题。更多功能参见paccache -h
。
- 除了 paccache,还可以使用 Arch User Repository 中的 pkgcachecleanAUR:
# pkgcacheclean
其它命令
升级系统时安装其他软件包:
# pacman -Syu package_name1 package_name2 ...
下载包而不安装它:
# pacman -Sw package_name
安装一个本地包(不从源里下载):
# pacman -U /path/to/package/package_name-version.pkg.tar.xz
安装一个远程包(不在 pacman 配置的源里面):
# pacman -U http://www.example.com/repo/example.pkg.tar.xz
不支持部分升级
Arch Linux 是滚动发行版,新库 版本将不断被推送到源。开发者和信任用户会按照需要重新构建源中的所有软件包。如果有本地安装的版本(例如 AUR 软件包),需要在它们的依赖关系升级了soname时重新编译。
也就是说,部分升级是不被支持的。不要使用 pacman -Sy package
或等价命令如 pacman -Sy
之后再 pacman -S package
。在安装软件包前请更新源并升级。同理请特别注意 IgnorePkg/IgnoreGroup 的使用。
如果进行了部分升级,二进制包因为找不到链接库而损坏,不要通过简单的符号链接进行修正。库升级 soname 是因为它们不再向前兼容。只要 pacman 可以运行,使用更新的源进行 pacman -Syu
就能修复这些问题。
一般注意事项
pacman 附带了许多实用工具能让系统使用更加便捷。所有工具功能都能通过 --help
开关查看。运行:
$ pacman -Ql pacman | awk -F"[/ ]" '/\/usr\/bin/ {print $5}'
查看完整列表
问题解决
软件包 XYZ 升级搞坏了系统!
Arch Linux 是滚动发行的前沿版本。软件包稳定度只要能够满足日常使用,就会发布新版本。但是,升级有时需要用户参与:更新配置文件、修改依赖关系等。
最重要的是不要"盲目"升级系统。每次都查看更新软件包列表,看看是不是有"关键"软件包升级(linux
、 xorg-server
等)。如果有,最好查看 https://www.archlinux.org 和最近的论坛帖子,看看有没有人在升级时遇到问题。
如果软件包升级会导致问题,软件打包者会保证 pacman 在升级时显示相关信息。如果升级后遇到问题,请再次查看(/var/log/pacman.log
) 中的 pacman 日志。
这时,如果确定 pacman 中没有更多信息,https://www.archlinux.org 没有新闻,论坛没有相关帖子,可以考虑通过如下方式寻求帮助:论坛、IRC 或 降级软件包。
我知道软件包 ABC 已经发布,但 pacman 说系统已经是最新!
pacman 镜像没有同步完成,一般 24 小时之后升级才会可用。
要么耐心等待,要么换镜像。从镜像状态页面可以找到同步的镜像。
升级时遇到问题: "file exists in filesystem"(文件系统上已经存在文件)!
ASIDE: 来自 https://bbs.archlinux.org/viewtopic.php?id=56373 Misfit138 的帖子
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 文件的完整路径
检查哪个软件包提供了文件。如果是其它软件包,请报告问题。如果不是其它软件包提供,将已经存在的文件重命名并重新升级。如果一切顺利,可以删掉备份文件。
安装软件包时提示 "not found in sync db"
首先,确保软件包已经存在(注意不要有打字错误)。如果确认软件包存在,软件包可能没有和源同步,或者软件源配置不正确。请试着运行 pacman -Syy
强制更新全部软件包列表。
安装软件包出错:“target not found”
首先确认软件包确实存在(并注意错别字)。如果确认软件包存在,可能本地数据库过时了或者软件仓库没有配置好,试试 pacman -Syyu
强制数据库更新和升级。
也有可能包含该软件包的软件仓库没有启动。例如,该软件包可能在 multilib 仓库里,但该仓库没有在 pacman.conf 中启用。
pacman 重复升级同一个包!
这是因为在 /var/lib/pacman/local/
有重复的条目,例如有两个 linux
条目。pacman -Qi
输出正确的版本,但是 pacman -Qu
识别了旧版本,因此尝试升级。
解决方法:删除 /var/lib/pacman/local/
中多余的条目。
pacman 更新时崩溃!
如果 pacman 在删除、重新安装或更新软件包时 "数据库写入" 出错:
- 从 Arch 安装媒体启动
- 挂载根文件系统
- 通过
pacman -Syy
更新数据库 - 通过
pacman -r 根文件系统路径 -S 软件包
重新安装
我通过 make install
安装软件,它们不属于任何软件包!
如果收到 "文件冲突" 错误,注意如果用 --force
选项, pacman 会覆盖手动安装的软件包 pacman -S --force
.
不属于任何软件包的文件列表一文中提供了查找这些文件的脚本。
我需要有一个指定文件的包。我怎么知道谁提供了这个文件?
安装 pkgfile,它使用一个单独的数据库保存所有文件的软件包归属。
pacman 完全坏掉,如何修复?
如果 pacman 完全坏掉不能使用,需要手动下载或构建需要的软件包(openssl, libarchive, libfetch[broken link: package not found], 和 pacman) 并解压到根目录。pacman 会和默认配置文件一起恢复。之后,用 pacman 重新安装这些软件包以保证数据库的完整性。
升级系统重启后,出现"unable to find root device"错误,无法登陆
很有可能 initramfs 在内核升级时损坏,例如错误的使用 pacman 的 --force
选项。有两个选择:
Fallback 启动项
如果系统可以启动,运行如下命令可以生产原始内核 linux 的 initramfs:
# mkinitcpio -p linux
Chroot 修复
如果上面方法不行,请下载 2012 年之后发布的安装程序进行启动,执行:
# 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
.
Signature from "User <email@gmail.com>" is unknown trust, installation failed
查看pacman-key#Resetting all the keys. 或试试手动升级archlinux-keyring
软件包:pacman -S archlinux-keyring
.
不停看到错误 "PackageName: signature from "User <email@archlinux.org>" is invalid"
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.系统时间可能不对,参阅 time 并运行
# hwclock -w
不停收到错误error: failed to commit transaction (invalid or corrupted package)
看看/var/cache/pacman/pkg
中是否有*.part
结尾的文件,它们是没有完全下载的文件,删除它们并重新执行更新。这些程序一般是自定义的XferCommand
下载命令造成的。
如果每次使用 pacman 时都报告:'warning: current locale is invalid; using default "C" locale'. 怎么办?
错误信息已经很明确了,locale 设置不正确,请阅读Locale进行设置。
怎样让pacman使用我的代理设置?
正确设置环境变量($http_proxy
, $ftp_proxy
etc.)如果使用sudo,需要让 sudo 将这些变量传递给 pacman.
如何重装所有包并保留安装和依赖信息?
重装所有软件包:pacman -S $(pacman -Qnq)
(-S
选项会保留安装缘由)。
接着需要重装外来包(不在官方仓库里的软件包)。外来包可通过pacman -Qmq
查看。
pacman 出错:"error: failed to init transaction (unable to lock database)"
pacman 在更新软件包数据库时,比如安装软件包时会创建一个文件锁 /var/lib/pacman/db.lck
。该文件会阻止其他 pacman 实例在同一时间修改软件包数据库。如果 pacman 在更新数据库时收到干扰,旧锁会一直存在。如果确认 pacman 没有在运行,那么删掉文件锁:
# rm /var/lib/pacman/db.lck