ArchLinux的Pacman命令入门
pacman 包管理器是 Arch Linux 和其他主要发行版如 Red
Hat 和 Ubuntu/Debian
之间的主要区别之一。它结合了简单的二进制包格式和易于使用的 构建系统。pacman
的目标是方便地管理软件包,无论它是来自 官方库 还是用户自己构建的软件库。
如果你曾经使用过 Ubuntu 或基于 debian
的发行版,那么你可能使用过 apt-get
或 apt
命令。pacman
在
Arch Linux 中是同样的命令。如果你 刚刚安装了 Arch
Linux,在安装 Arch Linux 后,首先要做的 几件事 之一就是学习使用 pacman
命令。
下面我将解释一些基本的 pacman
命令的用法,你应该知道如何用这些命令来管理你的基于
Archlinux 的系统。
Arch Linux 用户应该知道的几个重要的 pacman 命令
与其他包管理器一样,pacman
可以将包列表与软件库同步,它能够自动解决所有所需的依赖项,以使得用户可以通过一个简单的命令下载和安装软件。
通过 pacman 安装软件
你可以用以下形式的代码来安装一个或者多个软件包:
1 | sudo pacman -S 软件包名1 软件包名2 ... |
-S
选项的意思是同步synchronization,它的意思是 pacman
在安装之前先与软件库进行同步。
pacman
数据库根据安装的原因将安装的包分为两组:
- 显式安装:由
pacman -S
或-U
命令直接安装的包 - 依赖安装:由于被其他显式安装的包所 依赖,而被自动安装的包。
卸载已安装的软件包
卸载一个包,并且删除它的所有依赖。
1 | sudo pacman -R 软件包名 |
删除一个包,以及其不被其他包所需要的依赖项:
1 | sudo pacman -Rs 软件包名 |
如果需要这个依赖的包已经被删除了,这条命令可以删除所有不再需要的依赖项:
1 | sudo pacman -Qdtq | pacman -Rs - |
升级软件包
pacman
提供了一个简单的办法来 升级 Arch
Linux。你只需要一条命令就可以升级所有已安装的软件包。这可能需要一段时间,这取决于系统的新旧程度。
以下命令可以同步存储库数据库,并且 更新系统的所有软件包,但不包括不在软件库中的“本地安装的”包:
1 | sudo pacman -Syu |
S
代表同步y
代表更新本地存储库u
代表系统更新
也就是说,同步到中央软件库(主程序包数据库),刷新主程序包数据库的本地副本,然后执行系统更新(通过更新所有有更新版本可用的程序包)。
注意!
对于 Arch Linux 用户,在系统升级前,建议你访问 Arch-Linux 主页 查看最新消息,以了解异常更新的情况。如果系统更新需要人工干预,主页上将发布相关的新闻。你也可以订阅 RSS 源 或 Arch 的声明邮件。
在升级基础软件(如 kernel、xorg、systemd 或 glibc) 之前,请注意查看相应的 论坛,以了解大家报告的各种问题。
在 Arch 和 Manjaro 等滚动发行版中不支持部分升级。这意味着,当新的库版本被推送到软件库时,软件库中的所有包都需要根据库版本进行升级。例如,如果两个包依赖于同一个库,则仅升级一个包可能会破坏依赖于该库的旧版本的另一个包。
用 Pacman 查找包
pacman
使用 -Q
选项查询本地包数据库,使用 -S
选项查询同步数据库,使用 -F
选项查询文件数据库。
pacman
可以在数据库中搜索包,包括包的名称和描述:
1 | sudo pacman -Ss 字符串1 字符串2 ... |
查找已经被安装的包:
1 | sudo pacman -Qs 字符串1 字符串2 ... |
根据文件名在远程软包中查找它所属的包:
1 | sudo pacman -F 字符串1 字符串2 ... |
查看一个包的依赖树:
1 | sudo pactree 软件包名 |
清除包缓存
pacman
将其下载的包存储在 /var/cache/Pacman/pkg/
中,并且不会自动删除旧版本或卸载的版本。这有一些优点:
- 它允许 降级 一个包,而不需要通过其他来源检索以前的版本。
- 已卸载的软件包可以轻松地直接从缓存文件夹重新安装。
但是,有必要定期清理缓存以防止文件夹增大。
pacman contrib 包中提供的 paccache(8) 脚本默认情况下会删除已安装和未安装包的所有缓存版本,但最近 3 个版本除外:
1 | sudo paccache -r |
要删除当前未安装的所有缓存包和未使用的同步数据库,请执行:
1 | sudo pacman -Sc |
要从缓存中删除所有文件,请使用清除选项两次,这是最激进的方法,不会在缓存文件夹中留下任何内容:
1 | sudo pacman -Scc |
安装本地或者第三方的包
安装不是来自远程存储库的“本地”包:
1 | sudo pacman -U 本地软件包路径.pkg.tar.xz |
安装官方存储库中未包含的“远程”软件包:
1 | sudo pacman -U http://www.example.com/repo/example.pkg.tar.xz |
额外内容:用 pacman 排除常见错误
下面是使用 pacman
管理包时可能遇到的一些常见错误。
提交事务失败(文件冲突)
如果你看到以下报错:
1 | error: could not prepare transaction |
这是因为 pacman
检测到文件冲突,不会为你覆盖文件。
解决这个问题的一个安全方法是首先检查另一个包是否拥有这个文件(pacman-Qo 文件路径
)。如果该文件属于另一个包,请提交错误报告。如果文件不属于另一个包,请重命名“存在于文件系统中”的文件,然后重新发出更新命令。如果一切顺利,文件可能会被删除。
你可以显式地运行 pacman -S –overwrite 要覆盖的文件模式**,强制
pacman`
覆盖与
给模式匹配的文件,而不是手动重命名并在以后删除属于该包的所有文件。
提交事务失败(包无效或损坏)
在 /var/cache/pacman/pkg/
中查找 .part
文件(部分下载的包),并将其删除。这通常是由在 pacman.conf
文件中使用自定义 XferCommand
引起的。
初始化事务失败(无法锁定数据库)
当 pacman
要修改包数据库时,例如安装包时,它会在 /var/lib/pacman/db.lck
处创建一个锁文件。这可以防止 pacman
的另一个实例同时尝试更改包数据库。
如果 pacman
在更改数据库时被中断,这个过时的锁文件可能仍然保留。如果你确定没有 pacman
实例正在运行,那么请删除锁文件。
检查进程是否持有锁定文件:
1 | lsof /var/lib/pacman/db.lck |
如果上述命令未返回任何内容,则可以删除锁文件:
1 | rm /var/lib/pacman/db.lck |
如果你发现 lsof
命令输出了使用锁文件的进程的
PID,请先杀死这个进程,然后删除锁文件。