第 4 章. 安装应用程序:软件包和 Ports

4.1。概述

FreeBSD 与丰富的系统工具集合捆绑在一起,作为基础系统的一部分。此外,FreeBSD 提供了两种互补技术来安装第三方软件:FreeBSD Ports Collection 用于从源代码安装,而软件包用于从预构建的二进制文件安装。这两种方法都可以用于从本地介质或网络安装软件。

阅读完本章后,您将了解

  • 二进制软件包和端口之间的区别。

  • 如何找到已移植到 FreeBSD 的第三方软件。

  • 如何使用 pkg 管理二进制软件包。

  • 如何使用 Ports Collection 从源代码构建第三方软件。

  • 如何找到与应用程序一起安装的文件以进行安装后配置。

  • 如果软件安装失败,该怎么办。

4.2。软件安装概述

FreeBSD 端口 是一个文件集合,旨在自动化从源代码编译应用程序的过程。构成端口的文件包含所有必要的关于自动下载、提取、修补、编译和安装应用程序的信息。

如果软件尚未在 FreeBSD 上进行调整和测试,则可能需要编辑源代码才能使其正常安装和运行。

但是,超过 36000 个第三方应用程序已经移植到 FreeBSD。在可行的情况下,这些应用程序可作为预编译的软件包 下载。

软件包可以使用 FreeBSD 软件包管理命令进行操作。

软件包和端口都理解依赖关系。如果使用软件包或端口安装应用程序,并且尚未安装依赖库,则将首先自动安装该库。

FreeBSD 软件包包含应用程序的所有命令的预编译副本,以及任何配置文件和文档。软件包可以使用 pkg(8) 命令进行操作,例如 pkg install

尽管这两种技术相似,但软件包和端口都有自己的优势。选择满足您安装特定应用程序的要求的技术。

软件包优势
  • 压缩的软件包压缩包通常比包含应用程序源代码的压缩压缩包小。

  • 软件包不需要编译时间。对于大型应用程序(例如 Firefox、KDE Plasma 或 GNOME),这在速度较慢的系统上可能很重要。

  • 软件包不需要了解在 FreeBSD 上编译软件的过程。

端口优势
  • 软件包通常使用保守选项进行编译,因为它们必须在最多的系统上运行。通过从端口编译,可以更改编译选项。

  • 某些应用程序具有与安装哪些功能相关的编译时选项。例如,NGINX® 可以配置为具有多种内置选项。

    在某些情况下,将存在多个软件包来指定特定设置的同一应用程序。例如,NGINX® 可作为 nginx 软件包和 nginx-lite 软件包使用,具体取决于是否安装了 Xorg。如果应用程序具有多个编译时选项,则创建多个软件包将很快变得不可能。

  • 某些软件的许可条款禁止二进制分发。此类软件必须作为源代码分发,并且必须由最终用户编译。

  • 有些人不喜欢二进制分发,或者更愿意阅读源代码以查找潜在问题。

  • 要应用自定义修补程序,需要源代码。

要跟踪更新的端口,请订阅 FreeBSD ports 邮件列表FreeBSD ports 错误邮件列表

在安装应用程序之前,请检查 https://vuxml.freebsd.org/ 以了解相关的安全问题。

要根据已知漏洞审核已安装的软件包,请运行 pkg audit -F

本章的其余部分介绍了如何使用软件包和端口在 FreeBSD 上安装和管理第三方软件。

4.3。查找软件

FreeBSD 的可用应用程序列表一直在不断增长。有多种方法可以查找要安装的软件

  • FreeBSD 网站维护着所有可用应用程序的最新可搜索列表,位于 Ports Portal。可以按应用程序名称或软件类别搜索端口。

  • Dan Langille 维护着 FreshPorts,它提供了一个全面的搜索实用程序,还跟踪 Ports Collection 中应用程序的变化。注册用户可以创建自定义观察列表,以便在观察的端口更新时收到自动电子邮件。

  • 如果查找特定应用程序变得具有挑战性,请尝试搜索 SourceForgeGitHub 等网站,然后查看 Ports Portal,了解该应用程序是否已移植。

  • 使用 pkg(8) 命令搜索二进制软件包存储库中的应用程序

4.4。使用 pkg 进行二进制软件包管理

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

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

但是,对于那些从源代码构建的站点,将需要一个单独的 端口管理工具

由于 pkg(8) 仅适用于二进制软件包,因此它不能替代此类工具。这些工具可用于从二进制软件包和 Ports Collection 安装软件,而 pkg(8) 仅安装二进制软件包。

4.4.1。pkg 入门

所有受支持版本的 FreeBSD 现在都包含 /usr/sbin/pkg,也称为 pkg(7)。这是一个小型占位符,它仅具有启动真实 pkg(8) 所需的最低功能。

引导过程成功需要 Internet 工作连接。

运行 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 的使用信息可在 pkg(8) 手册页中找到,或者通过在不带任何其他参数的情况下运行 pkg 来找到。pkg.conf(5) 中描述了其他 pkg 配置选项。

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

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

# pkg help install

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

4.4.2。季度和最新端口分支

Quarterly 分支为用户提供了一个更可预测和稳定的端口和软件包安装和升级体验。这基本上是通过仅允许非功能更新来实现的。季度分支旨在接收安全修复程序(可能是版本更新或提交的回退)、错误修复以及端口合规性或框架更改。季度分支在每年的 1 月、4 月、7 月和 10 月的季度初从 HEAD 分支。分支的命名方式是创建年份 (YYYY) 和季度 (Q1-4)。例如,在 2023 年 1 月创建的季度分支名为 2023Q1。而 Latest 分支向用户提供软件包的最新版本。

要将 pkg(8) 从 Quarterly 切换到 Latest,请运行以下命令

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

然后运行以下命令更新 Latest 分支的本地软件包存储库目录

# 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) 语法的更多信息,请访问 官方 UCL 网站

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

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

要搜索软件包,可以使用 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     : [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) 将已安装的软件包升级到最新版本

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

作为依赖项安装的软件包称为自动软件包。可以使用以下命令列出非自动软件包,即不是作为另一个软件包的依赖项显式安装的软件包

# pkg prime-list

输出应类似于以下内容

nginx
openvpn
sudo

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

# 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

4.5. 使用 Ports Collection

Ports Collection 是一组 Makefiles、补丁和描述文件。每一组这些文件用于在 FreeBSD 上编译和安装单个应用程序,称为端口

默认情况下,Ports Collection 本身存储为 /usr/ports 的子目录。

在安装和使用 Ports Collection 之前,请注意,通常不建议将 Ports Collection 与通过 pkg 提供的二进制软件包一起使用来安装软件。默认情况下,pkg 跟踪端口树的季度分支发布版,而不是 HEAD。HEAD 中的端口与季度分支发布版中对应的端口的依赖项可能不同,这会导致 pkg 安装的依赖项与 Ports Collection 中的依赖项之间发生冲突。如果必须将 Ports Collection 和 pkg 结合使用,则确保您的 Ports Collection 和 pkg 处于端口树的同一分支发布版上。

Ports Collection 包含软件类别的目录。每个类别中都包含单个应用程序的子目录。每个应用程序子目录都包含一组文件,这些文件告诉 FreeBSD 如何编译和安装该程序,称为端口骨架。每个端口骨架都包含以下文件和目录

  • Makefile:包含指定应用程序应如何编译以及其组件应安装在何处的语句。

  • distinfo:包含用于构建端口的必须下载的文件的名称和校验和。

  • files/:此目录包含该程序在 FreeBSD 上编译和安装所需的所有补丁。此目录还可以包含用于构建端口的其他文件。

  • pkg-descr:提供对该程序的更详细描述。

  • pkg-plist:端口将安装的所有文件的列表。它还告诉端口系统在卸载时删除哪些文件。

一些端口包含 pkg-message 或其他文件来处理特殊情况。有关这些文件以及端口的更多详细信息,请参阅 FreeBSD 移植手册

端口不包含实际的源代码,也称为 distfile。构建端口的提取部分会自动将下载的源代码保存到 /usr/ports/distfiles

4.5.1. 安装 Ports Collection

在使用端口编译应用程序之前,必须先安装 Ports Collection。如果在安装 FreeBSD 时未安装它,请使用以下方法来安装它

过程:Git 方法

如果需要对端口树进行更多控制,或者需要维护本地更改,或者正在运行 FreeBSD-CURRENT,则可以使用 Git 来获取 Ports Collection。有关 Git 的详细描述,请参阅 Git 简介

我们在 git 命令行中添加 --depth 1 以克隆树而无需获取提交历史,这可以节省时间,对于大多数用户来说是可以接受的。如果您对端口树有自己的更改,或者出于任何原因需要历史记录,请在下面省略 --depth 1 参数。

  1. 在使用 Git 检查端口树之前,必须安装 Git。如果已经存在端口树的副本,请按照以下步骤安装 Git

    # cd /usr/ports/devel/git
    # make install clean

    如果端口树不可用,或者 pkg 用于管理软件包,则可以将 Git 作为软件包安装

    # pkg install git
  2. 检出端口树的 HEAD 分支的副本

    # git clone --depth 1 https://git.FreeBSD.org/ports.git /usr/ports
  3. 或者,检出季度分支的副本

    # git clone --depth 1 https://git.FreeBSD.org/ports.git -b 2023Q1 /usr/ports
  4. 根据需要,在初始 Git 检出后更新 /usr/ports

    # git -C /usr/ports pull
  5. 根据需要,将 /usr/ports 切换到不同的季度分支

    # git -C /usr/ports switch 2023Q1

4.5.2. 安装端口

本节提供有关使用 Ports Collection 安装或删除软件的基本说明。有关可用 make 目标和环境变量的详细描述,请参阅 ports(7)

在编译任何端口之前,请确保按上一节中所述更新 Ports Collection。由于任何第三方软件的安装都可能引入安全漏洞,建议您首先检查 https://vuxml.freebsd.org/ 以了解与该端口相关的已知安全问题。或者,在安装新端口之前运行 pkg audit -F。可以将此命令配置为在每天的安全系统检查期间自动执行安全审核和漏洞数据库更新。有关更多信息,请参阅 pkg-audit(8)periodic(8)

使用 Ports Collection 假设有一个有效的互联网连接。它还需要超级用户权限。

要编译和安装端口,请更改到要安装的端口的目录,然后在提示符处键入 make install。消息将指示进度

# cd /usr/ports/sysutils/lsof
# make install
>> lsof_4.88D.freebsd.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
>> Attempting to fetch from ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/.
===>  Extracting for lsof-4.88
...
[extraction output snipped]
...
>> Checksum OK for lsof_4.88D.freebsd.tar.gz.
===>  Patching for lsof-4.88.d,8
===>  Applying FreeBSD patches for lsof-4.88.d,8
===>  Configuring for lsof-4.88.d,8
...
[configure output snipped]
...
===>  Building for lsof-4.88.d,8
...
[compilation output snipped]
...

===>  Installing for lsof-4.88.d,8
...
[installation output snipped]
...
===>   Generating temporary packing list
===>   Compressing manual pages for lsof-4.88.d,8
===>   Registering installation for lsof-4.88.d,8
===>  SECURITY NOTE:
      This port has installed the following binaries which execute with
      increased privileges.
/usr/local/sbin/lsof
#

由于 lsof 是一个以提升权限运行的程序,因此在安装时会显示安全警告。安装完成后,将返回提示符。

一些 shell 会缓存 PATH 环境变量中列出的目录中可用的命令,以加快对这些命令的可执行文件的查找操作。tcsh shell 的用户应该输入 rehash,以便可以使用新安装的命令,而无需指定其完整路径。对于 sh shell,请改用 hash -r。有关更多信息,请参阅 shell 文档。

在安装过程中,会创建一个工作子目录,其中包含编译过程中使用的所有临时文件。删除此目录可以节省磁盘空间,并最大程度地减少将来升级到该端口的较新版本时出现问题的可能性。

# make clean
===>  Cleaning for lsof-88.d,8
#

要节省此额外步骤,请在编译端口时使用 make install clean

4.5.2.1. 自定义端口安装

一些端口提供构建选项,这些选项可用于启用或禁用应用程序组件,提供安全选项,或允许其他自定义。例如 www/firefoxsecurity/gpgme。如果端口依赖于具有可配置选项的其他端口,它可能会暂停几次以进行用户交互,因为默认行为是提示用户从菜单中选择选项。要避免这种情况并在一个批次中完成所有配置,请在端口骨架中运行 make config-recursive。然后,运行 make install [clean] 来编译和安装端口。

使用 config-recursive 时,要配置的端口列表由 all-depends-list 目标收集。建议运行 make config-recursive,直到所有依赖端口选项都已定义,并且不再出现端口选项屏幕,以确保所有依赖项选项都已配置。

有几种方法可以重新访问端口的构建选项菜单,以便在构建端口后添加、删除或更改这些选项。一种方法是 cd 到包含该端口的目录中,然后键入 make config。另一个选择是使用 make showconfig。另一个选择是执行 make rmconfig,这将删除所有选定的选项,并允许您重新开始。所有这些选项以及其他选项都将在 ports(7) 中详细解释。

端口系统使用 fetch(1) 下载源文件,它支持各种环境变量。如果 FreeBSD 系统位于防火墙或 FTP/HTTP 代理后面,则可能需要设置 FTP_PASSIVE_MODEFTP_PROXYFTP_PASSWORD 变量。有关支持变量的完整列表,请参阅 fetch(3)

对于无法始终连接到互联网的用户,可以在 /usr/ports 中运行 make fetch 来获取所有发行文件,或者在某个类别中运行,例如 /usr/ports/net,或者在特定端口骨架中运行。请注意,如果端口有任何依赖项,则在类别或端口骨架中运行此命令将 *不会* 获取来自另一个类别的端口的发行文件。相反,使用 make fetch-recursive 来获取端口所有依赖项的发行文件。

在罕见的情况下,例如当组织拥有本地发行文件存储库时,可以使用 MASTER_SITES 变量来覆盖 Makefile 中指定的下栽位置。使用时,请指定备用位置

# cd /usr/ports/directory
# make MASTER_SITE_OVERRIDE= \
ftp://ftp.organization.org/pub/FreeBSD/ports/distfiles/ fetch

WRKDIRPREFIXPREFIX 变量可以覆盖默认的工作目录和目标目录。例如

# make WRKDIRPREFIX=/usr/home/example/ports install

将在 /usr/home/example/ports 中编译端口,并将所有内容安装到 /usr/local 下。

# make PREFIX=/usr/home/example/local install

将在 /usr/ports 中编译端口,并将其安装到 /usr/home/example/local 中。并且

# make WRKDIRPREFIX=../ports PREFIX=../local install

将两者结合在一起。

这些也可以作为环境变量设置。有关如何设置环境变量的说明,请参阅 shell 的手册页。

4.5.3. 删除已安装的端口

可以使用 pkg delete 卸载已安装的端口。有关使用此命令的示例,请参阅 pkg-delete(8) 手册页。

或者,可以在端口目录中运行 make deinstall

# cd /usr/ports/sysutils/lsof
# make deinstall
===>  Deinstalling for sysutils/lsof
===>   Deinstalling
Deinstallation has been requested for the following 1 packages:

	lsof-4.88.d,8

The deinstallation will free 229 kB
[1/1] Deleting lsof-4.88.d,8... done

建议阅读端口卸载时的消息。如果端口有任何依赖它的应用程序,将显示此信息,但卸载将继续进行。在这种情况下,最好重新安装应用程序以防止依赖项中断。

4.5.4. 升级端口

随着时间的推移,Ports Collection 中会提供更新版本的软件。本节介绍如何确定哪些软件可以升级以及如何执行升级。

要确定是否提供已安装端口的更新版本,请确保已安装端口树的最新版本,使用 Git 方法 中描述的更新命令。以下命令将列出已过时的已安装端口

# pkg version -l "<"

在尝试升级之前,请阅读 /usr/ports/UPDATING,从文件顶部到最接近上次升级端口或安装系统的时间的日期。此文件描述了用户在更新端口时可能会遇到的各种问题以及需要执行的额外步骤,包括文件格式更改、配置文件位置更改或与以前版本不兼容等。记下与任何需要升级的端口匹配的任何说明,并在执行升级时遵循这些说明。

4.5.4.1. 用于升级和管理端口的工具

Ports Collection 包含多个实用程序来执行实际的升级。每个都有其优缺点。

从历史上看,大多数安装使用 Portmaster 或 Portupgrade。Synth 是一个更新的替代方案。

选择哪个工具最适合特定系统取决于系统管理员。建议在使用任何这些工具之前备份您的数据。

4.5.4.2. 使用 Portmaster 升级端口

ports-mgmt/portmaster 是一个非常小的实用程序,用于升级已安装的端口。它旨在使用与 FreeBSD 基本系统一起安装的工具,而无需依赖其他端口或数据库。要将此实用程序作为端口安装

# cd /usr/ports/ports-mgmt/portmaster
# make install clean

Portmaster 定义了四类端口

  • 根端口:没有依赖项,也不是任何其他端口的依赖项。

  • 主干端口:没有依赖项,但其他端口依赖于它。

  • 分支端口:有依赖项,其他端口依赖于它。

  • 叶子端口:有依赖项,但没有其他端口依赖于它。

要列出这些类别并搜索更新

# portmaster -L
===>>> Root ports (No dependencies, not depended on)
===>>> ispell-3.2.06_18
===>>> screen-4.0.3
        ===>>> New version available: screen-4.0.3_1
===>>> tcpflow-0.21_1
===>>> 7 root ports
...
===>>> Branch ports (Have dependencies, are depended on)
===>>> apache22-2.2.3
        ===>>> New version available: apache22-2.2.8
...
===>>> Leaf ports (Have dependencies, not depended on)
===>>> automake-1.9.6_2
===>>> bash-3.1.17
        ===>>> New version available: bash-3.2.33
...
===>>> 32 leaf ports

===>>> 137 total installed ports
        ===>>> 83 have new versions available

此命令用于升级所有过时的端口

# portmaster -a

默认情况下,Portmaster 在删除现有端口之前会创建一个备份包。如果新版本的安装成功,Portmaster 将删除备份。使用 -b 指示 Portmaster 不要自动删除备份。添加 -i 将 Portmaster 启动到交互模式,在升级每个端口之前提示确认。还有许多其他选项可用。阅读 portmaster(8) 的手册页,详细了解它们的用法。

如果在升级过程中遇到错误,请添加 -f 来升级和重建所有端口

# portmaster -af

Portmaster 也可以用于在系统上安装新端口,在构建和安装新端口之前升级所有依赖项。要使用此功能,请指定 Ports Collection 中端口的位置

# portmaster shells/bash

有关 ports-mgmt/portmaster 的更多信息,请参阅其 pkg-descr

4.5.4.3. 使用 Portupgrade 升级端口

ports-mgmt/portupgrade 是另一个可用于升级端口的实用程序。它安装了一套应用程序,可用于管理端口。但是,它依赖于 Ruby。要安装端口

# cd /usr/ports/ports-mgmt/portupgrade
# make install clean

在使用此实用程序执行升级之前,建议使用 pkgdb -F 扫描已安装端口列表,并修复它报告的所有不一致。

要升级系统上安装的所有过时的端口,请使用 portupgrade -a。或者,包括 -i 以要求确认每次单独的升级

# portupgrade -ai

要升级特定应用程序而不是所有可用端口,请使用 portupgrade pkgname。包括 -R 来首先升级给定应用程序所需的所有端口非常重要

# portupgrade -R firefox

如果包括 -P,Portupgrade 将在 PKG_PATH 中列出的本地目录中搜索可用的包。如果本地不可用,它将从远程站点获取包。如果本地无法找到包或无法从远程获取包,Portupgrade 将使用端口。要完全避免使用端口,请指定 -PP。这组最后的选择会告诉 Portupgrade 如果没有可用的包,则中止

# portupgrade -PP gnome3

要仅获取端口发行文件,或者如果指定了 -P,则获取包,而无需构建或安装任何东西,请使用 -F。有关所有可用开关的更多信息,请参阅 portupgrade 的手册页。

有关 ports-mgmt/portupgrade 的更多信息,请参阅其 pkg-descr

4.5.5. 端口和磁盘空间

随着时间的推移,使用 Ports Collection 会占用磁盘空间。构建和安装端口后,在端口骨架中运行 make clean 将清理临时 work 目录。如果使用 Portmaster 安装端口,除非指定了 -K,否则它会自动删除此目录。如果安装了 Portupgrade,此命令将删除在 Ports Collection 的本地副本中找到的所有 work 目录

# portsclean -C

此外,过时的源代码分发文件会随着时间的推移在 /usr/ports/distfiles 中累积。要使用 Portupgrade 删除所有不再被任何端口引用的发行文件

# portsclean -D

Portupgrade 可以删除所有未被当前安装在系统上的任何端口引用的发行文件

# portsclean -DD

如果安装了 Portmaster,请使用

# portmaster --clean-distfiles

默认情况下,此命令是交互式的,并提示用户确认是否应删除发行文件。

除了这些命令之外,ports-mgmt/pkg_cutleaves 自动执行删除不再需要的已安装端口的任务。

4.6. 使用 poudriere 构建包

poudriere 是一个使用 BSD 许可的工具,用于创建和测试 FreeBSD 软件包。它使用 FreeBSD 监狱来设置隔离的编译环境。这些监狱可用于为与安装它的系统不同的 FreeBSD 版本构建软件包,也可以用于在主机是 amd64 系统时为 i386 构建软件包。构建软件包后,它们将以与官方镜像相同的布局排列。这些软件包可供 pkg(8) 和其他软件包管理工具使用。

poudriere 是使用 ports-mgmt/poudriere 软件包或端口安装的。安装程序包含一个示例配置文件 /usr/local/etc/poudriere.conf.sample。将此文件复制到 /usr/local/etc/poudriere.conf。编辑复制的文件以适合本地配置。

虽然在运行 poudriere 的系统上不需要 ZFS,但它是有益的。当使用 ZFS 时,必须在 /usr/local/etc/poudriere.conf 中指定 ZPOOL,并且 FREEBSD_HOST 应设置为附近的镜像。定义 CCACHE_DIR 使得可以使用 devel/ccache 来缓存编译并减少频繁编译代码的构建时间。将 poudriere 数据集放在挂载在 /poudriere 的隔离树中可能很方便。其他配置值的默认值已足够。

检测到的处理器核心数量用于定义将并行运行多少个构建。使用 RAM 或交换空间提供足够的虚拟内存。如果虚拟内存耗尽,编译监狱将停止并被拆除,从而导致奇怪的错误消息。

4.6.1. 初始化监狱和端口树

配置完成后,初始化 poudriere,以便它安装一个包含所需 FreeBSD 树和端口树的监狱。使用 -j 指定监狱的名称,使用 -v 指定 FreeBSD 版本。在运行 FreeBSD/amd64 的系统上,可以使用 -a 将体系结构设置为 i386amd64。默认值为 uname 显示的体系结构。

# poudriere jail -c -j 13amd64 -v 13.1-RELEASE
[00:00:00] Creating 13amd64 fs at /poudriere/jails/13amd64... done
[00:00:00] Using pre-distributed MANIFEST for FreeBSD 13.1-RELEASE amd64
[00:00:00] Fetching base for FreeBSD 13.1-RELEASE amd64
/poudriere/jails/13amd64/fromftp/base.txz              125 MB 4110 kBps    31s
[00:00:33] Extracting base... done
[00:00:54] Fetching src for FreeBSD 13.1-RELEASE amd64
/poudriere/jails/13amd64/fromftp/src.txz               154 MB 4178 kBps    38s
[00:01:33] Extracting src... done
[00:02:31] Fetching lib32 for FreeBSD 13.1-RELEASE amd64
/poudriere/jails/13amd64/fromftp/lib32.txz              24 MB 3969 kBps    06s
[00:02:38] Extracting lib32... done
[00:02:42] Cleaning up... done
[00:02:42] Recording filesystem state for clean... done
[00:02:42] Upgrading using ftp
/etc/resolv.conf -> /poudriere/jails/13amd64/etc/resolv.conf
Looking up update.FreeBSD.org mirrors... 3 mirrors found.
Fetching public key from update4.freebsd.org... done.
Fetching metadata signature for 13.1-RELEASE from update4.freebsd.org... done.
Fetching metadata index... done.
Fetching 2 metadata files... done.
Inspecting system... done.
Preparing to download files... done.
Fetching 124 patches.....10....20....30....40....50....60....70....80....90....100....110....120.. done.
Applying patches... done.
Fetching 6 files... done.
The following files will be added as part of updating to
13.1-RELEASE-p1:
/usr/src/contrib/unbound/.github
/usr/src/contrib/unbound/.github/FUNDING.yml
/usr/src/contrib/unbound/contrib/drop2rpz
/usr/src/contrib/unbound/contrib/unbound_portable.service.in
/usr/src/contrib/unbound/services/rpz.c
/usr/src/contrib/unbound/services/rpz.h
/usr/src/lib/libc/tests/gen/spawnp_enoexec.sh
The following files will be updated as part of updating to
13.1-RELEASE-p1:
[…]
Installing updates...Scanning //usr/share/certs/blacklisted for certificates...
Scanning //usr/share/certs/trusted for certificates...
 done.
13.1-RELEASE-p1
[00:04:06] Recording filesystem state for clean... done
[00:04:07] Jail 13amd64 13.1-RELEASE-p1 amd64 is ready to be used
# poudriere ports -c -p local -m git+https
[00:00:00] Creating local fs at /poudriere/ports/local... done
[00:00:00] Checking out the ports tree... done

在一台计算机上,poudriere 可以使用多个配置、多个监狱和不同的端口树来构建端口。这些组合的自定义配置称为。在安装 ports-mgmt/poudriereports-mgmt/poudriere-devel 后,有关详细信息,请参见 poudriere(8) 的 CUSTOMIZATION 部分。

这里显示的基本配置将单个监狱、端口和集特定的 make.conf 放置在 /usr/local/etc/poudriere.d 中。此示例中的文件名是通过组合监狱名称、端口名称和集名称创建的:13amd64-local-workstation-make.conf。系统 make.conf 和此新文件在构建时组合起来创建构建监狱使用的 make.conf

要构建的软件包将输入 13amd64-local-workstation-pkglist(带有 FLAVORS 的端口可以使用 @FLAVOR 定义)

editors/emacs
devel/git
devel/php-composer2@php82
ports-mgmt/pkg
...

为指定的端口配置选项和依赖项

# poudriere options -j 13amd64 -p local -z workstation -f 13amd64-local-workstation-pkglist

最后,构建软件包并创建软件包存储库

# poudriere bulk -j 13amd64 -p local -z workstation -f 13amd64-local-workstation-pkglist

在运行过程中,按 Ctrl+t 将显示构建的当前状态。poudriere 还会在 /poudriere/logs/bulk/jailname 中构建文件,这些文件可以与 Web 服务器一起使用以显示构建信息。

完成后,新软件包现在可从 poudriere 存储库中安装。

有关使用 poudriere 的更多信息,请参见 poudriere(8) 和主网站 https://github.com/freebsd/poudriere/wiki

4.6.2. 配置 pkg 客户端以使用 poudriere 存储库

虽然可以使用自定义存储库和官方存储库,但有时禁用官方存储库很有用。这是通过创建一个配置文件来覆盖和禁用官方配置文件来实现的。创建 /usr/local/etc/pkg/repos/FreeBSD.conf,其中包含以下内容

FreeBSD: {
	enabled: no
}

通常,通过 HTTP 将 poudriere 存储库提供给客户端机器最容易。设置一个 Web 服务器来提供软件包目录,例如:/usr/local/poudriere/data/packages/13amd64,其中 13amd64 是构建的名称。

如果软件包存储库的 URL 为:http://pkg.example.com/13amd64,则 /usr/local/etc/pkg/repos/custom.conf 中的存储库配置文件将如下所示

custom: {
	url: "http://pkg.example.com/13amd64",
	enabled: yes,
}

如果不想将软件包存储库公开到 Internet,可以使用 file:// 协议直接指向存储库

custom: {
	url: "file:///usr/local/poudriere/data/packages/11amd64",
	enabled: yes,
}

4.7. 安装后注意事项

无论软件是通过二进制软件包还是端口安装的,大多数第三方应用程序都需要在安装后进行一定程度的配置。以下命令和位置可用于帮助确定与应用程序一起安装的内容。

  • 大多数应用程序至少在 /usr/local/etc 中安装一个默认配置文件。在应用程序具有大量配置文件的情况下,将创建一个子目录来保存它们。通常,会安装以 .sample 为后缀的示例配置文件。应查看配置文件,并可能对其进行编辑以满足系统的需求。要编辑示例文件,请先将其复制,但不要使用 .sample 扩展名。

  • 提供文档的应用程序将将其安装到 /usr/local/share/doc 中,许多应用程序还会安装手册页。在继续之前,应查阅此文档。

  • 某些应用程序运行必须添加到 /etc/rc.conf 中才能启动应用程序的服务。这些应用程序通常在 /usr/local/etc/rc.d 中安装一个启动脚本。有关更多信息,请参见 启动服务

    根据设计,应用程序不会在安装时运行其启动脚本,也不会在卸载或升级时运行其停止脚本。此决定留给各个系统管理员。

  • 使用 csh(1) 的用户应运行 rehash 以重建 shell PATH 中的已知二进制列表。

  • 使用 pkg info 确定与应用程序一起安装的文件、手册页和二进制文件。

4.8. 处理损坏的端口

当端口无法构建或安装时,请尝试以下操作

  1. 搜索以查看 问题报告数据库 中是否有针对该端口的待处理修复。如果是,实施建议的修复可能可以解决问题。

  2. 向端口的维护者寻求帮助。在端口骨架中键入 make maintainer 或阅读端口的 Makefile 以查找维护者的电子邮件地址。请记住在向维护者发送电子邮件时包含导致错误的输出。

    某些端口不是由个人维护的,而是由由 邮件列表 表示的组维护者维护的。许多,但并非所有,这些地址类似于 [email protected]。在发送电子邮件时,请注意这一点。

    特别是,由 [email protected] 维护的端口不是由特定个人维护的。相反,所有修复和支持都来自订阅该邮件列表的社区。始终需要更多志愿者!

    如果未收到电子邮件回复,请使用 Bugzilla 根据 编写 FreeBSD 问题报告 中的说明提交错误报告。

  3. 修复它!搬运工手册 包含有关端口基础设施的详细 information,这样你就可以修复偶尔损坏的端口,甚至提交自己的端口!

  4. 使用 使用 pkg 进行二进制软件包管理 中的说明安装软件包而不是端口。


上次修改时间:2024 年 9 月 20 日,作者:Fernando Apesteguía