Pacman 软件包管理器是 Arch Linux 的一大亮点。它将一个简单的二进制包格式和易用的构建系统结合了起来。Pacman 的目标是简化对软件包的管理,无论软件包是来自官方软件仓库还是用户自己创建的软件包。
Pacman 通过和主服务器同步软件包列表来保持系统是最新的。这种服务器/客户端模式可使得用户使用简单的命令,就能下载或安装软件包,并包含其所有必需的依赖包。
Pacman 用 C 语言编写,并使用 bsdtar(1) tar 作为打包格式。
pacman 软件包提供了如
makepkg
和vercmp
等工具。其它有用的工具如pactree
、checkupdates
等则在pacman-contrib
软件包中(它曾是 pacman 的一部分)。执行pacman -Ql pacman | grep -E 'bin/.+'
可查看完整的工具列表。
$ pacman -Ql pacman | grep 'bin/.*'
pacman /usr/bin/
pacman /usr/bin/makepkg
pacman /usr/bin/makepkg-template
pacman /usr/bin/pacman
pacman /usr/bin/pacman-conf
pacman /usr/bin/pacman-db-upgrade
pacman /usr/bin/pacman-key
pacman /usr/bin/repo-add
pacman /usr/bin/repo-elephant
pacman /usr/bin/repo-remove
pacman /usr/bin/testpkg
pacman /usr/bin/vercmp
pacman 命令语法
基本用法是:pacman <操作> [...]
,不同的操作命令语法如下:
pacman {-h --help}
,查看帮助pacman {-V --version}
,显示版本pacman {-S --sync} [选项] [软件包]
,操作同步数据库,可以安装同步数据库软件,也可以查询同步数据库软件包信息,还可以清除缓存功能pacman {-U --upgrade} [选项] <文件>
,升级或安装软件包,并从同步存储库安装所需的依赖项。可以指定URL 或 本地安装包。pacman {-F --files} [选项] [文件]
,查询文件数据库(就是将同步数据库中软件包信息以文件数据库的形式下载或更新(sudo pacman -Fy
)到本地供查询)pacman {-Q --query} [选项] [软件包]
,查询本地软件包数据库pacman {-R --remove} [选项] <软件包>
,删除已安装的软件包pacman {-D --database} <选项> <软件包>
,操作包数据库进行操作,可以修改pacman数据库中已安装包的某些属性,还可以检查数据库的内部一致性。pacman {-T --deptest} [选项] [软件包]
,字面意思是检查关联性,可以修改 pacman 的一些默认属性,如修改安装根目录、数据库位置等几个重要的文件缓存/数据库目录:
用 pacman -T -v
命令就可以查看 pacman 工具的一些重要的信息
$ pacman -T -v
Root : / # 安装根目录
Conf File : /etc/pacman.conf # 配置文件
DB Path : /var/lib/pacman/ # 数据库目录(文件含义见下面的解释)
Cache Dirs: /var/cache/pacman/pkg/ # 缓存目录
Hook Dirs : /usr/share/libalpm/hooks/ /etc/pacman.d/hooks/ # 钩子目录
Lock File : /var/lib/pacman/db.lck # 锁文件
Log File : /var/log/pacman.log # 日志文件
GPG Dir : /etc/pacman.d/gnupg/ # 校验文件目录
Targets : 无 # 目标(指定的软件包)
/var/cache/pacman/pkg/
,下载软件包存放的目录(安装软件时,软件包会先下载到此目录)/var/lib/pacman/sync/
,远程同步数据库,其中.db为软件仓库数据库(sudo pacman -Sy
命令会更新此目录内的 .db 同步数据库),.file为文件数据库(sudo pacman -Fy
命令会下载和更新此目录内的 .files 文件数据库)/var/lib/pacman/local/
,本地数据库,目录内的每个文件都对应着仓库中对应软件包的基本信息要安装单个或者一系列软件包(包含软件包的依赖),请使用如下命令:
$ sudo pacman -S package_name_1 package_name_2 ...
有时软件包有多个版本,放在不同的仓库内(例如 extra 和 testing)。例如,要安装 extra 仓库的版本,可在包名称前定义仓库名:
$ sudo pacman -S extra/package_name
要安装多个含有相似名称的软件包,可以使用花括号扩展。例如:
$ sudo pacman -S plasma-{desktop,mediacenter,nm}
可以多层扩展到需要的层次:
$ sudo pacman -S plasma-{workspace{,-wallpapers},pa}
包组包含多个软件包,例如:fcitx5输入法的安装就可以通过安装fcitx5-im
包组,来一次性完成fcitx5
(基本框架)、fcitx5-configtool
(配置工具)、fcitx5-gtk
(gtk输入法模块)、fcitx5-qt
(qt输入法模块)等4个软件包的安装。
$ sudo pacman -S fcitx5-im
查看包组中的软件包(命令记忆可参考第四点查询软件包)
$ pacman -Sg fcitx5-im
fcitx5-im fcitx5
fcitx5-im fcitx5-configtool
fcitx5-im fcitx5-gtk
fcitx5-im fcitx5-qt
可以访问 https://archlinux.org/groups/ 查看可用的包组。
注意: 如果列表中的包已经安装在系统中,它会被重新安装,即使它已经是最新的。可以用 --needed 选项覆盖这种行为。
$ sudo pacman -U /path/to/package/package_name-version.pkg.tar.zst # 安装本地包
$ sudo pacman -U http://www.example.com/repo/example.pkg.tar.zst # 安装远程包
Arch Linux 中的软件包是通过 makepkg 工具以及存储在 PKGBUILD 文件中的信息编译的。运行
makepkg
时,系统将自动在当前目录下搜索 PKGBUILD 文件,然后根据 PKGBUILD 把软件源码重新打包。成功编译后得到的二进制文件和可以得到的其他信息如包的版本信息和依赖关系等,都将被打包到一个文件叫 name.pkg.tar.zst 里,可以通过pacman -U
进行安装。
$ sudo pacman -Syu package_name_1 package_name_2 ... # 升级系统的同时安装其他软件包
$ sudo pacman -Sw package_name # 下载软件包但不安装
从服务器下载新的软件包数据库:
$ sudo pacman -Sy
同步远程软件仓库并升级系统的软件包(开机必用,升级软件的正确命令):
$ sudo pacman -Syu
避免进行部分升级。 换句话说,尽量不要使用
pacman -Sy
; 相反,总是使用pacman -Syu
。
安装软件前先升级。也就是先执行pacman -Syu
。
pacman 使用 -Q
参数查询本地软件包数据库, -S
查询同步数据库,以及 -F
查询文件数据库。要了解每个参数的子选项,分别参见 pacman -Q --help
, pacman -S --help
和 pacman -F --help
。 可以通过下表联想记忆子选项的含义(作用)。
子选项 | -S | -Q | -F |
---|---|---|---|
无 | 安装软件包 | - | 按文件名查找软件 |
-s | 查看包数据库中的软件包 | 查询已安装的软件包 | - |
-i | 查看包数据库中软件包的详细信息(-ii查看更多信息) | 查看本地软件包的详细信息(-ii查看备份文件) | - |
-l | - | 查看已安装包所包含文件的列表 | 查看文件数据库中软件包包含的文件 |
-k | - | 查看软件包安装的文件是否都在(-kk检查文件属性) | - |
$ pacman -Ss string1 string2 ... #查看包数据库中的软件包
$ pacman -Qs string1 string2 ... #查询已安装的软件包
$ pacman -F string1 string2 ... #从文件数据库中按照文件名查找软件
$ pacman -Si package_name #查看包数据库中软件包的详细信息(-ii查看更多信息)
$ pacman -Sii package_name
$ pacman -Qi package_name #查看本地软件包的详细信息(-ii查看备份文件)
$ pacman -Qii package_name
$ pacman -Ql package_name #查看已安装包所包含文件的列表
$ pacman -Fl package_name #查看文件数据库中软件包包含的文件
$ pacman -Qk package_name #查看软件包安装的文件是否都在(-kk进一步检查文件属性)
$ pacman -Qo /path/to/file_name #从本地安装包中查看文件属于哪个软件包
$ pacman -F /path/to/file_name #从文件数据库中查看(带路径)文件名属于软件包
$ pacman -Qdt #列出所有不再作为依赖的软件包(孤立orphans)
$ pacman -Qet #列出所有明确安装而且不被其它包依赖的软件包
删除单个软件包,但保留其全部已经安装的依赖关系:
$ sudo pacman -R package_name
删除指定软件包,及其所有没有被其他已安装软件包使用的依赖关系:
$ sudo pacman -Rs package_name
注意: 删除类似 gnome 这样的软件包组时,将会忽略组中软件包的安装原因,因为实际操作上执行的是逐一删除软件组的每一个软件,依赖软件包的安装原因不会被忽略。
上面这条命令在移除包含其他所需包的组时有时候会拒绝运行。这种情况下可以尝试用下面的命令:
$ sudo pacman -Rsu package_name
删除软件包和所有依赖这个软件包的程序:(警告:此操作是递归的,请小心检查,可能会一次删除大量的软件包)
$ sudo pacman -Rsc package_name
删除软件包(假如它会被其他软件包依赖),但是不删除依赖这个软件包的其他软件包:(警告:此操作有破坏系统的能力,应该尽量避免使用)
$ sudo pacman -Rdd package_name
pacman 删除某些程序时会备份重要配置文件,并在其后面加上*.pacsave扩展名。-n 选项则可以避免备份这些文件:
$ sudo pacman -Rn package_name
pacman 不会删除软件自己创建的文件(例如主目录中的“点文件”不会被删除。)
/var/cache/pacman/pkg/
,缓存文件夹。pacman 安装软件包时,会先下载软件包并存放在此目录,且安装完成后并不会自动移除旧的和未安装版本的软件包。
- 这样允许降级软件包而不需要通过其他方式提取旧版本。
- 被卸载的软件包可以轻易地直接从缓存文件夹重新安装,不需要重新从软件仓库下载。
- 需要定期手动清理缓存来避免该文件夹无限制增大。
删除目前没有安装的缓存包,和没有被使用的同步数据库:
$ sudo pacman -Sc
删除所有缓存包(清空缓存文件夹),和没有被使用的同步数据库:
$ sudo pacman -Scc
如果想要更加可控的清理软件包缓存,可以通过 paccache
命令(需安装pacman-contrib
包)。
保留最近的3个版本的缓存,删除其他所有缓存包及已卸载的软件包:
$ sudo paccache -r
自定义保留最近的n个版本的缓存,删除其他所有缓存包及已卸载的软件包:
$ sudo paccache -rk2
仅仅删除已卸载的缓存包:
$ sudo paccache -ruk0
更多参数可参考帮助命令paccache -h