Pacman (简体中文)
| 摘要 |
|---|
| pacman 是 Arch Linux 的软件包管理器,负责安装、升级和删除软件。本文涵盖基本用法和处理问题的技巧。 |
| 概览 |
| Arch Linux中的软件包通过makepkg生成,每一个软件包都有一个构建脚本(称为PKGBUILD)。打包后,软件可以通过pacman安装和管理。官方软件仓库中的PKGBUILD可以从ABS树获得;更多脚本位于(不受官方支持)Arch用户软件仓库。 |
| 相关文章 |
| Downgrading Packages (简体中文) |
| Improve Pacman Performance (简体中文) |
| pacman GUI Frontends (简体中文) |
| pacman Rosetta |
| pacman Tips (简体中文) |
| Package signing |
| FAQ (简体中文)#软件包管理 |
| Pacman-key (简体中文) |
| 资源 |
| libalpm(3) Manual Page |
| pacman(8) Manual Page |
| pacman.conf(5) Manual Page |
| repo-add(8) Manual Page |
Pacman 包管理器是 Arch Linux 的一大亮点。它将一个简单的二进制包格式和易用的构建系统结合了起来(参见makepkg和ABS)。不管软件包是来自官方的 Arch 库还是用户自己创建,Pacman 都能方便得管理。
Pacman 通过和主服务器同步软件包列表来进行系统更新,这使得注重安全的系统管理员的维护工作成为轻而易举的事情。这种服务器/客户端模式可以使用一条命令就下载/安装软件包,同时安装必需的依赖包。
pacman 用 C 语言编写,使用 .pkg.tar.xz 打包格式。
配置
Pacman 的配置文件位于/etc/pacman.conf。 man pacman.conf 可以查看配置文件的进一步信息。
通用选项
通用选项都在[options]段。阅读 man 手册或者查看默认的 pacman.conf 可以获得有关信息和用法。
不升级软件包
如果由于某种原因,用户不希望升级某个软件包,可以加入内容如下:
IgnorePkg = 软件包名
多软件包用空格隔开。
不升级软件包组
和软件包一样,也可以不升级某个软件包组:
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 # If you want to run 32 bit applications on your x86_64 system, # enable the multilib repositories as required here. #[multilib-testing] #SigLevel = PackageRequired #Include = /etc/pacman.d/mirrorlist #[multilib] #SigLevel = PackageRequired #Include = /etc/pacman.d/mirrorlist # An example of a custom package repository. See the pacman manpage for # tips on creating your own repositories. #[custom] #SigLevel = Optional TrustAll #Server = file:///home/custompkgs
用法
pacman 的其他示例请阅读man pacman。下面只是一个可执行操作的小部分示范。参阅Pacman 简介。
安装软件包
安装指定的包
安装或者升级单个软件包,或者一列软件包(包含依赖包),使用如下命令:
pacman -S package_name1 package_name2 ...
有时候在不同的软件仓库中,一个软件包有多个版本(比如[extra]和[testing])。可以选择一个来安装:
pacman -S extra/package_name pacman -S testing/package_name
安装包组
一些包属于一个可以同时安装的包组。例如,运行下面的命令
# pacman -S gnome
会安装所有属于 gnome 组的包。想要查看哪些包属于 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 -Syu) 时,请务必阅读 pacman 输出的所有信息。 软件打包者通常会描述变更和引起的问题,并引导用户访问相应的 wiki 页面和资源。 - 请根据自己的使用情况安排升级时间,因为升级关键软件包可能产生不可预知的结果(尽管概率非常低)。所以如果即将进行重要的演讲,升级
xorg-server是不明智的。请在空闲时升级,并做好准备,处理升级时遇到的任何问题。 - 请随时访问 Arch Linux 主页,最好订阅RSS。当升级需要用户做特别处理时,主页上会给出通知。通常升级到达各个镜像之后,会有论坛帖子描述相应的问题,并提供详细的解决方案。
- 不建议长期不更新系统(超过 1 个月), Arch 开发者通常在软件位于[testing]的时候就升级,大部分 Arch 用户都会在一个月之内升级完毕。长期不更新系统会进入很少有人碰到的升级路径,遇到各种不可预知问题,参阅这里。
查询包数据库
pacman 使用 -Q 参数查询本地软件包数据库。参见:
pacman -Q --help
使用 -S 参数来查询远程同步的数据库。参见:
pacman -S --help
pacman 可以在包数据库中查询软件包,查询位置包含了软件包的名字和描述:
$ pacman -Ss package
要查询已安装的软件包:
$ pacman -Qs package
显示软件包的详尽的信息:
$ pacman -Si package
查询本地安装包的详细信息:
$pacman -Qi package
使用两个 -i 将同时显示备份文件和修改状态:
$ pacman -Qii package_name
要获取已安装软件包所包含文件的列表:
$pacman -Ql package
未安装的软件包使用pkgfile。
查询数据库获取某个文件属于哪个软件包:
$ pacman -Qo /path/to/a/file
要罗列所有不再作为依赖的软件包(孤立orphans):
$ pacman -Qdt
要显示软件包的依赖树:
$ pactree package_name
检查一个安装的软件包被那些包依赖,可以使用 pkgtools 提供的 whoneeds:
$ whoneeds package_name
其它命令
下载包而不安装它:
# 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
删除 Cache 中当前未安装的软件包(/var/cache/pacman/pkg):
# pacman -Sc
完全清理包缓存:
# pacman -Scc
作为-Sc 和 -Scc的替换,可以使用paccache。此工具提供了更多的控制,例如软件包和删除数量等。使用方法参阅paccache -h。
不支持部分升级
Arch Linux 是滚动发行版,新库 版本将不断被推送到源。开发者和信任用户会按照需要重新构建源中的所有软件包。如果有本地安装的版本(例如 AUR 软件包),需要在它们的依赖关系升级了soname时重新编译。
也就是说,部分升级是不被支持的。不要使用 pacman -Sy package 或等价命令如 pacman -Sy 之后再 pacman -S package。在安装软件包前请更新源并升级。同理请特别注意 IgnorePkg/IgnoreGroup 的使用。
如果进行了部分升级,二进制包因为找不到链接库而损坏,不要通过简单的符号链接进行修正。库升级 soname 是因为它们不再向前兼容。只要 pacman 可以运行,使用更新的源进行 pacman -Syu 就能修复这些问题。
问题解决
Q: 软件包 XYZ 升级搞坏了系统!
最重要的是不要"盲目"升级系统。每次都查看更新软件包列表,看看是不是有"关键"软件包升级(linux、 xorg-server等)。如果有,最好查看 https://www.archlinux.org 和最近的论坛帖子,看看有没有人在升级时遇到问题。
如果软件包升级会导致问题,软件打包者会保证 pacman 在升级时显示相关信息。如果升级后遇到问题,请再次查看(/var/log/pacman.log) 中的 pacman 日志。
Q: 我知道软件包 ABC 已经发布,但 pacman 说系统已经是最新!
Q: 升级时遇到问题: "file exists in filesystem"(文件系统上已经存在文件)!
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 文件的完整路径 检查哪个软件包提供了文件。如果是其它软件包,请报告问题。如果不是其它软件包提供,将已经存在的文件重命名并重新升级。如果一切顺利,可以删掉备份文件。Q: 安装软件包时提示 "not found in sync db"
pacman -Syy 强制更新全部软件包列表。Q: pacman 重复升级同一个包!
/var/lib/pacman/local/ 有重复的条目,例如有两个 linux 条目。pacman -Qi 输出正确的版本,但是 pacman -Qu 识别了旧版本,因此尝试升级。
解决方法:删除 /var/lib/pacman/local/ 中多余的条目。
Q: pacman 更新时崩溃!
- 从 Arch 安装媒体启动
- 挂载根文件系统
- 通过
pacman -Syy更新数据库 - 通过
pacman -r 根文件系统路径 -S 软件包重新安装
Q: 我通过 make install 安装软件,它们不属于任何软件包!
--force 选项, pacman 会覆盖手动安装的软件包 (pacman -S --force. )。
不属于任何软件包的文件列表一文中提供了查找这些文件的脚本。Q: 我需要有一个指定文件的包。我怎么知道谁提供了这个文件?
Q: pacman 完全坏掉,如何修复?
Q: 升级系统重启后,出现"unable to find root device"错误,无法登陆
--force 选项。有两个选择:
1. 试试 Fallback 启动项.
- 如果系统可以启动,运行如下命令可以生产原始内核 linux 的 initramfs:
-
# mkinitcpio -p linux
2. 如果上面方法不行,请下载 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.
}}
Q: 不停看到错误:
- 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.
Q: Signature from "User <email@gmail.com>" is unknown trust, installation failed
Q: 不停收到错误error: failed to commit transaction (invalid or corrupted package)
/var/cache/pacman/pkg中是否有*.part结尾的文件,它们是没有完全下载的文件,删除它们并重新执行更新。这些程序一般是自定义的XferCommand 下载命令造成的。