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

pkg(8) 提供了一个用于操纵软件包的接口:注册、添加、删除和升级软件包。

对于希望仅使用来自 FreeBSD 镜像的预构建二进制软件包的站点,使用pkg(8)进行软件包管理可能就足够了。

然而,对于那些从源代码构建的站点,将需要一个单独的Port 管理工具

由于pkg(8)仅适用于二进制软件包,它并不是这些工具的替代品。这些工具可用于从二进制软件包和 Ports 安装软件,而pkg(8)仅安装二进制软件包。

4.4.1. 使用 pkg 入门

所有受支持的 FreeBSD 版本现在都包含 /usr/sbin/pkg,即 pkg(7)。这是一个小占位符,只包含安装真正的 pkg(8)所需的最小功能。

注意

在引导过程成功之前,需要一个可用的互联网连接。

运行pkg(8)命令行:

# pkg

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

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

pkg(7)将截取该命令,如果确认你的意图,将下载 pkg(8)压缩包,从中安装 pkg(8),引导本地软件包数据库,然后继续运行最初请求的命令。

pkg(7)的较新版本理解 pkg -N 作为测试是否安装了 pkg(8) 而不触发安装的方法,反之,pkg bootstrap[-f] 用于安装 pkg(8)(或强制重新安装),而不执行任何其他操作。

pkg(8)的用法信息可在 pkg(8) 手册页中找到,也可以通过在没有其他参数的情况下运行 pkg 来查看。pkg.conf(5)中描述了额外的 pkg 配置选项。

每个 pkg 命令参数都在特定于命令的手册页中有文档。

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

# pkg help install

本节的其余部分演示了使用pkg(8)执行的常见二进制软件包管理任务。每个演示的命令提供了许多开关,以定制其使用。有关详细信息和更多示例,请参阅命令的帮助或手册页。

4.4.2. 季度和最新的 Ports 分支

Quarterly,季度 分支为用户提供了更可预测和稳定的 Ports 和软件包安装和升级体验。这主要通过仅允许非功能更新来实现。季度分支旨在接收安全修复(可能是版本更新,或提交的后退),错误修复和符合或框架更改的 Port。季度分支是每个(年度)季度在一月、四月、七月和十月初始时从 HEAD 切出的。分支的名称根据它们创建的年份(YYYY)和季度(Q1-4)进行命名。例如,2023 年 1 月创建的季度分支被命名为 2023Q1。而 Latest 分支为用户提供了软件包的最新版本。

要将pkg(8)从季度切换到最新,请运行以下命令:

# 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)pkg(8) 工具使用的系统范围的配置文件。此文件的默认位置是 /usr/local/etc/pkg.conf

注意

FreeBSD 不需要有 pkg.conf 文件。许多安装过程没有 pkg.conf 或只有空的 pkg.conf(除了注释行)也运行良好。

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

该文件采用 UCL 格式。有关 libucl(3) 语法的更多信息,请访问 official UCL website

文件识别以下类型的选项 - 布尔、字符串和列表选项。

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

4.4.4. 搜索软件包

要搜索软件包,可以使用 pkg-search(8)

# 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)。此命令使用存储库数据确定要安装的软件的版本以及是否有未安装的依赖关系。例如,要安装 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)。例如,要下载 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) 如下:

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

4.4.6. 获取已安装软件包的信息

可以通过运行 pkg-info(8) 查看系统上安装的软件包的信息,当不带任何开关运行时,它将列出所有已安装软件包或指定软件包的软件包版本。

例如,要查看安装的 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     : pkg@FreeBSD.org
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) 将已安装的软件包升级到其最新版本:

# pkg upgrade

此命令将比较安装版本与存储库目录中可用版本,并从存储库中升级它们。

4.4.8. 审计已安装的软件包

定期会发现第三方应用程序中的软件漏洞。为了解决这个问题,pkg 包括了一个内置的审计机制。要确定系统上安装的软件的已知漏洞,请使用 pkg-audit(8)

# 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) 移除。

例如:

# 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) 自动检测并删除作为依赖关系(叶子软件包)安装的不需要的软件包:

# 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]:

作为依赖关系安装的软件包称为 automatic 软件包。非自动软件包,即明确安装而不是依赖于其他软件包的软件包,可以使用以下命令列出:

# pkg prime-list

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

nginx
openvpn
sudo

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

# pkg prime-origins

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

www/nginx
security/openvpn
security/sudo

此列表可用于使用构建工具(例如 ports-mgmt/poudriereports-mgmt/synth)重建系统上安装的所有软件包。

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

# pkg set -A 1 devel/cmake

一旦软件包是叶子软件包并标记为自动,它就会被 pkg autoremove 选中。

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

# pkg set -A 0 devel/cmake

4.4.11. 移除旧版本的软件包

默认情况下,pkg 将二进制软件包存储在由 pkg.conf(5) 中的 PKG_CACHEDIR 定义的缓存目录中。仅保留最新安装软件包的副本。旧版本的 pkg 保留了所有先前的软件包。要删除这些过时的二进制软件包,请运行:

# pkg clean

可以通过运行以下命令清除整个缓存:

# pkg clean -a

4.4.12. 锁定和解锁软件包

pkg-lock(8) 用于锁定软件包,防止重新安装、修改或删除。pkg-unlock(8) 解锁指定的软件包。这两个变体仅对当前已安装的软件包产生影响。因此,使用此机制无法阻止通过此机制更新已锁定的软件包来安装新软件包。

例如,锁定 nginx-lite

# pkg lock nginx-lite

解锁 nginx-lite

# pkg unlock nginx-lite

4.4.13. 修改软件包元数据

FreeBSD Ports Collection 中的软件可能会发生主版本号更改。为了解决这个问题,pkg 有一个内置的命令来更新软件包起源。例如,如果 lang/python3 重命名为 lang/python311,以便 lang/python3 现在可以表示版本 3.11,那么可以运行:

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

另一个例子,要将 lang/ruby31 更新到 lang/ruby32,可以运行:

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

注意

更改软件包起源时,有必要重新安装依赖于具有修改起源的软件包的软件包。要强制重新安装依赖软件包,请运行:

># pkg install -Rf lang/ruby32
>```

最后更新于

FreeBSD 中文社区