引言

在管理 FreeBSD 服务器时,了解有助于保持系统良好状态的基本维护过程非常重要。

在本指南中,我们将介绍保持服务器最新和正常运行所需的基本流程。 我们将讨论如何更新 FreeBSD 团队维护的基本操作系统。 我们还将讨论如何更新和维护通过端口或包系统安装的可选软件。

如果你需要帮助才能开始使用 FreeBSD,请按照我们的指南。

更新基本 FreeBSD 操作系统

在使用 FreeBSD 时需要意识到的一件重要事情是,基本操作系统的构建和管理是与系统上的其他软件分开的。 这提供了许多好处,并允许 FreeBSD 团队仔细测试和开发系统的核心功能。

注意: 在继续之前,请阅读本节底部关于当前更新过程中的错误的说明。

当您开始使用服务器时,很有可能安全更新已经发布到基本系统。 要查询 FreeBSD 项目的服务器以获得这些更新,请下载任何新文件,并将其安装到您的系统中,输入以下命令:

sudo freebsd-update fetch install

如果您正在安装 DigitalOcean FreeBSD,默认情况下包含 sudo。 如果您正在使用另一个平台,您可能需要通过端口系统或包安装 sudo,或者通过 su 安装 root。

Freebsd-update 命令是基本操作系统中软件的管理工具。 Fetch 子命令下载任何新的更新,而 install 子命令将它们应用于实时系统。

如果有更新,您将看到受更新影响的软件列表。 你可以使用向下箭头滚动页面,或者使用空格键滚动页面。 一旦你到达列表的底部,更新将被应用。

任何经过更新的长时间运行的软件都需要重新启动才能使用新版本。 如果您看到内核有任何更新,将需要重新引导以防止奇怪的行为。 你可以通过输入:

sudo shutdown -r now

重要提示: 更新过程中的 Bug

目前,有一个上游的错误与 FreeBSD 更新程序正在这里工作。 这个 bug 导致在更新过程之后系统挂起重新启动。

处理这种情况有两种方法,第二种方法在大多数情况下是首选的。

第一种方法是使用 DigitalOcean 控制面板简单地强制电源循环到服务器。 这将导致服务器重新启动,但是当您重新启动时,它将使用更新后的环境。

一个更安全的替代方法是在更新之前禁用文件系统上的软更新或软更新日志记录。 软更新是这个问题的核心,所以这将防止重启挂起。 这是一个更为广泛的过程,并且会为将来磁盘所需的任何恢复增加一些时间(直到重新启用这些特性)。

要做到这一点,在你应用任何更新之前,启动到单用户模式:

sudo nextboot -o "-s" -k kernel
sudo reboot

接下来,进入液滴的 DigitalOcean 控制面板,点击“控制台访问”按钮进入网络控制台。 当引导结束时按“回车”以获得一个救援 shell 会话。 从这里,您可以关闭软更新或软更新日志。

要完全禁用软更新,输入:

tunefs -n disable /

如果您希望禁用软更新日志,这是一个不那么严重的折衷方案,您可以使用以下命令:

tunefs -j disable /

一旦完成,你可以重新启动服务器,再次以全多用户模式重新启动:

reboot

引导完成后,您可以使用上述过程获取并应用 FreeBSD 更新,而无需挂起重启。

我们建议您密切关注 bug 报告,以便在上游修复程序可用时恢复这些更改。

自动更新检查

通过设置 cron 作业,可以配置您的系统每天自动检查这些安全补丁。 Freebsd-update 实用程序有一个特殊的 cron 子命令,可以专门用于此目的。

这将暂停一段随机时间(最多一个小时) ,以便将负载分散到下载服务器上。 然后它会检查更新并下载它们(基本上就是后台的提取操作)。 如果下载了更新,将通知指定的用户帐户。 不会自动安装更新,以便管理员可以决定适当的时间。

要设置这个自动检查,使用 sudo 特权编辑 / etc / crontab 文件:

sudo vi /etc/crontab

在文件的底部,添加一行,如下所示:

@daily root freebsd-update -t freebsd cron

上面的命令将作为 root 用户自动运行 update 命令。 如果找到更新,则会通知 -t 组件后指定的用户帐户。 在上面的示例中,将通知缺省的 freebsd 用户。

完成后保存并关闭文件。

下次你登录 freebsd 帐户时,你可以通过输入以下命令来检查你的邮件:

mail

如果更新被下载,你会看到这样的东西:

Mail version 8.1 6/6/93.  Type ? for help.
"/var/mail/freebsd": 1 message 1 new
>N  1 [email protected]       Thu Dec 18 21:45 209/3997  "freebsdserver security updates"
&

您可以通过键入与通知相关的消息编号来查看更新列表:

1

当你对将要更改的软件感到满意时,你可以通过输入以下命令快速安装更新:

sudo freebsd-update install

记住,如果应用了任何内核补丁,就重新启动计算机,并重新启动受到更新影响的任何服务。

同步操作系统资源

您可能时不时想要完成的一项任务是将 FreeBSD 源代码的一个副本同步到您的系统。 出于各种原因,这是有用的。 有些端口需要正确地构建当前源代码,还可以使用源代码开始跟踪到新的软件分支。

Freebsd 源代码维护在一个 SVN 存储库中。 如果您只需要源代码的最新版本,而不需要 subversion 带来的大量开销,那么您可以使用一个名为 svnup 的实用程序来同步当前源代码。 这比使用 subversion 本身要快得多。

你可以通过输入以下命令安装 svnup 包:

sudo pkg install svnup

如果你喜欢使用端口,你可以通过输入:

cd /usr/ports/net/svnup
sudo make config-recursive install clean

一旦你有了这个工具,我们应该稍微调整一下配置文件。 使用文本编辑器中的 sudo 特权打开它:

sudo vi /usr/local/etc/svnup.conf

首先,我们需要从列表中选择一个镜像。 配置文件中有多个主机行,所有这些行都被注释掉了。 选择一个你认为可能接近你的,并取消注释:

. . .
[defaults]
work_directory=/var/tmp/svnup
#host=svn.freebsd.org
#host=svn0.us-west.freebsd.org
host=svn0.us-east.freebsd.org
#host=svn0.eu.freebsd.org

. . .

接下来,您应该确保描述每个 SVN 分支的文件部分都引用了您正在使用的发行版本。 你可以通过在命令行输入下面的命令来找到你的版本:

freebsd-version
10.1-RELEASE-p2

这将告诉我们操作系统的分支以及最后的系统补丁级别。 我们当前要注意的部分是第一个破折号前面的数字。 在这种情况下,它指定为10.1。 Release 意味着我们目前正在跟踪发布分支,它是 FreeBSD 可用的最稳定的分支。

回到文件中,确保[ release ]下的 branch 参数定义指向这个数字:

. . .

[release]
branch=base/releng/10.1
target=/usr/src

. . .

这将确保您正在下载正确的源文件。完成后保存并关闭该文件。

现在,由于我们正在跟踪发布分支,我们可以输入:

sudo svnup release

这将把源代码树的最新版本下载到 / usr / src。 您可以通过重新运行这个命令随时更新它。

如果您需要这个能力,可以在源代码上运行 subversion 命令,那么您必须下载 subversion 工具。 你可以通过输入以下命令来安装包:

sudo pkg install subversion

如果你喜欢使用端口,你可以通过输入:

cd /usr/ports/devel/subversion
sudo make config-recursive install clean

使用 subversion 命令将花费更多的时间。 它不仅会下载树中每个文件的当前版本,还会下载整个项目的历史记录。

如果你已经使用 svnup 工具同步了源代码,你需要在使用 subversion 检查源代码之前删除源代码树:

sudo rm -rf /usr/src

关于如何使用 subversion 的详细说明超出了本指南的范围。 但是,通常的想法是针对某个 FreeBSD 源镜像上的某个分支发出 checkout 命令。

例如,要检查与上面使用 svnup 命令完全相同的源代码,我们可以输入如下命令:

sudo svn checkout https://svn0.us-east.FreeBSD.org/base/releng/10.1 /usr/src

注意,这个命令的 URL 基本上只是我们在 svnup 配置文件中看到的主机和分支定义的组合。

更新系统的可选软件记录

Freebsd 提供两种不同的格式在服务器上安装附加软件。 第一个是名为“ ports”的基于源代码的系统,第二个是基于可用端口的预编译包存储库。 对于驻留在基本操作系统之外的软件,可以使用许多其他工具进行管理。

系统保存有关可以安装在 / usr / ports 目录层次结构中的端口的信息。 这个目录结构称为“端口树”。 在接触任何端口之前,我们应该确保端口树包含有关可用软件的最新信息。 我们可以使用 portsnap 命令来做到这一点。

Portsnap 命令的语法在某些方面反映了 freebsd-update 命令的语法。 在 DigitalOcean 上,源树将预先填充有关可用端口的初始信息,您可以根据第二个 portsnap 命令更新这些信息。

如果您没有使用 DigitalOcean,那么您的 / usr / ports 目录在刚开始使用时很可能是空的。 如果是这种情况,第一次使用 portsnap 时,应该使用 extract:

sudo portsnap fetch extract

这将获取一个完整的端口树并将其提取到 / usr / port 中。 这可能需要一段时间,而且只有在 / usr / port 中没有任何信息的情况下才是必要的。

要更新系统关于可用端口的信息(以后每次运行端口) ,输入:

sudo portsnap fetch update

这个过程可能会花费一些时间,具体取决于您上次更新端口树的时间。 它必须为每一个可用的软件下载相当数量的文件,这些软件自上次运行以来已经被修改过。 这将用有关端口的信息填充 / usr / ports 层次结构。

Pkg 包装系统也可以利用其中的一些信息。 但是,它也维护自己的数据库,以跟踪可用于安装的预构建的二进制包。 要更新这个,你可以输入:

sudo pkg update

这将从 FreeBSD 项目的服务器获取最新的包数据库信息。 值得注意的是,对于许多 pkg 操作,pkg 更新是作为命令执行的一部分自动执行的,因此并不总是需要作为一个独立的命令。

更新可选软件

到目前为止,我们已经学习了如何更新基本操作系统并应用更新。 我们还学习了如何更新我们的操作系统源代码,以及如何更新我们关于可用 Ports 的本地信息。

现在,我们可以使用这个更新的软件信息下载和应用更新到我们的可选软件。 根据使用的是端口还是包,流程将有所不同。 如果您使用的是这两者的混合物,那么您可能需要处理一些流程。

找出哪些软件可以更新

更新软件的第一步是找出哪些应用程序有新版本可用。 我们可以用几种不同的方法来做到这一点。

使用 pkg 命令检查更新

如果您想比较您在系统上安装的软件与最新版本的更新信息,您可以使用 pkg 的版本子命令。 这将向您显示已安装的版本,并可以有选择地显示有关可用版本的信息。

值得注意的是,这个命令将显示通过这两个 Ports 安装的可选软件。 此命令不区分安装源,因此它能够准确地显示系统上可用的所有更新。

我们可以通过输入以下命令来查看我们的软件是否是最新的:

pkg version -vIL=

如果在最新的索引文件中有对任何软件新版本的引用(前面通过 portsnap 命令下载) ,输出将显示差异。 例如:

perl5-5.18.4_10                    <   needs updating (index has 5.18.4_11)

因为我们正在检查我们系统上安装的软件和端口树中最新的索引文件,有时候你会在端口树中有还没有到达包的更新时检查这一点。 这是因为软件包是从端口树构建的,而且通常不得不稍微落后一些。

由于这种可能性,上面的命令可能显示尚未作为包实际可用的更新。 要发现这些实例,可以将上面命令的输出与下面命令的输出进行比较:

pkg version -vRL=

该命令检查 pkg 系统数据库中可用包的新版本(而不是端口树中的索引文件)。 如果这两个命令产生相同的输出,那么您将能够使用 pkg 系统更新任何包。

如果第一个命令中的更新没有显示在第二个命令中,这意味着更改还没有打包。 如果您使用的软件包需要更新,您可以等到软件包赶上来,或者您可以切换到端口现在获得最新的更新。

使用 Portmaster 检查更新

如果您经常选择使用端口系统从源代码构建软件,那么一个有吸引力的替代方案是 portmaster 命令。 这个工具对于 FreeBSD 上任何基于端口的软件管理任务都很有用,从检查和应用更新,到安装或删除端口及其所有依赖项。

要获得 portmaster 命令,您可以安装这个包,或者从端口系统编译它。

要安装软件包,输入:

sudo pkg install portmaster

如果你想从源代码中编译这个工具,切换到端口树中包的目录并使用 make 安装它:

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

在安装时,您可能会看到一条关于向 / etc / make 添加一些信息的消息。 文件和转换您的包数据库。 如果你是从 FreeBSD 10.1或更高版本开始的话,这是不必要的。

一旦你安装了 portmaster,你可以通过输入:

portmaster -L

这将检查系统上安装的所有软件,并将其与索引文件进行比较,以查看是否有新版本可用。 这与 pkg 命令的操作方式相同,因为它将显示更新,而不管软件是使用端口还是包安装的。 它根据软件在依赖性方面与其他软件的连接方式对软件进行分类。

任何有更新的软件都会有这样一个缩进的行:

===>>> perl5-5.18.4_10
        ===>>> New version available: perl5-5.18.4_11

在底部,一个摘要行将描述可以更新的应用程序的数量:

===>>> 42 total installed ports
        ===>>> 1 has a new version available

由于 portmaster 主要使用端口,所有检测到的更新都应该对应用程序可用。

检查软件漏洞

Freebsd 维护一个漏洞数据库,应该定期检查这个漏洞数据库,以确保您安装在系统上的软件没有漏洞。

虽然更新系统上的所有软件有时是有益的,但至少,任何已知漏洞的软件都应该尽早更新。 若要检查系统上安装的任何可选软件的已知漏洞,请键入:

pkg audit -F

这将从 FreeBSD 服务器下载最新的漏洞数据库,并将其与系统上安装的软件进行比对。 如果您安装的软件存在任何漏洞,它会提醒您。

查阅最新资料

在更新任何软件之前,必须检查更新可能导致的任何中断。 Freebsd 端口维护人员有时必须进行一些更改,如果没有用户的干预,这些更改就不能被干净地应用。 如果您没有检查这些情况,您可能最终以非工作的软件和潜在的破坏系统。

在 / usr / ports 目录中,一个名为 UPDATING 的文件包含有关可能产生意外结果的任何软件更新的信息。 要读取这个文件,输入:

less /usr/ports/UPDATING

这个简单的文本文件将包含任何需要额外注意的更新信息,不管软件是否安装。 每个条目都将标记引用的更新提交到端口树的日期。 另一件需要注意的事情是,该文件包含的更新信息可以追溯到2008年。 这个文件看起来像这样:

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.

20141208:
  AFFECTS: users of ports-mgmt/poudriere, ports-mgmt/poudriere-devel
  AUTHOR: [email protected]

  8.4 jails created with Poudriere 3.1, or poudriere-devel-3.0.99.20141117
  should be recreated with 'jail -d' and 'jail -c'. This fixes pkg(8)
  crashes.

20141205:
  AFFECTS: users of polish/kadu
  AUTHOR: [email protected]

  Before running kadu 1.x for the first time upstream developers
  advise to backup your ~/.kadu directory.

. . .

您应该检查此文件中是否有自上次更新以来添加的任何更新问题。 由于这个文件包含大量与您正在考虑的更新无关的信息,要么是因为它涉及到系统上没有安装的软件,要么是因为它详细说明了上一次更新中的一个问题,您通常只需检查文件顶部附近的条目。

如果在升级之前有任何额外的步骤需要执行,那么现在就完成它们。

更新包和端口

在执行升级文件中建议的任何操作之后,您现在应该准备好更新软件了。 我们使用的方法将取决于您是否希望为您的软件使用预编译的包或基于源代码的端口。

如果你主要使用软件包,并希望使用这种格式升级,你可以使用 pkg 升级命令:

sudo pkg upgrade

这应该提供升级所有有可用更新的包。

关于这个方法需要注意的一点是,如果您正在混合使用包和端口,包更新可能会尝试重新安装您使用端口系统构建的软件。 当您使用不同的选项编译应用程序时,可能会发生这种情况,需要不同依赖项的选定自定义等等。

这个场景看起来是这样的:

[email protected]:~ % sudo pkg upgrade
Updating FreeBSD repository catalogue...
FreeBSD repository is up-to-date.
All repositories are up-to-date.
Updating database digests format: 100%
Checking for upgrades (2 candidates): 100%
Processing candidates (2 candidates): 100%
The following 1 packages will be affected (of 0 checked):

Installed packages to be REINSTALLED:
        portmaster-3.17.7 (options changed)

The operation will free 1 KB.
40 KB to be downloaded.

Proceed with this action? [y/N]:

在这种情况下,portmaster 命令是通过 ports 系统安装的,但是 pkg 试图使其与它所知道的版本保持一致。 如果您希望保留您的定制端口版本,您可以按“ n”进行此操作,然后通过输入以下命令锁定包:

sudo pkg lock portmaster

这将阻止软件升级,允许您使用 pkg 升级命令升级其余的软件。 当你想升级锁定的软件时,你可以通过输入以下命令来暂时解锁:

sudo pkg unlock portmaster

如果你主要使用端口和端口来处理你的软件包,你可以通过输入:

sudo portmaster -a

您将被要求为您正在升级的端口选择选项。 如果您不知道任何选项的含义,或者您没有任何特定的理由进行选择,那么使用默认值是可以的。

如果在升级软件包之前使用 portmaster,由于端口和软件包升级之间的延迟,以前使用软件包安装的一些软件现在可能会使用端口进行升级。 如果这对你来说不是问题,请随意使用这个方法。 如果您更愿意坚持使用软件包,那么最好等到更新被重新打包。

如果你想要更新你的软件包,你也可以通过在端口树中指定它的类别和名称来升级一个特定的软件包:

sudo portmaster category/portname

例如,要升级 vim-lite 端口,可以发出以下命令:

sudo portmaster editors/vim-lite

总结

正如您所看到的,为了维护 FreeBSD 服务器,需要执行许多不同的进程。

其中一些,如更新基础系统源代码的过程,不需要频繁运行,而其他任务,如更新基础操作系统和更新任何具有已知漏洞的软件,应该经常完成。 维护您的系统一开始可能看起来很复杂,但是当您熟悉了您正在使用的工具后,它将变得相当直接。

要了解更多关于如何使用软件包的信息,请点击这个链接。 要更好地了解如何使用端口,请遵循以下指南。