4.5.使用 Ports

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

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

警告

在安装和使用 Ports 之前,请注意通常不建议同时使用 Ports 和通过 pkg 提供的二进制软件包来安装软件。默认情况下,pkg 跟踪 ports 的季度分支发布,而不是 HEAD。与其对应的季度分支版本相比,HEAD 中的一个 Port 的依赖关系可能会有所不同,这可能导致 pkg 安装的依赖关系与 Ports 中的依赖关系发生冲突。如果必须同时使用 Ports 和 pkg,则确保你的 Ports 和 pkg 在 ports 的相同季度分支上。

Ports 包含用于软件类别的目录。在每个类别内部,有用于单个应用程序的子目录。每个应用程序子目录都包含告诉 FreeBSD 如何编译和安装该程序的文件集,称为 ports 骨架。每个 Port 骨架都包括这些文件和目录:

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

  • distinfo:包含必须下载以构建 Port 的文件的名称和校验和。

  • files/:此目录包含程序在 FreeBSD 上编译和安装所需的任何补丁。此目录还可能包含用于构建 Port 的其他文件。

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

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

某些 Port 包括 pkg-message 或其他文件来处理特殊情况。有关这些文件以及 Ports 的更多详细信息,请参阅 FreeBSD Porter’s Handbook

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

4.5.1. 安装 Ports

在使用 Ports 编译应用程序之前,必须首先安装 Ports 。如果在安装 FreeBSD 期间未安装它,则可以使用以下方法之一安装它:

过程:Git 方法

如果需要更多控制 ports 树或需要维护本地更改,或者正在运行 FreeBSD-CURRENT,可以使用 Git 获取 Ports 。有关 Git 的详细说明,请参阅 Git Primer

  1. 在可以使用 Git 检出 ports 树之前,必须先安装 Git。如果已经存在 ports 树的副本,请像这样安装 Git:

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

如果 ports 不可用,或者正在使用 pkg 管理软件包,可以将 Git 安装为软件包:

# pkg install git
  1. 检出 ports 的 HEAD 分支的副本:

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

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

# git -C /usr/ports pull
  1. 需要时,将 /usr/ports 切换到另一个季度分支:

# git -C /usr/ports switch 2023Q1

4.5.2. 安装 Ports

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

警告

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

使用 Ports 假定有一个正常工作的互联网连接。它还需要超级用户权限。

要编译并安装 Port ,请切换到要安装的 Port 的目录,然后在提示符下键入 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 的文档。

在安装期间,将创建一个工作子目录,其中包含在编译过程中使用的所有临时文件。删除此目录可节省磁盘空间,并在以后升级到新版本的 Port 时最小化问题的几率:

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

技巧

为了节省这一额外的步骤,可以在编译 Port 时使用 make install clean

4.5.2.1. 自定义 Port 安装

一些 Port 提供可用于启用或禁用应用程序组件、提供安全选项或允许其他自定义的构建选项。例如,www/firefoxsecurity/gpgme。如果 Port 依赖于其他具有可配置选项的 Port ,它可能会在用户与默认行为相反的菜单中提示用户多次。为了避免这种情况,并一次性执行所有配置,请在 Ports 骨架中运行 make config-recursive。然后,运行 make install [clean] 来编译和安装 Port 。

技巧

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

有几种方法可以重新访问 Port 的构建选项菜单,以添加、删除或更改这些选项,而无需重新构建 Port 。一种方法是 cd 进入包含 Port 的目录,然后键入 make config。另一个选择是使用make showconfig。另一个选择是执行 make rmconfig,它将删除所有选定的选项,并允许你重新开始。所有这些选项以及其他选项在 ports(7) 中有详细说明。

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

对于不能始终连接到互联网的用户,可以在 /usr/ports 中运行 make fetch,以获取所有 distfiles,或者在类别内运行,例如 /usr/ports/net,或者在特定的 Ports 骨架内运行。请注意,如果 Port 有任何依赖关系,那么在类别或 Ports 骨架中运行此命令将 不会 获取另一个类别中的 Port 的 distfiles。而是使用 make fetch-recursive 以获取 Port 的所有依赖项的 distfiles。

在罕见的情况下,例如当组织有一个本地 distfiles 存储库时,可以使用 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 中编译 Port 并在 /usr/local 下安装所有内容。

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

将在 /usr/ports 中编译 Port 并在 /usr/home/example/local 中安装。还有:

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

将两者结合起来。

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

4.5.3. 卸载已安装的 Port

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

或者,可以在 Port 的目录中运行 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

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

4.5.4. 升级 Port

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

要确定已安装的 Port 是否有更新的版本,请确保已安装了最新版本的 ports 树,使用“Git 方法”中描述的更新命令。以下命令将列出已安装的过时 Port :

# pkg version -l "<"

重要

在尝试升级之前,请阅读 /usr/ports/UPDATING 文件,从文件的顶部到最后一次升级 Port 或安装系统的最近日期。此文件描述了用户在更新 Port 时可能遇到的各种问题和需要执行的其他步骤,包括文件格式更改、配置文件位置更改或与先前版本不兼容等。请注意匹配需要升级的任何 Port 的任何指令,并在执行升级时遵循这些指令。 | | --- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

4.5.4.1. 升级和管理 Port 的工具

Ports 包含几个实际执行升级的实用工具。每个工具都有其优点和缺点。

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

注意

对于特定系统,选择哪个工具最好取决于系统管理员。在使用这些工具之前建议备份数据。

4.5.4.2. 使用 Portmaster 升级 Port

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

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

Portmaster 定义了四类 Port :

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

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

  • 分支 Port :有依赖项,并且其他 Port 依赖于它。

  • 叶 Port :有依赖项,但没有其他 Port 依赖于它。

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

# 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

此命令用于升级所有过时的 Port :

# portmaster -a

注意

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

如果在升级过程中出现错误,添加 -f 以升级并重新构建所有 Port :

# portmaster -af

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

# portmaster shells/bash

有关 ports-mgmt/portmaster 的更多信息可以在其 pkg-descr 中找到。

4.5.4.3. 使用 Portupgrade 升级 Port

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

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

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

要升级系统上安装的所有过时 Port ,请使用 portupgrade -a。或者,包含 -i 以在每个单独的升级时请求确认:

# portupgrade -ai

要仅升级指定的应用程序而不是所有可用 Port ,请使用 portupgrade<span> </span><em>pkgname</em>。非常重要的是首先包含 -R 来升级给定应用程序所需的所有 Port :

# portupgrade -R firefox

如果包含了 -P,Portupgrade 将在 PKG_PATH 中列出的本地目录中搜索可用的软件包。如果本地找不到软件包,然后从远程站点获取软件包。如果无法在本地找到或远程获取软件包,则 Portupgrade 将使用 Port 。要完全避免使用 Port ,请指定 -PP。这组选项告诉 Portupgrade 如果没有可用的软件包,则中止:

# portupgrade -PP gnome3

要仅获取 Port distfiles,或者如果指定了 -P 则获取软件包,而不构建或安装任何内容,请使用 -F。有关所有可用开关的更多信息,请参阅 portupgrade 的手册页。

有关 ports-mgmt/portupgrade 的更多信息可以在其 pkg-descr 中找到。

4.5.5. Ports 和磁盘空间

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

# portsclean -C

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

# portsclean -D

Portupgrade 可以删除系统上当前已安装的任何 Port 不再引用的所有 distfiles:

# portsclean -DD

如果安装了 Portmaster,请使用:

# portmaster --clean-distfiles

默认情况下,此命令是交互式的,并在是否应删除 distfile 时提示用户进行确认。

除了这些命令之外,ports-mgmt/pkg_cutleaves 还自动完成删除不再需要的已安装 Port 的任务。

最后更新于

FreeBSD 中文社区