4.4.使用 pkg 进行二进制包管理

pkg(8)open in new window 为操作软件包提供了接口:注册、添加、删除和更新软件包。

对于那些只希望使用来自 FreeBSD 镜像站的预编译二进制包的网站来说,用 pkg(8)open in new window 管理软件包就足够了。

然而,对于那些从源代码构建的网站,将需要一个单独的 port 管理工具open in new window

由于 pkg(8)open in new window 只适用于二进制包,它并不能替代这些工具。那些工具可以用来安装二进制包和 ports 中的软件,而 pkg(8)open in new window 仅可安装二进制包。

4.4.1.开始使用 pkg

所有支持的 FreeBSD 版本现在都包含 /usr/sbin/pkg, 又称 pkg(7)open in new window。这是一个小的占位符,它只具有用来安装真正的 pkg(8)open in new window 所需的最小功能。

注意

要使安装过程成功,需要连接到互联网。

在命令行中运行 pkg(8)open in new window

# pkg

其输出应该类似于以下内容:

The package management tool is not yet installed on your system.
Do you want to fetch and install it not? [y/N]

pkg(7)open in new window 会拦截这个命令,如果你确认这是你的意图,就会下载 pkg(8)open in new window 软件包,从中安装 pkg(8)open in new window ,引导本地软件包数据库,然后继续运行你最初要求的命令。

较新版本的 pkg(7)open in new windowpkg -N 理解为测试是否安装了 pkg(8)open in new window 而不触发安装, 反之, pkg bootstrap[-f] 可以安装 pkg(8)open in new window (或强制它重新安装) 而不执行任何其他操作。

可以在 pkg(8)open in new window 的手册中找到 pkg 的使用信息,或者通过运行 pkg 而不需要其他参数。其他 pkg 配置选项在 pkg.conf(5)open in new window 中有介绍。

每个 pkg 命令的参数都在特定命令的手册页中有记录。

例如, 要阅读 pkg install 的手册页,请运行这个命令:

# pkg help install

本节的其余部分演示了可以使用 pkg(8)open in new window 执行的常见二进制包管理任务。每条演示的命令都提供了许多开关来定制其用途。有关细节和更多的例子,请参考某个命令的帮助或手册页。

4.4.2.Quarterly 和 Latest ports 分支

Quarterly(季度)分支为用户提供了一个更可预测、更稳定的 ports 和软件包安装和更新的体验。这基本上是通过只允许非特性更新来实现的。Quarterly 分支的目标是接收安全修复(可能是版本更新,或者是提交的回溯)、bug 修复和 ports 合规性或框架变化。季度分支在每个(年度)季度的开始,即 1 月、4 月、7 月和 10 月,从 main 中分离。根据创建的年份(YYYY)和季度(Q1-4)来命名该分支。例如,在 2023 1 月创建的季度分支,被命名为 2023Q1。而 Latest(最新)分支为用户提供最新版本的软件。

要让 pkg.conf(8)open in new window 从季度分支切换到最新分支,请首先运行以下命令:

# mkdir -p /usr/local/etc/pkg/repos
# echo 'FreeBSD: { url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest" }' > /usr/local/etc/pkg/repos/FreeBSD.conf

然后运行这个命令,更新本地软件仓库存储目录到最新分支:

# pkg update -f

4.4.3.配置 pkg

pkg.conf(5)open in new windowpkg(8)open in new window 工具所使用的系统级配置文件。这个文件的默认位置是 /usr/local/etc/pkg.conf

注意

FreeBSD 不需要有 pkg.conf 文件。许多系统在没有 pkg.conf 或是空的 pkg.conf (除了注释行之外) 的情况下也能正常工作。

文件中以“#”开头的行是注释, 会被忽略。

该文件为 UCL 格式。关于 libucl(3)open in new window 语法的更多信息,请访问 UCL 官方网站open in new window

可以识别以下类型的选项——布尔值、字符串和列表选项。

如果在配置文件中指定了下列数值之一,则布尔选项被标记为启用——YES、TRUE 和 ON。

4.4.4.查找软件包

要搜索一个软件包,可以使用 pkg-search(8)open in new window :

# pkg search nginx

其输出应该类似于以下内容:

modsecurity3-nginx-1.0.3       Instruction detection and prevention engine / nginx Wrapper
nginx-1.22.1_2,3               Robust and small WWW server
nginx-devel-1.23.2_4           Robust and small WWW server
nginx-full-1.22.1_1,3          Robust and small WWW server (full package)
nginx-lite-1.22.1,3            Robust and small WWW server (lite package)
nginx-naxsi-1.22.1,3           Robust and small WWW server (plus NAXSI)
nginx-prometheus-exporter-0.10.0_7 Prometheus exporter for NGINX and NGINX Plus stats
nginx-ultimate-bad-bot-blocker-4.2020.03.2005_1 Nginx bad bot and other things blocker
nginx-vts-exporter-0.10.7_7    Server that scraps NGINX vts stats and export them via HTTP
p5-Nginx-ReadBody-0.07_1       Nginx embeded perl module to read and evaluate a request body
p5-Nginx-Simple-0.07_1         Perl 5 module for easy to use interface for Nginx Perl Module
p5-Test-Nginx-0.30             Testing modules for Nginx C module development
py39-certbot-nginx-2.0.0       NGINX plugin for Certbot
rubygem-passenger-nginx-6.0.15 Modules for running Ruby on Rails and Rack applications

4.4.5.安装和更新软件包

要安装二进制软件包,可以使用 pkg-install(8)open in new window。这个命令使用软件库的数据来确定要安装哪个版本的软件,以及它是否有任何未安装的依赖项。例如,要安装 curl

# 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:
        ca_root_nss: 3.83
        curl: 7.86.0
        gettext-runtime: 0.21
        indexinfo: 0.3.1
        libidn2: 2.3.3
        libnghttp2: 1.48.0
        libpsl: 0.21.1_4
        libssh2: 1.10.0.3
        libunistring: 1.0

Number of packages to be installed: 9

The process will require 11 MiB more space.
3 MiB to be downloaded

Proceed with this action? [y/N]

在已安装的软件包列表中可以看到新的软件包和任何作为依赖项安装的额外软件包:

# pkg info

其输出应该类似于以下内容:

ca_root_nss-3.83               Root certificate bundle from the Mozilla Project
curl-7.86.0                    Command line tool and library for transferring data with URLs
gettext-runtime-0.21.1         GNU gettext runtime libraries and programs
indexinfo-0.3.1                Utility to regenerate the GNU info page index
libidn2-2.3.3                  Implementation of IDNA2008 internationalized domain names
libnghttp2-1.48.0              HTTP/2.0 C Library
libpsl-0.21.1_6                C library to handle the Public Suffix List
libssh2-1.10.0.3               Library implementing the SSH2 protocol
libunistring-1.0               Unicode string library
pkg-1.18.4                     Package manager

要获取软件包并在以后或在其他地方安装它,请使用 pkg-fetch(8)open in new window。例如,下载 nginx-lite

# pkg fetch -d -o /usr/home/user/packages/ nginx-lite
  • -d:用来获取所有的依赖项

  • -o:用于指定下载目录

其输出应该类似于以下内容:

Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
The following packages will be fetched:

New packages to be FETCHED:
        nginx-lite: 1.22.1,3 (342 KiB: 22.20% of the 2 MiB to download)
        pcre: 8.45_3 (1 MiB: 77.80% of the 2 MiB to download)

Number of packages to be fetched: 2

The process will require 2 MiB more space.
2 MiB to be downloaded.

Proceed with fetching packages? [y/N]:

要安装所下载的软件包,可以使用 pkg-install(8)open in new window,如下所示:

# cd /usr/home/user/packages/
# pkg install nginx-lite-1.22.1,3.pkg

4.4.6.获得关于已安装软件包的信息

可以通过运行 pkg-info(8)open in new window 来查看有关系统中所安装的软件包的信息,当没有任何参数运行时,它将列出所有安装的软件包或指定的软件包的版本。

例如,要查看安装了哪个版本的 pkg,请运行:

# pkg info pkg

其输出应该类似于以下内容:

pkg-1.19.0
Name           : pkg
Version        : 1.19.0
Installed on   : Sat Dec 17 11:05:28 2022 CET
Origin         : ports-mgmt/pkg
Architecture   : FreeBSD:13:amd64
Prefix         : /usr/local
Categories     : ports-mgmt
Licenses       : BSD2CLAUSE
Maintainer     : [email protected]
WWW            : https://github.com/freebsd/pkg
Comment        : Package manager
Options        :
        DOCS           : on
Shared Libs provided:
        libpkg.so.4
Annotations    :
        FreeBSD_version: 1301000
        repo_type      : binary
        repository     : FreeBSD
Flat size      : 33.2MiB
Description    :
Package management tool

WWW: https://github.com/freebsd/pkg

4.4.7.更新已安装的软件包

可以使用 pkg-upgrade(8)open in new window 升级到已安装的软件包最新版本:

# pkg upgrade

这个命令将比较已安装的版本和版本库目录中的可用版本,并从版本库中更新它们。

4.4.8.审计已安装的软件包

在第三方应用程序中经常发现软件漏洞。为了解决这个问题, pkg 包含了内置的审计机制。要确定系统上安装的软件是否有任何已知的漏洞, 请使用 pkg-audit(8)open in new window

# pkg audit -F

其输出应该类似于以下内容:

Fetching vuln.xml.xz: 100%  976 KiB 499.5kB/s    00:02
chromium-108.0.5359.98 is vulnerable:
  chromium -- multiple vulnerabilities
  CVE: CVE-2022-4440
  CVE: CVE-2022-4439
  CVE: CVE-2022-4438
  CVE: CVE-2022-4437
  CVE: CVE-2022-4436
  WWW: https://vuxml.FreeBSD.org/freebsd/83eb9374-7b97-11ed-be8f-3065ec8fd3ec.html

4.4.9.删除软件包

可以用 pkg-delete(8)open in new window 删除不再需要的软件包。

比如说:

# pkg delete curl

其输出应该类似于以下内容:

Checking integrity... done (0 conflicting)
Deinstallation has been requested for the following 1 packages (of 0 packages in the universe):

Installed packages to be REMOVED:
        curl :7.86.0

Number of packages to be removed: 1

The operation will free 4 MiB.

Proceed with deinstallation packages? [y/N]: y
[1/1] Deinstalling curl-7.86.0...
[1/1] Deleting files for curl-7.86.0: 100%

4.4.10.自动删除未使用的软件包

删除一个软件包可能会留下不再需要的依赖项。可以通过 pkg-autoremove(8)open in new window 自动检测并删除作为依赖关系安装的不需要的包(叶子包):

# pkg autoremove

其输出应该类似于以下内容:

Checking integrity... done (0 conflicting)
Deinstallation has been requested for the following 1 packages:

Installed packages to be REMOVED:
        ca_root_nss-3.83

Number of packages to be removed: 1

The operation will free 723 KiB.

Proceed with deinstalling packages? [y/N]:

作为依赖关系安装的包被称为 自动 软件包。非自动软件包,即明确安装的软件包不是作为另一个软件包的依赖关系,可以用以下方法列出:

# pkg prime-list

其输出应该类似于以下内容:

nginx
openvpn
sudo

pkg prim-list/usr/local/etc/pkg.conf 中声明的一个别名命令。还有许多其他命令可以用来查询系统的软件包数据库。例如,命令 pkg prim-origins 可以用来获取上述列表的初始 port 目录。

# pkg prime-origins

其输出应该类似于以下内容:

www/nginx
security/openvpn
security/sudo

这个列表可以用来重建所有使用 ports-mgmt/poudriereopen in new windowports-mgmt/synthopen in new window 等编译工具安装在系统中的软件包。

将已安装的软件包标记为自动,可以使用:

# pkg set -A 1 devel/cmake

如果一个软件包成为叶子包并被标记为自动,它就会被 pkg autoremove 选中。

将一个已安装的软件包标记为非自动,可以使用:

# pkg set -A 0 devel/cmake

4.4.11.删除陈旧的软件包

默认情况下, pkg 将软件包存储在 pkg.conf(5)open in new window 中由 PKG_CACHEDIR 定义的缓存目录中。只有最新安装的软件包的副本被保存。旧版本的 pkg 会保留所有以前的软件包。要删除这些过时的软件包,请运行:

# pkg clean

可以通过运行来清理全部缓存:

# pkg clean -a

4.4.12.锁定和解锁软件包

pkg-lock(8)open in new window 用来锁定软件包, 以防止重新安装、修改或删除。 pkg-unlock(8)open in new window 则是解锁指定的软件包。两种变体都只对当前安装的软件包有影响。因此,不可能通过这个机制来阻止一个新包的安装,除非这样的安装意味着要更新一个被锁定的包。

例如,要锁定 nginx-lite

# pkg lock nginx-lite

解锁 nginx-lite

# pkg unlock nginx-lite

4.4.13.修改软件包的元数据

FreeBSD Ports 中的软件可能会历经重大的版本号变化。为了解决这个问题,pkg 有一个内置的命令来更新软件包的来源。这可能很有用,例如如果 lang/python3open in new window 被改名为 lang/python311open in new window, 那么 lang/python3open in new window 现在可以代表 3.11 版本。

要改变上述例子中的软件包来源,请运行:

# pkg set -o lang/python3:lang/python311

再比如,要将 lang/ruby31open in new window 更新为 lang/ruby32open in new window,运行:

# pkg set -o lang/ruby31:lang/ruby32

注意

当改变软件包的来源时,重要的是要重新安装那些依赖于修改了来源的软件包的软件包。要强制重新安装依赖的软件包,请运行:

# pkg install -Rf lang/ruby32