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 不带额外参数获得pkg 的用法信息。有关更多 pkg 配置选项的信息,请参阅 pkg.conf(5)。

每个 pkg 命令参数在特定命令手册页面中都有说明。

阅读 pkg install 的手册页面,例如,运行此命令:

# pkg help install

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

4.4.2. 按季度和最新Ports分支

该季度分支为用户提供更可预测和稳定的port和软件包安装升级体验。这主要通过仅允许非功能更新来实现。季度分支旨在接收安全补丁(可能是版本更新,或提交的回溯),错误修复和ports合规性或框架更改。季度分支每年(每季度)在一月,四月,七月和十月初切自 HEAD。分支名称根据创建年(YYYY)和季度(Q1-4)命名。例如,2023 年一月创建的季度分支,命名为 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(8)工具使用的系统级配置文件是pkg.conf(5)。该文件的默认位置是 /usr/local/etc/pkg.conf。

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

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

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

如果配置文件中指定以下任一值,则将布尔选项标记为启用 - 是,真和开。

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

卸载软件包

不再需要的软件包可以使用 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]:

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

# pkg prime-list

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

nginx
openvpn
sudo

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

# pkg prime-origins

输出应类似于以下内容:

www/nginx
security/openvpn
security/sudo

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

用以下方法可以将安装的软件包标记为自动:

# pkg set -A 1 devel/cmake

若软件包是叶子软件包并标记为自动,它将被选择 pkg autoremove。

用以下方法可以将安装的软件包标记为非自动:

# pkg set -A 0 devel/cmake

4.4.11. 移除过时的软件包

默认情况下,pkg 将二进制软件包存储在由 pkg.conf(5)中定义的缓存目录中。只保留最新安装的软件包。较老版本的 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 中的软件可能会经历主版本号的修改。为了解决这个问题,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 中文社区 2024