FreeBSD 使用 Packages 的包管理工具 pkg 安装软件包
在 FreeBSD 中的 Packages 软件集包含的是编译好的二进制软件包,使用 pkg 包管理工具管理软件,可以实现注册、安装、删除、升级等软件包管理功能。使用 pkg 安装软件简单方便。
对于仅使用预编译二进制包的场景,pkg 工具足以满足需求;若需从源代码构建软件,则需配合 Ports 管理工具使用(pkg 仅处理二进制包)。
pkg 初始化
在 FreeBSD 中运行 pkg 命令时运行的命令是 /usr/sbin/pkg,它只是一个引导器,默认会调用完整版命令 /usr/local/sbin/pkg。
在新版本的 FreeBSD 系统中,默认已经安装了完整版命令 /usr/local/sbin/pkg。
验证 pkg 命令
可以使用如下的命令查看是否已经安装完整版命令:
pkg -N
如果已经安装了完整版命令,会输出类似如下的信息:
pkg: 320 packages installed
初始化 pkg 命令
如果你使用的是旧版本的 FreeBSD 系统,可能没有安装完整版的 pkg 命令,可以使用如下几种方式初始化安装 pkg 命令。
1)直接运行 pkg 命令:
pkg
如果没有初始化 pkg 命令,会输出如下的信息:
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]
按 y 键初始化 pkg 命令,安装完整版命令 /usr/local/sbin/pkg。
2)使用初始化子命令:
pkg bootstrap
3)重新初始化 pkg 命令:
pkg bootstrap -f
查看帮助文档
1)查看简要的信息:
pkg help
使用如上的命令会列出全部可用子命令的简要信息。
2)查看子命令的详细帮助文档,只需在后面添加子命令信息,如查看 install 子命令的帮助信息:
pkg help install
或者使用 man 命令查看子命令的帮助信息:
man pkg-install
配置 pkg
pkg 可以自定义配置,默认的系统配置文件为 /usr/local/etc/pkg.conf。
配置文件规则
- 以
#开头的行为注释,会被忽略 - 文件采用 UCL 格式,语法参考 libucl 文档
- 取值支持三种类型:布尔值(boolean)、字符串(string)、列表(list)
- 布尔值的取值由三种:
YES、TRUE或ON
如果想要自定义配置可以查看 pkg.conf 配置说明
搜索包
使用 pkg 命令的子命令 search 搜索包。
搜索 NGINX 相关包
doas pkg search nginx
输出类似如下内容:
nginx-1.28.0_3,3 Robust and small WWW server
nginx-devel-1.29.1_2 Robust and small WWW server
nginx-devel-acme-0.1.1_1 ACME module for NGINX
nginx-full-1.28.0_3,3 Robust and small WWW server (full package)
nginx-lite-1.28.0_3,3 Robust and small WWW server (lite package)
.....
安装与下载软件包
pkg 命令最主要的功能还是安装与下载软件包。
安装软件包
使用 pkg 命令的子命令 install 安装软件包,在安装软件包时,会自动解析并安装依赖的软件包。
如安装 curl 软件:
doas pkg install curl
输出类似如下内容:
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
The following 9 package(s) will be affected (of 0 checked):
New packages to be INSTALLED:
brotli: 1.1.0,1 [FreeBSD-ports]
curl: 8.16.0 [FreeBSD-ports]
libidn2: 2.3.8[FreeBSD-ports]
liblz4: 1.10.0,1 [FreeBSD-ports]
libnghttp2: 1.67.0 [FreeBSD-ports]
libpsl: 0.21.5_2 [FreeBSD-ports]
libssh2: 1.11.1.3 [FreeBSD-ports]
libunistring: 1.4.1 [FreeBSD-ports]
zstd: 1.5.7 [FreeBSD-ports]
Number of packages to be installed: 9
The process will require 15 MiB more space.
4 MiB to be downloaded
Proceed with this action? [y/N]
输入 y 确认后,开始下载并安装软件包及其依赖的软件包。
安装完成后,可使用 pkg info 查看已安装软件包列表。
只下载软件包
使用 pkg 命令的子命令 fetch 下载软件包,后续可以使用 install 子命令安装软件包。
下载路径说明:
- 默认下载的目录是
pkg配置的缓存目录,如果没有自定义缓存目录,那么默认目录为/var/cache/pkg/ - 可以使用
-o选项指定下载的目录
如下载 nginx-lite 到当前用户的 packages/ 目录:
# pkg fetch -d -o ~/packages/ nginx-lite
参数说明:
- -d:下载所有的依赖包
- -o:指定下载的目录
使用 install 子命令指定指定下载软件包的全名,安装下载的软件包:
# cd ~/packages/
# pkg install nginx-lite-1.28.0_3,3.pkg
查看已安装包信息
使用 pkg 命令的子命令 info 查看已安装包的详细信息:
- 当指定软件包名称时,输出特定软件包的详细信息
- 当不指定软件包的名称时,输出系统中全部软件包的详细信息
如查看 pkg 软件包的详细信息:
# pkg info pkg
升级已安装软件包
使用 pkg 命令的子命令 upgrade 升级软件包,它会自动把系统中安装的软件包的版本和软件源中的版本进行对比,升级有更新的软件包。
# pkg upgrade
升级前建议执行 pkg audit -F 检查漏洞,避免升级后引入安全问题。
审计已安装软件包漏洞
使用 pkg 命令的子命令 audit 检查已安装软件包的漏洞:
# pkg audit -F
选项说明:
-F:指定该选项会先更新数据库,再审计漏洞。
卸载软件包
使用 pkg 命令的子命令 delete 卸载不需要的包:
如卸载 curl 软件包:
# pkg delete curl
自动移除无用依赖包
卸载指定的软件包后可能会残留无用的依赖包,可以使用 pkg 命令的子命令 autoremove 自动检测并卸载无用的依赖包:
# pkg autoremove
相关命令:
pkg prime-list:列出手动安装的软件包,非依赖包pkg prime-origins:列出手动安装包的 Ports 源目录pkg set -A 1 包名:将软件包标记为自动安装,视为依赖包,会被 autoremove 识别后移除pkg set -A 0 包名:将软件包标记为手动安装,不会被 autoremove 移除
清理过期包缓存
pkg 命令会将下载的二进制包缓存到一个目录,默认为 /var/cache/pkg,可以使用 PKG_CACHEDIR 自定义为指定的目录。
FreeBSD 默认只缓存最新版本的包,旧版本的 pkg 会保留所有版本的软件包。
1)清理过期的包缓存:
pkg clean
2)清空所有包缓存:
pkg clean -a
锁定与解锁包
为了防止特定的软件包被重新安装、修改或卸载,可以锁定软件包,只能锁定已经安装的软件包。
使用 pkg 命令的子命令 lock 可以锁定软件包:
# pkg lock nginx-lite
使用 pkg 命令的子命令 unlock 可以接触对软件包的锁定:
# pkg unlock nginx-lite
修改软件包元数据
使用 pkg 命令的子命令 set 可以修改软件包的元数据。
如当 Ports 集中的软件的原目录为 lang/python3,后来修改了 lang/python311,就需要修改元数据,修改目录的值:
# pkg set -o lang/python3:lang/python311
修改元数据后,可能依赖也会变化,因此要强制重新安装软件包:
# pkg install -Rf lang/python311