首页 > 教程 > FreeBSD 教程 > 安装软件 > FreeBSD 使用 Packages 的包管理工具 pkg 安装软件包

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)
  • 布尔值的取值由三种:YESTRUEON

如果想要自定义配置可以查看 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