24.2. FreeBSD 更新

及时应用安全补丁和升级到新版本的操作系统是持续系统管理的重要方面。FreeBSD 包括一个叫做 freebsd-update 的工具,可以用来执行这两项任务。

这个工具支持 FreeBSD 的二进制安全和勘误更新, 而不需要手动编译和安装补丁或新内核。二进制更新适用于目前安全团队所支持的所有架构和版本。支持的版本列表和它们的预计终结日期列在 https://www.FreeBSD.org/security/open in new window

这个工具也支持操作系统升级到次要的点版本,以及升级到另一个发布分支。在升级到一个新的版本之前,请查看其发布公告,因为它包含了与该版本有关的重要信息。发布公告可从 https://www.FreeBSD.org/releases/open in new window

备注

如果存在一个利用 freebsd-update(8)open in new window 功能的 crontab(5)open in new window ,在升级操作系统之前必须禁用它。

本节描述了freebsd-update使用的配置文件,演示了如何应用安全补丁以及如何升级到一个次要或主要的操作系统版本,并讨论了升级操作系统时的一些注意事项。

24.2.1. 配置文件

freebsd-update 的默认配置文件按原样工作。一些用户可能希望对 /etc/freebsd-update.conf 中的默认配置进行调整,以便更好的控制这个过程。该文件中的注释解释了可用的选项,但是以下内容可能需要更多的解释。

# Components of the base system which should be kept updated.
Components world kernel

这个参数控制 FreeBSD 的哪些部分会被保持在最新状态。默认情况是更新整个基础系统和内核。也可以指定个别组件, 例如 src/basesrc/sys。然而,最好的选择是保持默认,因为改变它以包括特定的项目需要列出每个需要的项目。随着时间的推移,这可能会产生灾难性的后果,因为源代码和二进制文件可能变得不同步。

# Paths which start with anything matching an entry in an IgnorePaths
# statement will be ignored.
IgnorePaths /boot/kernel/linker.hints

要想在更新过程中不触动指定的目录,例如 /bin* 或 /sbin,可以在该语句中添加它们的路径。这个选项可以用来防止 freebsd-update 覆盖本地的修改。

# Paths which start with anything matching an entry in an UpdateIfUnmodified
# statement will only be updated if the contents of the file have not been
# modified by the user (unless changes are merged; see below).
UpdateIfUnmodified /etc/ /var/ /root/ /.cshrc /.profile

这个选项将只更新指定目录中未修改的配置文件。用户所做的任何修改都会阻止这些文件的自动更新。还有一个选项,KeepModifiedMetadata,它将指示 freebsd-update 在合并过程中保存更改。

# When upgrading to a new FreeBSD release, files which match MergeChanges
# will have any local changes merged into the version from the new release.
MergeChanges /etc/ /var/named/etc/ /boot/device.hints

带有配置文件的目录列表,freebsd-update 应该尝试合并这些文件。文件合并过程是一系列类似于 mergemaster(8)open in new windowdiff(1)open in new window 补丁,但选项较少。合并后要么接受,要么打开一个编辑器,要么导致 freebsd-update 中止。如果有疑问,可以备份 /etc 并接受合并。关于 mergemaster 的更多信息,见mergemaster(8)open in new window

# Directory in which to store downloaded updates and temporary
# files used by FreeBSD Update.
# WorkDir /var/db/freebsd-update

这个目录是放置所有修补程序和临时文件的地方。在用户进行版本升级的情况下,这个位置应该至少有一千兆字节的可用磁盘空间。

# When upgrading between releases, should the list of Components be
# read strictly (StrictComponents yes) or merely as a list of components
# which *might* be installed of which FreeBSD Update should figure out
# which actually are installed and upgrade those (StrictComponents no)?
# StrictComponents no

当这个选项设置为 "是"时,freebsd-update 将认为组件列表是完整的,并且不会尝试在列表之外进行修改。实际上,freebsd-update 将尝试更新属于组件列表的每个文件。

24.2.2. 应用安全补丁

应用 FreeBSD 安全补丁的过程被简化了, 使得管理员能够使用 freebsd-update 来保持系统的完整补丁。更多关于 FreeBSD 安全公告open in new window的信息可以在 FreeBSD 安全公告中找到。

FreeBSD 的安全补丁可以通过下列命令来下载和安装。第一条命令将确定是否有任何未完成的补丁, 如果有的话, 将列出在应用补丁时将被修改的文件。第二条命令将应用这些补丁。

# freebsd-update fetch
# freebsd-update install

如果更新应用了任何内核补丁,系统将需要重启,以便启动到打了补丁的内核。如果该补丁应用于任何正在运行的二进制文件,受影响的应用程序应该被重新启动,以便使用二进制文件的补丁版本。

备注

通常情况下,用户需要准备好重启系统。要知道系统是否因为内核更新而需要重启,执行命令 freebsd-version -k 和 uname -r。如果输出结果不同,就重新启动系统。

可以通过在 /etc/crontab 中添加这个条目,将系统配置为每天自动检查一次更新。

@daily

如果存在补丁,它们将被自动下载,但不会被应用。根用户将被发送一封电子邮件,这样就可以通过freebsd-update install来查看和手动安装补丁。

如果出了什么问题,freebsd-updat 有能力通过下面的命令回滚上一组修改。

# freebsd-update rollback
Uninstalling updates... done.

同样,如果内核或任何内核模块被修改,系统应该被重新启动,任何受影响的二进制文件也应该被重新启动。

只有 GENERIC 内核可以被 freebsd-update 自动更新。如果安装的是自定义内核,那么在 freebsd-update 完成安装更新后,必须重新建立并重新安装。默认的内核名称是 GENERIC。uname(1)open in new window命令可以用来验证它的安装。

备注

在 /boot/GENERIC 中始终保留一份 GENERIC 内核的副本。它在诊断各种问题和进行版本升级时都会有帮助。请参阅 FreeBSD 9.X 及更高版本的自定义内核open in new window 以了解如何获得 GENERIC 内核的副本。

除非 /etc/freebsd-update.conf 中的默认配置被改变,否则 freebsd-update 将和其他的更新一起安装更新的内核源。重建和重新安装一个新的自定义内核可以按照常规方法进行。

由 freebsd-update 发布的更新并不总是涉及内核。如果内核源没有被 freebsd-update 安装修改,就没有必要重建一个自定义的内核。然而,freebsd-update 会一直更新 /usr/src/sys/conf/newvers.sh。当前的补丁级别,由 uname -r 报告的 -p 数字表示,可以从这个文件中获得。重建一个自定义的内核,即使没有其他变化,也可以让 uname 准确地报告系统的当前补丁级别。这在维护多个系统时特别有帮助,因为它可以快速评估每个系统中安装的更新。