pacman包管理
pacman包管理
安装指定的包
安装或者升级单个软件包,或者一列软件包(包含依赖包),使用如下命令:
1 | |
用正则表达式安装多个软件包(参见 这个帖子):
1 | |
有时候在不同的软件仓库中,一个软件包有多个版本(比如[extra]和[testing])。可以选择一个来安装:
1 | |
安装多个含有相似名称的软件包,而并非整个包组或全部匹配的软件包; 例如,plasma:
1 | |
当然,可以多层扩展,并不作限制:
1 | |
虚包
虚拟软件包是一个特殊的软件包,它本身并不存在,但由一或多个其它软件包提供。虚拟软件包允许其它软件包不以某一个特定的包为依赖,以应对有多个候选的情况。虚包不能用它们的名称安装,相反它们会在你安装提供虚包的软件包时被安装到你的系统中。
安装包组
一些包属于一个可以同时安装的软件包组。例如,运行下面的命令
1 | |
会提醒用户选择 gnome 内需要安装的包。
有的包组包含大量的软件包,有时用户只需其中几个。除了逐一键入序号外,pacman 还支持选择或排除某个区间内的的软件包:
1 | |
这将选中序号 1 至 10 和 15 的软件包。而
1 | |
将会选中除了序号 5 至 8 和 2 之外的所有软件包。
想要查看哪些包属于 gnome 组,运行:
1 | |
也可以访问 https://archlinux.org/groups/ 查看可用的包组。
注意: 如果列表中的包已经安装在系统中,它会被重新安装,即使它已经是最新的。可以用 --needed 选项覆盖这种行为。
删除软件包
删除单个软件包,保留其全部已经安装的依赖关系
1 | |
删除指定软件包,及其所有没有被其他已安装软件包使用的依赖关系:
1 | |
上面这条命令在移除包含其他所需包的组时有时候会拒绝运行。这种情况下可以尝试
1 | |
要删除软件包和所有依赖这个软件包的程序:
警告: 此操作是递归的,请小心检查,可能会一次删除大量的软件包。
1 | |
要删除一个被其他软件包依赖的软件包,但是不删除依赖这个软件包的其他软件包:
警告: 此操作有破坏系统的能力,应该尽量避免使用。详情请看 避免某些 Pacman 命令。
1 | |
pacman 删除某些程序时会备份重要配置文件,在其后面加上*.pacsave扩展名。-n 选项可以避免备份这些文件:
1 | |
注意: pacman 不会删除软件自己创建的文件(例如主目录中的“点文件”不会被删除。)
升级软件包
警告:
- 建议用户遵守System maintenance (简体中文)#更新系统的指导,定期更新系统,并不盲目地执行这些命令。
- Arch 只支持系统完整升级,详细参见System maintenance (简体中文)#不支持部分升级和#安装软件包。
一个 pacman 命令就可以升级整个系统。花费的时间取决于系统有多老。这个命令会同步非本地(local)软件仓库并升级系统的软件包:
1 | |
查询包数据库
pacman 使用 -Q 参数查询本地软件包数据库, -S 查询同步数据库,以及 -F查询文件数据库。要了解每个参数的子选项,分别参见 Template:Pacman -Q –help,Template:Pacman -S –help和Template:Pacman -F –help。
pacman 可以在包数据库中查询软件包,查询位置包含了软件包的名字和描述:
1 | |
有时,-s的内置正则会匹配很多不需要的结果,所以应当指定仅搜索包名,而非描述或其他子段:
1 | |
要查询已安装的软件包:
1 | |
按文件名查找软件库:
1 | |
显示软件包的详尽的信息:
1 | |
查询本地安装包的详细信息:
1 | |
使用两个 -i 将同时显示备份文件和修改状态:
1 | |
要获取已安装软件包所包含文件的列表:
1 | |
查询远程库中软件包包含的文件:
1 | |
检查软件包安装的文件是否都存在:
1 | |
两个参数k将会执行一次更彻底的检查。 查询数据库获取某个文件属于哪个软件包:
1 | |
查询文件属于远程数据库中的哪个软件包:
1 | |
要罗列所有不再作为依赖的软件包(孤立orphans):
1 | |
提示: 将上述命令添加到 pacman 的一个处理后 hook用于在如果有处理产生孤立包后获得提示。这在当有软件包被仓库放弃时是有用的,因为任何被抛弃的包都会成为本地的一个孤立包(除非它是被显式安装的)。要避免在没有找到孤立包时”failed to execute command”的错误,在你的 hook 中为Exec使用如下的指令: /usr/bin/bash -c "/usr/bin/pacman -Qtd || /usr/bin/echo '=> None found.'"
要罗列所有明确安装而且不被其它包依赖的软件包:
1 | |
更多例子查看pacman tips。
Pactree
注意: pactree(8)不再是pacman的一部分。它现在在pacman-contrib中。
要显示软件包的依赖树:
1 | |
检查一个安装的软件包被那些包依赖,将递归标识-r传递给 pactree,或者使用 pkgtoolsAUR中的whoneeds
数据库结构
pacman数据库通常位于 /var/lib/pacman/sync. 对于每一个在/etc/pacman.conf中指定的软件仓库, 这里都有一个一致的数据库。数据库文件夹里每个tar.gz文件都包含着一个仓库的软件包信息。例如which 包:
1 | |
这个 depends 项列出了该软件的依赖包, 而desc有该包的介绍,例如文件大小和MD5值 。
清理软件包缓存
pacman 将下载的软件包保存在 /var/cache/pacman/pkg/ 并且不会自动移除旧的和未安装版本的软件包。这样做有一些好处:
- 这样允许降级软件包而不需要通过其他方式提取旧版本,例如 Arch Linux Archive.
- 被卸载的软件包可以轻易地直接从缓存文件夹重新安装,不需要重新从软件仓库下载。
然而,需要定期手动清理缓存来避免该文件夹无限制增大。
pacman-contrib 提供的 paccache(8) 脚本默认会删除所有缓存的版本和已卸载的软件包,除了最近的3个会被保留:
1 | |
启用 和 启动 paccache.timer来每周删除不使用的包。
提示: 可以使用 hook 自动执行清理,参考[1]和pacman-cleanup-hookAUR。
也可以自己设置保留最近几个版本:
1 | |
添加-u/--uninstalled开关来限制paccache的行为只作用于卸载的包。例如清理所有卸载的包的缓存版本,可以用以下命令:
1 | |
或者你可以将安装其结合,同时作用于安装的和卸载的包,例如想要保留最近两个安装的包但是移除所有卸载的包的缓存版本,使用以下命令:
1 | |
更多参数参见paccache -h。
pacman也有一些内建参数用于清除缓存和那些不再在/etc/pacman.conf配置文件中列出的软件仓库残留数据库文件。然而pacman并不提供保留一定数量的过去版本的功能,因此它比paccache的默认选项更加激进。
要删除目前没有安装的所有缓存的包,和没有被使用的同步数据库,执行:
1 | |
要删除缓存中的全部文件,使用两次-c开关。这是最为激进的方式,将会清空缓存文件夹:
1 | |
警告: 应当避免从缓存中删除所有过去版本和卸载的包,除非需要更多磁盘空间。这样会导致无法降级或重新安装包而不再次下载他们
pkgcachecleanAUR以及pacleanerAUR是两个进一步清理缓存的替代工具
其它命令
升级系统时安装其他软件包:
1 | |
下载包而不安装它:
1 | |
安装一个本地包(不从源里下载):
1 | |
要将本地包保存至缓存,可执行:
1 | |
安装一个远程包(不在 pacman 配置的源里面):
1 | |
要禁用 -S, -U 和 -R 动作,可以使用 -p 选项.
pacman 会列出需要安装和删除的软件,并在执行动作前要求需要的权限。
安装原因
pacman数据库按照软件包被安装的原因,将其分为两类:
- 显式安装:那些真正地被传递给通用pacman
-S和-U命令的包; - 依赖:那些虽然(一般)从未被传递给pacman安装命令,但由于被其它显式安装的包需要从而被隐式安装的包
当安装软件包时,可以把安装原因强制设为依赖:
1 | |
提示: 用--asdeps安装可选依赖将导致如果你移除孤立包,pacman将会一同移除剩下的可选依赖。
但是当重新安装该软件包时,安装原因将会被设为软件包所默认的。
显式安装的软件包列表可用pacman -Qe获取, 与之互补的已安装的依赖包可用pacman -Qd获取。
改变某个已安装软件包的安装原因,可以执行:
1 | |
注意: 在升级时使用--asdeps和--asexplicit选项,例如pacman -Syu *package_name* --asdeps,是不被推荐的。这会导致不仅改变要被安装的软件包的安装原因,也会改变被升级的软件包的安装原因。
查询一个包含具体文件的包名
同步文件数据库:
1 | |
查询包含某个文件的包名,比如:
1 | |
提示: 可以设置一个 crontab 或者 systemd timer 来定期同步文件信息数据库。
如果需要高级功能请安装 pkgfile,它使用一个单独的数据库来保存文件和它们所关联的软件包的信息。
配置
pacman 的配置文件位于/etc/pacman.conf。 man pacman.conf 可以查看配置文件的进一步信息。
通用选项
通用选项都在[options]段。阅读 man 手册或者查看默认的 pacman.conf 可以获得有关信息和用法。
升级前对比版本
要查看旧版和新版的有效安装包,请取消/etc/pacman.conf中”VerbosePkgLists”的注释。修改后的pacman -Syu输出如下:
1 | |
在升级时跳过软件包
警告: 在跳过软件包时要小心,因为部分升级不受支持
要想在升级系统时跳过特定的软件包,用像如下的命令指明:
1 | |
多软件包可以用空格隔开,或者用另外的IgnorePkg行。也可使用 glob 模式。如果只打算忽略一次升级,可以使用 --ignore 选项,这时使用逗号隔开的列表。
忽略了的软件包依然可通过 pacman -S 升级。这种情况下pacman会提醒你这些软件包已经被包含在IgnorePkg声明中。
在升级时跳过软件包组
警告: 在跳过软件包时要小心,因为部分升级不受支持
和软件包一样,也可以不升级某个软件包组:
1 | |
在升级时跳过文件
所有在NoUpgrade指令中列出的文件都会在软件包被安装/升级时不会被更改,并且新文件会以带有*.pacnew*后缀名的形式安装
1 | |
注意: 这个路径指软件包中的文件,所以不要包括开头的斜线。
在安装时跳过文件
要总是跳过某些文件夹的安装,可以将它们放到 NoExtract 中,例如不想安装 systemd 模块:
1 | |
后面的规则覆盖前面的规则,加上 ! 可以取消跳过效果。
提示: pacman会在更新locales已经被localepurge或者bleachbit清除的包时发出警告。将CheckSpace参数加入pacman.conf能够抑制这种警告,但是要意识到space-check功能将会对所有软件包禁用。
保留多个配置文件
如果你有多个配置文件(比如,主配置和启用了测试仓库的配置文件),需要共享一些设置,你可以在配置文件中使用Include选项,例如:
1 | |
*/path/to/common/settings*文件中是两个配置文件共享的相同配置。
Hooks
pacman可以在处理前后,运行/usr/share/libalpm/hooks/文件夹下的hooks,更多的hooks文件夹可以通过HooDir选项在pacman.conf中指明,默认/etc/pacman.d/hooks。Hook文件必须以*.hook*为后缀。Pacman hooks不是交互式的。
pacman hooks用于,比如说,和systemd-sysusers和systemd-tmpfiles结合来在安装包时自动创建系统用户和文件。例如,tomcat8指明它想要创建一个叫做tomcat8的系统用户和一些属于该用户的文件。当pacman确定tomcat8包含文件指明用户和临时文件时,pacman hooks systemd-sysusers.hook和systemd-tmpfiles.hook唤起systemd-sysusers和systemd-tmpfiles。
有关 alpm hooks 的更多信息,参见alpm-hooks(5)。
软件仓库
除了特殊的通用选项节, 每个pacman.conf中的[section]都定义了一个使用的软件包仓库,仓库是多个软件包的逻辑上的集合,他们物理上存储在一个或多个服务器:这也是为什么每一个服务器都叫做这个仓库的镜像。
仓库区分为官方仓库与非官方仓库。配置文件中仓库的顺序十分重要;当几个仓库出现同名安装包,不管版本号如何,pacman将使用配置文件中排前的仓库。要在添加后使用某个仓库,你需要先升级整个系统
每个仓库节都可以直接指定镜像列表或者Include引用其他的文件:例如,官方镜像引用了/etc/pacman.d/mirrorlist/。具体查看Mirrors (简体中文)。
软件包的安全性
pacman 支持软件包签名,会为软件包提供额外的安全性。默认配置,SigLevel = Required DatabaseOptional 将启用全局签名验证,但会被每个软件仓库的 SigLevel 行所覆盖。有关软件包签名和签名验证的更多细节,参见 pacman-key。
Manjaro包管理常用命令
- 对整个系统进行更新
1 | |
- 升级软件包
1 | |
- 安装或者升级单个软件包,或者一列软件包(包含依赖包),使用如下命令:
1 | |
- 与上面命令不同的是,该命令将在同步包数据库后再执行安装
1 | |
- 安装本地包
1 | |
- 安装一个远程包
1 | |
- 在仓库中搜索含关键字的包
1 | |
- 查看已安装软件
1 | |
- 删除单个软件包,保留其全部已经安装的依赖关系
1 | |
- 删除指定软件包,及其所有没有被其他已安装软件包使用的依赖关系:
1 | |
- 清理软件包缓存
1 | |
- 清理所有的缓存文件
1 | |
- 清除系统中无用的包
1 | |
- 从 AUR 安装软件包
- yay 安装命令不需要加 sudo
1 | |
- yay删除包
1 | |
- 升级所有已安装的包
1 | |
- 打印系统统计信息
1 | |
- 检查安装的版本
1 | |
AUR国内源
笔者在写这篇文章的时候,网上的资料并不多。毕竟选择Arch的用户较少,而选择Yay的用户更少。Yay默认使用法国的aur.archlinux.org作为AUR源,这样的速度显然不是我们可以接受的,因此我们需要切换为国内的tuna源
Yay在安装好以后是默认不生成配置文件的。这就难以去更改默认源。笔者搜罗GIthub上的issue,根据 #697 Issue,运行以下命令更新软件源和系统,顺便创建配置文件
1 | |
然后编辑~/.config/yay/config.json文件,就可以看到熟悉的aururl参数啦,那么把它替换为https://aur.tuna.tsinghua.edu.cn即可
yay命令
yay <Search Term> |
Present package-installation selection menu. |
|---|---|
yay -Ps |
Print system statistics. |
yay -Yc |
Clean unneeded dependencies. |
yay -G <AUR Package> |
Download PKGBUILD from ABS or AUR. |
yay -Y --gendb |
Generate development package database used for devel update. |
yay -Syu --devel --timeupdate |
Perform system upgrade, but also check for development package updates and use PKGBUILD modification time (not version number) to determine update. |
使用 yay:
搜索:
1 | |
安装:
1 | |
有关yay的基本用法,请参阅下面的示例。
示例1:使用yay安装包
使用选项-S使用yay从AUR安装软件包:
$ yay -S package
示例2:使用yay删除包
要删除包,请使用-Rns选项:
$ yay -Rns package
示例3:启动包选择菜单
使用:
$ yay
示例4:使用yay升级已安装的软件包
要升级所有已安装的包,请使用以下选项:
$ yay -Syu
要包含开发包,请使用:
$ yay -Syu –devel –timeupdate
示例5:使用yay清除不需要的依赖项
使用选项可删除系统上所有不需要的依赖项:
$ yay -Yc
示例6:使用yay打印系统统计信息
要打印系统统计信息,请使用-Ps:
$ yay -Ps
示例7:生成用于开发更新的开发包DB
$ yay -Y –gendb
至此,yay基本使用方法就讲到这了。
snap
如何使用snap
列出计算机上所有snap安装情况:
1 | |
在应用商店中查找snap:
1 | |
安装Snap软件:
1 | |
更新Snap软件:
1 | |
更新所有的snap软件包:
1 | |
要将Snap还原到以前安装的版本:
1 | |
卸载snap软件:
1 | |
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!