如何在FreeBSD10.1上安装和管理端口

来自菜鸟教程
跳转至:导航、​搜索

介绍

FreeBSD 是一个功能强大的操作系统,能够发挥多种作用。 使该操作系统在许多情况下成为理想选择的部分原因在于它以灵活性着称。 FreeBSD 支持从源代码安装软件的方法,称为 端口系统 ,对这一声誉做出了很大贡献。

在本指南中,我们将讨论 ports 系统的一些好处,并将演示如何使用它来获取和管理其他软件。 我们将介绍如何使用 make 命令进行安装,如何自定义您的应用程序,以及如何利用一些常用工具来简化端口维护。

先决条件

为了遵循本指南,您应该有权访问 FreeBSD 10.1 服务器和具有 sudo 权限的非 root 用户帐户。 本指南可以帮助您登录您的FreeBSD服务器并设置合理的工作环境。

管理不同类型的 FreeBSD 软件

FreeBSD 团队将基本的 FreeBSD 操作系统作为一个连贯的单元来维护。 它的组件使用名为 freebsd-update 的工具进行更新,它们的行为主要通过位于 /etc 目录中的配置文件来控制。 虽然您可以安装和使用捆绑软件的替代品,但您不能轻松或安全地删除包含在基本系统中的软件,因为它们被认为是操作系统的功能必不可少的部分。

相比之下,可选软件使用文件系统中的不同进程、工具和位置进行管理。 与基本系统中的软件不同,可选软件配置在 /usr/local/etc 目录中。 FreeBSD 提供了两种认可的方法来下载和安装附加软件到系统上。

我们将在本指南中描述的 ports 系统通过位于 /usr/ports 的文件系统层次结构进行管理,该层次结构对 FreeBSD 知道如何构建的每个可用软件进行分类。 在该目录中,第一级子目录主要根据功能或语言对软件进行分类。 在这些目录中,每个单独的软件都存在文件夹。 可以通过简单的 make 命令或通过可用的辅助实用程序下载、配置、编译和安装软件。 ports 集合中的软件包括在 FreeBSD 系统上构建和运行应用程序所需的所有补丁。

系统支持的另一种安装类型是 packages,它们是使用合理默认值从 ports 集合编译的软件二进制文件。 这是一种快速获取软件的好方法,但它失去了ports 系统提供的定制级别。 您可以在本指南中了解有关如何管理软件包的更多信息。

准备端口树

端口树是存在于 /usr/ports 目录下的层次结构的名称。 此层次结构包含对应于端口类别的目录,其中包含对应于各个端口的其他目录。

在我们开始操作任何端口之前,我们应该确保这个层次结构是最新的。 忘记刷新端口层次结构可能会导致构建失败,因为端口会尝试获取和构建可能不再有效的文件。

我们可以使用名为 portsnap 的实用程序更新端口树。 该工具查询 FreeBSD 端口服务器的更改。

记下我们最近的更新

在我们执行实际的更新命令之前,我们需要记下端口树中名为 /usr/ports/UPDATING 的特定文件的时间戳。 我们可以使用 stat 工具查看与文件相关的各种时间戳:

stat -x /usr/ports/UPDATING

您应该看到如下所示的输出:

  File: "UPDATING"
  Size: 375337       FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (    0/    root)  Gid: (    0/   wheel)
Device: 0,81   Inode: 2011338    Links: 1
Access: Thu Dec 11 22:24:59 2014
Modify: Thu Dec 11 15:40:12 2014
Change: Thu Dec 11 22:24:59 2014

您可能会收到如下错误:

stat: /usr/ports/UPDATING: stat: No such file or directory

如果您看到这一点,则表示您的系统上没有初始化端口树。 如果是这种情况,请继续阅读下一节,了解如何使用 portsnap 将初始端口树提取到您的系统中。

我们要注意的值是“修改”和“更改”时间,它们在上面的输出中突出显示。 在这种情况下,“修改”时间戳将是端口维护者使用重要信息修改文件的最近时间。 “更改”时间戳将是文件最后一次同步到您的服务器的时间。

我们需要记住时间戳,以便我们在刷新端口树后知道需要注意哪些更新说明。 我们可以通过键入以下命令将这些保存到主目录中的文件中:

stat -x /usr/ports/UPDATING > ~/last_update

现在我们已经记录了这些信息,我们可以继续更新我们的端口树。

使用 Portsnap 更新端口树

一旦您清楚地了解了端口树的最后更新时间,您就可以将您的端口树与来自 FreeBSD 项目站点的最新信息同步。 为此,我们将使用一个名为 portsnap 的工具。

如果您在 /usr/ports 目录中没有任何信息(如果您遇到了我们在上一节中提到的错误),您可以使用 portsnap 下载并解压缩整个端口树到该目录。 这个过程可能需要很长时间,但只有当您的 /usr/ports 目录为空时才需要,这种情况应该只发生一次。 如果您的 FreeBSD 服务器在 DigitalOcean 上,您的端口树应该已经初始化:

sudo portsnap fetch extract

这会将整个端口树下载并解压缩到 /usr/ports 目录。

如果您已经在 /usr/ports 目录中构建了一个端口树(如果您能够在上一节中记录时间戳),则可以使用以下命令将文件更新为最新版本:

sudo portsnap fetch update

此命令将仅提取与 /usr/ports 结构中的文件不同的文件,因此与命令的 extract 变体相比,它花费的时间要少得多。 这是应该在端口树的日常更新中使用的格式。

构建或更新端口树后,您可以开始管理和使用系统上的端口。

在端口树中搜索应用程序

现在您的系统上有更新的端口树层次结构,您可以开始查看可用的软件。 有几种方法可以做到这一点,每种方法都有其优点。

whereis 搜索

搜索应用程序的最简单方法是使用 whereis 命令按名称。 这将在您的系统上和端口树中搜索该命令。 如果找到匹配项,它将返回系统上应用程序的相关路径信息。

通常,如果未安装应用程序但搜索的是有效端口,它将返回端口树中端口的路径。 如果应用程序 安装了 ,它通常会返回可执行文件的路径、端口,通常还会返回 man 页面:

例如,我们可以通过键入以下内容来搜索 wget 实用程序:

whereis wget

如果未安装端口,我们将看到如下内容:

wget: /usr/ports/ftp/wget

由于路径以 /usr/ports 开头,我们知道这是一个可安装的端口。 如果我们想安装这个端口,我们可以使用返回的路径。

如果 wget 命令已经安装,我们可能会看到如下输出:

wget: /usr/local/bin/wget /usr/local/man/man1/wget.1.gz /usr/ports/ftp/wget

这包括实际安装的可执行文件的路径、应用程序的 man 页面文件以及端口树中端口的位置。

在文件系统层次结构中使用 echo 命令搜索

FreeBSD 手册 中,作者还提出了一种相当新颖的搜索方式,仅使用 echo 命令和端口树的内置结构。

端口树设置有 /usr/ports 目录下的所有相关文件和目录。 在文件系统中,每个端口都由一个不同的目录表示,该目录包含在 FreeBSD 系统上构建和安装软件所需的所有信息。

为了帮助组织,这些端口在 /usr/ports 内的类别目录中按功能分组。 因此,在上面的 wget 示例中,我们看到 wget 命令已归入 ftp 组。 因此 /usr/ports 目录包含类别目录,而类别目录又包含端口目录。

我们可以通过使用 echo 命令和通配符来利用这种一致的结构。 由于我们可能不知道端口将存在的类别,因此我们将用星号替换该目录级别。 如果我们想在匹配中更加灵活,我们也可以将它们放在搜索词之前和之后。 所以我们可以通过输入搜索wget相关程序:

echo /usr/ports/*/*wget*

这将返回与此类似的内容:

/usr/ports/ftp/gwget /usr/ports/ftp/wget /usr/ports/www/ruby-wgettsv /usr/ports/www/wgetpaste

这可能比 whereis 命令更灵活一些,因为它不需要完全匹配。

使用可用的 make 目标进行搜索

搜索端口最强大的方法是使用 make 命令。

这也是用于在系统上构建和安装端口的命令,但更一般地说,它是一种灵活的工具,可用于轻松执行已在配置文件中定义的复杂任务。 FreeBSD 开发人员已经创建了 make “目标”(任务定义),它将针对不同的标准执行端口树的搜索。

要使用此功能,您必须首先移动到端口树的底部。 这是定义 make 目标的地方:

cd /usr/ports

执行搜索的一般语法是:

make [search|quicksearch] [searchtype]=[searchquery] [modifiers]

用于搜索端口树的两个 make 目标是 searchquicksearch。 它们具有完全相同的功能,只是它们的默认显示不同。

search 目标将返回有关端口名称、端口树中的路径、一般描述以及构建的详细信息,包括维护者电子邮件、构建依赖项、运行依赖项和上游 URL。 quicksearch 目标仅返回端口名称、路径和描述。

搜索类型可以是以下任何一种:

  • name:仅在端口的名称字段内搜索。
  • key:在端口的名称、注释和依赖项字段中搜索。
  • path:在端口层次结构中搜索特定路径。
  • info:在端口的信息(描述)字段中搜索。
  • maint:按维护者邮箱搜索。
  • cat:根据端口的类别进行搜索。
  • bdeps:搜索每个端口的构建时依赖关系。
  • rdeps:搜索每个端口的运行时依赖关系。
  • www:搜索端口网站。

您还可以在上述任何类别之前添加“x”以删除满足匹配的结果。 例如,如果您的搜索包括 xname=apache,则不会返回名称字段中包含字符串“apache”的任何端口。

让我们看一些简单的例子。 下面,您可以看到 searchquicksearch 目标的输出差异。 search 目标包含有关匹配的完整信息:

make search name=htop
Port:   htop-1.0.3
Path:   /usr/ports/sysutils/htop
Info:   Better top(1) - interactive process viewer
Maint:  gaod@hychen.org
B-deps: autoconf-2.69 autoconf-wrapper-20131203 automake-1.14_1 automake-wrapper-20131203 gettext-runtime-0.19.3 indexinfo-0.2.2 libexecinfo-1.1_3 libffi-3.0.13_3 libiconv-1.14_6 m4-1.4.17_1,1 ncurses-5.9.20141213 perl5-5.18.4_11 python2-2_3 python27-2.7.9 readline-6.3.8
R-deps: libexecinfo-1.1_3 lsof-4.89.b,8 ncurses-5.9.20141213
WWW:    http://htop.sourceforge.net/

另一方面,quicksearch 目标仅显示有关它找到的匹配项的基本信息:

make quicksearch name=htop
Port:   htop-1.0.3
Path:   /usr/ports/sysutils/htop
Info:   Better top(1) - interactive process viewer

可以组合不同的搜索类型来缩小结果范围。 例如,如果我们要搜索 ntop 网络监视器,我们可能会看到如下所示的结果:

make quicksearch name=ntop
Port:   ntopng-zmq-3.2.3_1
Path:   /usr/ports/devel/ntopng-zmq
Info:   NTOPNG specific ZMQ library

Port:   diveintopython-5.4_1
Path:   /usr/ports/lang/diveintopython
Info:   Free Python tutorial book that is "not For Dummies(tm)"

Port:   ntop-5.0.1_8
Path:   /usr/ports/net/ntop
Info:   Network monitoring tool with command line and web interfaces

Port:   ntopng-1.2.1_1
Path:   /usr/ports/net/ntopng
Info:   Network monitoring tool with command line and web interfaces

Port:   sntop-1.4.3_1
Path:   /usr/ports/net/sntop
Info:   Monitor status of network nodes using fping

在这里,我们可以看到大部分结果都与ntop有关,但我们也有一本关于学习Python的书。 我们可以通过添加路径规范来进一步过滤:

make quicksearch name=ntop path=/net
Port:   ntop-5.0.1_8
Path:   /usr/ports/net/ntop
Info:   Network monitoring tool with command line and web interfaces

Port:   ntopng-1.2.1_1
Path:   /usr/ports/net/ntopng
Info:   Network monitoring tool with command line and web interfaces

Port:   sntop-1.4.3_1
Path:   /usr/ports/net/sntop
Info:   Monitor status of network nodes using fping

我们还可以通过几种不同的方式修改搜索行为。 一些有效的修饰符是:

  • icase:将此设置为“1”以打开不区分大小写。 这是默认设置。 要使搜索区分大小写,请将其设置为“0”。
  • display:这包含一个字段列表,用逗号分隔,显示在输出中。
  • keylim:将搜索(使用“key”搜索类型)限制为仅显示那些字段。 通过将其设置为“1”来打开它。

例如,我们可以通过键入以下内容来搜索包含大写字符串“Paste”的描述或路径:

make search key=Paste display=path,info keylim=1 icase=0
Path:   /usr/ports/devel/pear-SebastianBergmann_PHPCPD
Info:   Copy/Paste Detector (CPD) for PHP code

Path:   /usr/ports/devel/py-zope.copypastemove
Info:   Copy, Paste, and Move support for content components

Path:   /usr/ports/german/bsdpaste
Info:   Pastebin web application to upload and read text on a webserver

Path:   /usr/ports/www/p5-WWW-Pastebin-PastebinCom-Create
Info:   Paste to http://pastebin.com from Perl

Path:   /usr/ports/www/p5-WebService-NoPaste
Info:   Pastebin web application to upload snippets of text

Path:   /usr/ports/www/py-django-dpaste
Info:   Pastebin Django application that powers dpaste.de

Path:   /usr/ports/www/wgetpaste
Info:   Paste to several pastebin services via bash script

您在搜索中可能遇到的另一种情况是端口已被移动或删除。 这些结果如下所示:

make quicksearch name=wget
. . .

Port:   ftp/emacs-wget
Moved:
Date:   2011-05-02
Reason: Has expired: Upstream disappeared and distfile is no longer available

Port:   ftp/wgetpro
Moved:
Date:   2011-10-14
Reason: Vulnerable since 2004-12-14

Port:   www/wget4web
Moved:
Date:   2012-01-01
Reason: Has expired: Depends on expired www/apache13

如果端口已移动到新位置,“已移动”字段将包含可以找到该端口的新位置。 如果此字段存在但为空,则端口已被删除。

即使这些已被删除,它们仍会显示在您的搜索结果中。 如果您希望阻止移动或删除的端口出现,您可以将 PORTSEARCH_MOVED 环境变量设置为“0”。

例如,要仅为后面的命令将此变量设置为“0”,使用默认的 tcsh,我们可以键入:

env PORTSEARCH_MOVED=0 make quicksearch name=wget
Port:   gwget-1.0.4_9
Path:   /usr/ports/ftp/gwget
Info:   GNOME wget front-end

Port:   wget-1.16
Path:   /usr/ports/ftp/wget
Info:   Retrieve files from the Net via HTTP(S) and FTP

Port:   ruby20-ruby-wgettsv-0.95
Path:   /usr/ports/www/ruby-wgettsv
Info:   Collect WWW resources and generate TSV data

Port:   wgetpaste-2.25
Path:   /usr/ports/www/wgetpaste
Info:   Paste to several pastebin services via bash script

如您所见,所有已移动或删除的条目现在都从我们的结果中过滤掉了。 如果您希望将此设置为默认行为,您可以在 make.conf 文件中设置 PORTSEARCH_MOVED=0

sudo sh -c 'echo "PORTSEARCH_MOVED=0" >> /etc/make.conf'

使用 Make 安装端口

找到要安装的端口后,您可以轻松下载所需文件,构建二进制文件,然后使用 make 命令进行安装。

要安装端口,请切换到端口树中的端口目录。 您可以通过上面给出的任何搜索方法找到此位置。 为了演示这一点,我们将安装一个名为 portmaster 的端口,我们将在本指南的后面部分使用它。

首先,更改为端口位置。 portmaster 端口保留在 ports-mgmt 类别中:

cd /usr/ports/ports-mgmt/portmaster

现在,我们可以使用 make 目标轻松下载、配置、编译和安装端口。 由于这些操作会影响我们的系统,我们需要使用 sudo。 要做到这一点,很长的路要走,像这样单独调用 make。 暂时不要输入这些命令,我们将立即向您展示一个更短的版本:

sudo make config
sudo make fetch
sudo make checksum
sudo make depends
sudo make extract
sudo make patch
sudo make configure
sudo make build
sudo make install

我们 可以 通过在单个 make 命令之后列出每个目标来缩短这一点,如下所示:

sudo make config fetch checksum depends extract patch configure build install

然而,这几乎总是不必要的。 上面列出的每个目标都将调用完成任务所需的任何前面的目标。 所以上面的内容可以简单地浓缩为:

sudo make install

通常,我们希望稍微扩展此命令链,以确保我们正确配置了所有内容。 我们通常希望在 install 目标之前指定 config-recursive,这是上述管道中没有的选项,以便在安装开始时处理此端口和任何依赖项的配置。 否则,构建过程可能会停止并在构建必要依赖项的过程中等待用户输入。

我们通常还希望在安装后进行一些清理以回收磁盘空间并保持系统清洁。 我们可以使用 cleandistclean 目标来做到这一点。 clean 目标删除用于构建此端口和任何依赖端口的提取源代码。 distclean 目标也执行此操作,但还会从 /usr/ports/distfiles 目录中删除此包的压缩源存档。

所以一个典型的安装命令可能是这样的:

sudo make config-recursive install distclean

这将提示您在流程开始时配置端口和任何依赖项。 之后它将下载并验证源存档的完整性。 然后它将更改上下文以完成任何缺少的依赖项。 该过程完成后,它将返回相关端口,提取存档,应用任何必要的补丁,并根据您选择的选项进行配置。 然后它将编译应用程序并将其安装在您的系统上。 之后,它将删除此端口的扩展源代码和任何依赖项。 然后它将删除此端口的源存档。

/usr/ports/ports-mgmt/portmaster目录下执行上面的命令:

sudo make config-recursive install distclean

您将看到该应用程序的单个对话框。 如果您使用列出的 shell 之一,则可以在此处选择为该工具配置 shell 完成:

portmaster 端口没有任何依赖关系,但如果有,依赖关系的配置选项将直接在上述目标端口的配置之后呈现。 该端口将被下载、配置和安装。

如果您使用默认的 tcsh,则需要在每次安装后重新扫描 PATH,以便您的 shell 环境知道所有已安装的应用程序:

rehash

如果上述过程成功,则您已成功安装第一个端口。

虽然主要操作系统和配置在常规位置完成,但通过端口系统安装的可选软件安装在 /usr/local 层次结构中。

这意味着要配置可选软件,您必须查看 /usr/local/etc 目录。 可执行文件本身主要保存在 /usr/local/bin/usr/local/sbin 目录中。 在配置或启动应用程序时请记住这一点。

关于作为服务运行的应用程序的注意事项

要记住的一件事是,如果您正在安装一个将作为服务运行的端口,安装过程将不会自动启动该服务。 事实上,为了在 FreeBSD 中启动服务,您必须采取一些步骤。

如果您希望一次性启动一项服务,您可以输入:

sudo service servicename onestart

例如,要启动 MySQL,您可以键入:

sudo service mysql-server onestart

假设所有必要的配置都已完成,这将启动一次服务。 如果您想稍后停止该服务,您可以键入:

sudo service mysql-server onestop

虽然这适用于快速测试,但它并不是在 FreeBSD 中管理服务的理想方式。 要将服务配置为在每次启动时启动,您必须启用它。 为此,您必须在 /etc/rc.conf 文件中添加一行。

指定如何启动可选服务的初始化文件保存在 /usr/local/etc/rc.d 目录中。 在每个 init 文件中,一个名为 rcvar 的变量告诉 init 系统在 /etc/rc.conf 文件中查找哪个变量以确定是否启动服务。 对于每个可选服务,您可以通过键入以下内容找到要添加到 /etc/rc.conf 文件中的相应行:

grep rcvar /usr/local/etc/rc.d/*

您将收到如下所示的列表:

/usr/local/etc/rc.d/avahi-daemon:rcvar=avahi_daemon_enable
/usr/local/etc/rc.d/avahi-dnsconfd:rcvar=avahi_dnsconfd_enable
/usr/local/etc/rc.d/dbus:rcvar=dbus_enable
/usr/local/etc/rc.d/rsyncd:rcvar=rsyncd_enable

输出中突出显示的部分显示了我们需要设置为“YES”以启用这些服务的变量。

例如,要启用 rsync 守护程序服务,我们可以将这一行添加到 /etc/rc.conf

rsyncd_enable="YES"

在使用正常的服务管理命令之前,必须在 /etc/rc.conf 文件中包含相应的行。 例如,您可以使用文本编辑器或键入以下命令将上述行添加到 /etc/rc.conf 文件的底部:

sudo sh -c "echo 'rsyncd_enable="YES"' >> /etc/rc.conf"

这将导致 rsync 守护程序在每次启动时启动。 您现在可以使用不带“one”前缀的 service 命令控制服务。 例如,您可以通过键入以下内容来启动服务:

sudo service rsyncd start

您可以通过键入以下内容再次停止服务:

sudo service rsyncd stop

移除已安装的端口

如果您安装了不再需要的端口,则可以使用类似但更直接的过程从系统中删除应用程序。

我们可以使用 deinstall 目标从我们的系统中删除应用程序。 再次,切换到与您要删除的应用程序关联的端口树中的目录:

cd /usr/ports/ports-mgmt/portmaster

您可以通过键入以下内容从系统中删除应用程序:

sudo make deinstall

如果您还想删除为此端口配置的选项,可以键入:

sudo make rmconfig

要删除此端口及其所有依赖项的配置选项,请键入:

sudo make rmconfig-recursive

如果您使用上述命令删除了 portmaster,请键入以下命令重新安装:

sudo make reinstall distclean

更新应用程序

既然您知道如何安装或删除程序,我们应该演示如何使您的应用程序保持最新。

检查更新文件的重要更新说明

在本指南的开头,我们在使用 portsnap 刷新端口树之前保存了 /usr/ports/UPDATING 文件的时间戳。

/usr/ports/UPDATING 文件包含来自端口维护者的关于更新和更改的重要说明,这些更新和更改可能需要管理员执行额外的手动步骤。 未能在更新应用程序之前阅读此文件并应用其建议可能会使您的系统处于不可用状态或影响应用程序的功能。

首先,检查我们保存到主目录中文件的时间戳:

cat ~/last_update
  File: "/usr/ports/UPDATING"
  Size: 375337       FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (    0/    root)  Gid: (    0/   wheel)
Device: 0,81   Inode: 2011338    Links: 1
Access: Thu Dec 11 22:24:59 2014
Modify: Thu Dec 11 15:40:12 2014
Change: Thu Dec 11 22:24:59 2014

请记住,“Modify”时间戳表示我们系统上的 UPDATING 文件上次被端口维护者修改的时间,“Change”时间戳表示我们上次同步的时间。 上面的信息是旧的时间戳。 从这些信息中我们可以看出,我们需要注意从 12 月 11 日到当前日期的任何条目。

现在打开刷新的 UPDATING 文件:

less /usr/ports/UPDATING

该文件看起来与此有些相似:

This file documents some of the problems you may encounter when upgrading
your ports.  We try our best to minimize these disruptions, but sometimes
they are unavoidable.

You should get into the habit of checking this file for changes each time
you update your ports collection, before attempting any port upgrades.

20150101:
  AFFECTS: users of net/unison and net/unison-nox11
  AUTHOR: madpilot@FreeBSD.org

  Unison has been upgraded to version 2.48, which uses a different wire
  protocol than 2.40 did.  In order to support synchronization with
  other computers where Unison is still at version 2.40, a new port
  net/unison240 has been created.  It provides unison240 and if that is
  GTK2-enabled, also unison240-text.  This unison240 port can be
  installed in parallel with the existing net/unison port.

20141230:
  AFFECTS: users of deskutils/xpad
  AUTHOR: jgh@FreeBSD.org

  deskutils/xpad has been moved to deskutils/xpad3, since 4.x has been around
  for a while.

  Should you wish to stick with legacy branch at this time;

  # portmaster -o deskutils/xpad deskutils/xpad3

. . .

此文件包含自 2008 年以来每个可用端口的所有潜在重大更改。 您只需注意以下注意事项:

  • 自上次更新端口以来已添加
  • 涉及您在系统上安装的端口

因此,对于这个例子,我们只需要注意自 12 月 11 日以来添加的涉及我们已安装端口的通知。 如果您不知道系统上安装了哪些端口,可以使用 portmaster 创建完整列表:

portmaster -l
===>>> Root ports (No dependencies, not depended on)
===>>> dialog4ports-0.1.5_2
===>>> pkg-1.4.0
===>>> pkgconf-0.9.7
===>>> portmaster-3.17.7
===>>> rsync-3.1.1_3
===>>> 5 root ports

===>>> Trunk ports (No dependencies, are depended on)
===>>> ca_root_nss-3.17.3_1
===>>> expat-2.1.0_2

. . .

输出将根据它们的依赖关系分为多个部分。 使用此信息检查更新说明。

如果需要任何手动步骤,请在继续进行其余更新之前完成这些步骤。

检查已知漏洞

更新时要记住的另一个考虑因素是系统上安装的软件是否存在任何已知的安全漏洞。

FreeBSD 维护了一个漏洞数据库,您可以检查它以查看您的任何端口或软件包是否存在安全问题。 此功能包含在 pkg 工具中。 通过键入以下内容运行安全审核:

sudo pkg audit -F

这将从 FreeBSD 项目的服务器下载最新版本的漏洞数据库。 然后它将检查所有已安装端口或软件包的版本,并将它们与安全数据库中的条目进行比较。

如果您系统上安装的任何端口或软件包在数据库中存在已知漏洞,您将收到警报。 通常,这些将至少有一个可用的最新端口来修补问题。

下面,我们将讨论如何更新系统上的所有端口或仅更新一个子集。 无论您的更新策略如何,您至少必须更新具有已知安全漏洞的端口。

更新已安装的端口

在您完成更新文件中列出的任何手动步骤后,您可以更新您的软件。

要查看哪些端口有可用的更新,您可以使用带有 -L 标志的 portmaster 命令:

portmaster -L
===>>> Root ports (No dependencies, not depended on)
===>>> dialog4ports-0.1.5_2
===>>> pkg-1.4.0
        ===>>> New version available: pkg-1.4.3
===>>> pkgconf-0.9.7
===>>> portmaster-3.17.7
===>>> rsync-3.1.1_3
===>>> 5 root ports

===>>> Trunk ports (No dependencies, are depended on)
===>>> ca_root_nss-3.17.3_1
===>>> expat-2.1.0_2

. . .

===>>> 44 total installed ports
        ===>>> 4 have new versions available

这提供了与我们之前使用的选项的小写变体类似的输出,但它也会检查可用更新。 在这里,我们可以看到 pkg 端口有一个新版本可用。 我们可以看到共有 4 个端口有新版本可用。

要升级单个端口,您可以转到端口树中的端口目录位置并重新安装新版本的软件:

sudo make deinstall reinstall

您也可以使用 portmaster 命令完成相同的操作。 您必须提供类别和端口名称。 例如,要升级 wget 命令,我们可以输入:

sudo portmaster ftp/wget

上述命令也可用于安装端口。 许多来自其他背景的用户发现 portmaster 是比使用我们上面概述的 make 目标更熟悉的软件管理体验。

虽然可以独立升级端口,但通常最好一次更新所有软件。 您可以使用 -a 标志对 portmaster 执行此操作:

sudo portmaster -a

这会将系统上的所有端口更新到最新版本。 任何新的配置选项都将在流程开始时呈现给您。 如果您有任何使用 pkg 安装的软件包,并且可以通过 ports 系统获得较新版本,这些软件包也将被更新并转换到 ports。

结论

到现在为止,您应该已经很好地掌握了如何在 FreeBSD 系统上使用端口。 端口非常灵活,让您可以轻松地自定义服务器上的大多数应用程序。

许多管理员欢迎在编译时间和增强控制之间进行权衡,但您的需求可能会有所不同。 但是,无论您在 FreeBSD 上的软件策略如何,了解 ports 系统都是一项不错的投资。 有时关键更新可能还没有可用的软件包,并且由于许可限制,某些软件无法以打包格式分发。 无论您的偏好如何,这些情况都需要使用端口。