> For the complete documentation index, see [llms.txt](https://book.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://book.bsdcn.org/release/freebsd-5.4-release/5.4-migration-guide.md).

# FreeBSD 5.4-RELEASE 迁移指南

**The FreeBSD Release Engineering Team**

版权所有 © 2002, 2003, 2004, 2005 The FreeBSD Release Engineering Team

```ini
$FreeBSD: src/release/doc/en_US.ISO8859-1/early-adopter/article.sgml,v 1.21.2.7 2005/03/25 15:53:33 bmah Exp $
```

FreeBSD 是 FreeBSD 基金会的注册商标。

Apple、FireWire、Mac、Macintosh、Mac OS、Quicktime 和 TrueType 是 Apple Computer, Inc. 在美国及其他国家注册的商标。

IBM、AIX、EtherJet、Netfinity、OS/2、PowerPC、PS/2、S/390 和 ThinkPad 是 International Business Machines Corporation 在美国、其他国家或同时在美国及其他国家的商标。

IEEE、POSIX 和 802 是 Institute of Electrical and Electronics Engineers, Inc. 在美国的注册商标。

Intel、Celeron、EtherExpress、i386、i486、Itanium、Pentium 和 Xeon 是 Intel Corporation 或其子公司在美国及其他国家的商标或注册商标。

Microsoft、IntelliMouse、MS-DOS、Outlook、Windows、Windows Media 和 Windows NT 是 Microsoft Corporation 在美国和/或其他国家的注册商标或商标。

Sparc、Sparc64、SPARCEngine 和 UltraSPARC 是 SPARC International, Inc 在美国及其他国家的商标。带有 SPARC 商标的产品基于 Sun Microsystems, Inc. 开发的架构。

许多制造商和销售商用于区分其产品的名称被主张为商标。在本文件中出现这些名称时，如果 FreeBSD 项目知道该商标的主张，就会在名称后附上“™”或“®”符号。

> **摘要**
>
> 本文从升级现有系统的用户或管理员的视角，描述了 FreeBSD 4.X 与 FreeBSD 5.4-RELEASE 之间的主要差异。文章简要概述了 FreeBSD 的发布工程过程，然后描述了 FreeBSD 5.X 中的一些新功能，以及对于习惯于使用 4.X 系列发行版的用户而言可能特别值得关注的一些变化。本文还描述了现有系统的基于二进制和基于源代码的升级过程。本文的早期版本曾出现在先前的 FreeBSD 5.X 发行版中。在 FreeBSD 5.3-RELEASE 之前，本文曾被称为“早期采用者指南”。

## 1 引言

FreeBSD 5.4-RELEASE 是“FreeBSD-STABLE”系列发行版中的最新版本。本版本以及未来 5.X 系列的发行版均定位于生产环境使用，与先前的 4.X 系列发行版定位相同。

本文讨论了从 4.X 发行版升级到 5.4-RELEASE 的用户感兴趣的诸多主题和问题。它首先简要概述当前的发布工程实践，然后描述 FreeBSD 5.X 系列中可用的一些新功能。或许最重要的章节列出了发生重大变化、用户可见行为发生改变或外部软件接口被修改的问题。最后是关于将现有 FreeBSD 4.X 系统升级到 FreeBSD 5.4-RELEASE 的一些说明，包括从二进制或从源代码升级。

## 2 FreeBSD 发布过程概述

FreeBSD 采用的开发模型依赖源代码仓库中的多个分支。主分支称为“CURRENT”，在 CVS 仓库中用 `HEAD` 标签引用。新功能首先提交到此分支；尽管 CURRENT 最先获得新功能，但随着新功能的添加和调试，它偶尔也会出现故障。

大多数 FreeBSD 发行版是从若干“STABLE”分支之一制作的。功能只有在 CURRENT 中经过一定数量的测试后才会被添加到这些分支。在过去两年中，唯一活跃开发的 STABLE 分支被称为“4-STABLE”，所有 FreeBSD 4.X 发行版都基于它。该分支在 CVS 仓库中的标签为 `RELENG_4`。

过去的两个稳定分支（3-STABLE 和 4-STABLE）在它们的开发周期早期就被创建了（它们的分支点分别是 3.1 和 4.0）。事后看来，这种做法在创建新分支之前没有给 CURRENT 留出足够的稳定时间。这反过来导致在分支之间移植错误修复时浪费精力，以及一些无法在分支之间移植的架构性变更。

5.X 发行版的处理方式略有不同。FreeBSD 5.0、5.1 和 5.2 基于 CURRENT 分支。这些发行版中的第一个是在两年多的开发之后制作的（在此之前，最后一次从 HEAD 制作的发行版是 2000 年 3 月的 FreeBSD 4.0）。

与先前的“STABLE”分支不同，CVS 中的“5-STABLE”分支（分支标签为 `RELENG_5`）是在第一个 5.X 发行版（具体来说是在 5.3 发行周期期间）之后一年多才创建的。这一延迟为开发团队完成所需的架构性变更、稳定系统、确定各种接口以及为剩余的 5.X 发行版创建良好的起点留出了时间。

除了总体改进和错误修复外，5-STABLE 分支上开发的一项主要优先事项是保持应用二进制接口（ABI）和应用程序接口（API）的兼容性。任何可能破坏向后兼容性的变更（包括内核或库接口）都受到强烈反对，除非作为关键问题的最后手段，否则不予允许。

来自 CURRENT 的下一个发行版可能是 6.0-RELEASE，将从 CVS `HEAD` 创建。截至本文撰写时，6.0 没有确定的日期，但预计在 2005 年第三季度的某个时间。未来的发布工程计划要求大约每 18 个月推出一个新主版本，大约每 4 个月推出一个次版本。

4-STABLE 开发分支上计划的最后一个发行版是 4.11-RELEASE，于 2005 年 1 月发布。此时不计划为 4-STABLE 分支添加任何新的主要功能，未来的任何工作可能仅限于错误修复和安全补丁。对于特别保守的用户，继续使用 4.X 发行版一段时间可能是合理的。安全官团队 <security-officer@FreeBSD.org> 将根据其已发布的策略继续支持从 4-STABLE 分支制作的发行版，相关策略可在 FreeBSD 网站上的 [安全页面](http://www.FreeBSD.org/security/index.html) 找到。

有关 FreeBSD 发布工程过程的更多信息，可在 [发布工程网页](http://www.FreeBSD.org/releng/index.html) 和 [“FreeBSD 发布工程”](http://www.FreeBSD.org/doc/en_US.ISO8859-1/articles/releng/index.html) 文章中找到。

## 3 新功能

FreeBSD 5.X 的一大主要吸引力在于许多新功能，这些功能通常涉及无法回移植到 FreeBSD 4-STABLE 开发分支的大型架构性变更。（相比之下，许多自包含的增强功能，例如新设备驱动程序或用户空间工具的更新，已经被回移植。）一份简短但并非详尽无遗的列表包括：

* **SMPng**：对称多处理器（SMP）机器的“下一代”支持。正在进行的工作旨在对各种内核子系统执行细粒度加锁，以增加可在内核中运行的执行线程数量。特别关注网络栈和存储驱动程序的性能。
* **KSE**：内核调度实体允许单个进程拥有多个内核级线程，类似于调度器激活。`libpthread` 和 `libthr` 线程库使用 [pthread(3)](https://man.freebsd.org/cgi/man.cgi?query=pthread\&sektion=3\&manpath=FreeBSD+5.4-RELEASE) API 向多线程用户空间程序提供此功能。`libpthread` 现在是默认的线程库。
* **新架构**：支持 amd64、ia64、pc98 和 sparc64 架构，以及 i386 和 alpha。其他正在开发中的平台包括 powerpc（可在许多基于 PowerPC® 的 Macintosh® 平台上运行）和 arm。
* **GCC**：编译器工具链现在基于 GCC 3.4.X，而不是 GCC 2.95.X。
* **MAC**：支持可扩展、可加载的强制访问控制策略。
* **GEOM**：用于磁盘 I/O 请求转换的灵活、模块化框架。该系统支持与磁盘和卷相关的许多功能，例如：磁盘分区识别、[gbde(4)](https://man.freebsd.org/cgi/man.cgi?query=gbde\&sektion=4\&manpath=FreeBSD+5.4-RELEASE) 磁盘加密功能、各种级别的 RAID 功能、磁盘设备的网络导出（使用 [ggated(8)](https://man.freebsd.org/cgi/man.cgi?query=ggated\&sektion=8\&manpath=FreeBSD+5.4-RELEASE) 及相关工具）以及透明的磁盘解压缩。geom\_vinum 系统为 VINUM 卷管理器带来了 GEOM 兼容性。
* **FFS**：FFS 文件系统现在支持后台 [fsck(8)](https://man.freebsd.org/cgi/man.cgi?query=fsck\&sektion=8\&manpath=FreeBSD+5.4-RELEASE) 操作（用于更快的崩溃恢复）和文件系统快照。
* **UFS2**：添加了新的 UFS2 磁盘上格式，支持扩展的每文件属性和更大的文件大小。UFS2 现在是 [newfs(8)](https://man.freebsd.org/cgi/man.cgi?query=newfs\&sektion=8\&manpath=FreeBSD+5.4-RELEASE) 的默认格式。在除 pc98 之外的所有平台上，从 [sysinstall(8)](https://man.freebsd.org/cgi/man.cgi?query=sysinstall\&sektion=8\&manpath=FreeBSD+5.4-RELEASE) 中创建的文件系统将默认使用 UFS2。
* **新网络功能**：许多新网络功能在 5.X 发行版中首次亮相，包括对 TCP SACK（选择性确认）的支持、来自 OpenBSD 的 [pf(4)](https://man.freebsd.org/cgi/man.cgi?query=pf\&sektion=4\&manpath=FreeBSD+5.4-RELEASE) 数据包过滤器，以及 ALTQ 数据包排队系统。
* **新硬件支持**：支持更多硬件设备，例如 Cardbus、蓝牙设备，以及基于 Atheros 芯片组的 IEEE 802.11a/b/g 网络接口。此外，在 i386 架构上，某些未被 FreeBSD 驱动程序明确支持的网络设备可以使用 Microsoft® Windows® 的厂商驱动程序和 [ndis(4)](https://man.freebsd.org/cgi/man.cgi?query=ndis\&sektion=4\&manpath=FreeBSD+5.4-RELEASE) 兼容层来支持。

更全面的新功能列表可在各种 FreeBSD 5.X 发行版的发行说明中找到。

## 4 显著变化

FreeBSD 4.X 与 5.X 之间的一些差异值得特别提及，因为它们涉及重大架构变更或以某种方式破坏了向后兼容性。虽然这些变更不太可能导致数据丢失，但可能会给粗心的用户带来一些困惑。一些值得注意的例子包括：

* FreeBSD 基本系统的若干功能已被移至 FreeBSD Ports，通常因为它们以这种形式更易于维护，或者因为它们并非系统的真正必要部分。最明显的例子是 **Perl**（在 FreeBSD Ports 中作为 [lang/perl5.8](http://www.FreeBSD.org/cgi/url.cgi?ports/lang/perl5.8/pkg-descr) 可用），它以前位于基本系统中，使升级变得困难。基本系统中以前依赖 **Perl** 的实用程序已被重写（如果仍然适用）或移除（如果已过时）。

  其他例子包括 **UUCP**（在 Ports 中作为 [net/freebsd-uucp](http://www.FreeBSD.org/cgi/url.cgi?ports/net/freebsd-uucp/pkg-descr) 可用）、`doscmd` 实用程序（[emulators/doscmd](http://www.FreeBSD.org/cgi/url.cgi?ports/emulators/doscmd/pkg-descr)）以及许多传统游戏（[games/freebsd-games](http://www.FreeBSD.org/cgi/url.cgi?ports/games/freebsd-games/pkg-descr)）。
* 内核数据结构和 ABI/API 的变更意味着许多第三方二进制设备驱动程序必须修改后才能在 FreeBSD 5.X 下正常工作。在某些（希望是罕见的）情况下，用户可见的数据结构已发生变更，需要重新编译应用程序或重新安装 ports/软件包。与 4.X 系列一样，FreeBSD 开发团队的目标是不允许 5.X 分支上的未来发行版中出现不兼容的变更。
* 由于基本系统某些部分缺少用户和维护者，它们已陷入失修状态。这些已被移除。例子包括 `a.out` 样式可执行文件的生成[^1]、XNS 网络支持，以及 X-10 控制器驱动程序。一些其他基于旧 ISA 的设备驱动程序被发现无法工作，已被移除。更多详情在发行说明中给出。
* 在 FreeBSD/i386 4.X 上，ISA 设备的配置最初在内核配置中指定。这些可以在引导时通过交互式 **UserConfig** 实用程序进行修改。在 FreeBSD 5.X 上，这两种机制都已被 [device.hints(5)](https://man.freebsd.org/cgi/man.cgi?query=device.hints\&sektion=5\&manpath=FreeBSD+5.4-RELEASE) 机制所取代，该机制消除了在内核中硬编码 ISA 配置参数的需要。引导时的 ISA 配置不再是菜单驱动的，而是通过在引导加载程序命令行提示符下输入新参数来执行。
* `MAKEDEV` 不再可用，也不再需要。FreeBSD 5.X 使用设备文件系统，按需自动创建设备节点。设备文件系统中条目的配置可以使用 [devfs(8)](https://man.freebsd.org/cgi/man.cgi?query=devfs\&sektion=8\&manpath=FreeBSD+5.4-RELEASE) 实用程序或 **/etc/devfs.conf** 机制执行。更多信息可在 [devfs(5)](https://man.freebsd.org/cgi/man.cgi?query=devfs\&sektion=5\&manpath=FreeBSD+5.4-RELEASE) 手册页中找到。
* UFS2 是使用 [newfs(8)](https://man.freebsd.org/cgi/man.cgi?query=newfs\&sektion=8\&manpath=FreeBSD+5.4-RELEASE) 创建的文件系统的默认磁盘上格式。在除 pc98 之外的所有平台上，它也是从 [sysinstall(8)](https://man.freebsd.org/cgi/man.cgi?query=sysinstall\&sektion=8\&manpath=FreeBSD+5.4-RELEASE) 中磁盘标签屏幕创建文件系统的默认格式。由于 FreeBSD 4.X 只理解 UFS1（不理解 UFS2），必须由 5.X 和 4.X 同时访问的磁盘分区必须使用 UFS1 创建。这可以使用 [newfs(8)](https://man.freebsd.org/cgi/man.cgi?query=newfs\&sektion=8\&manpath=FreeBSD+5.4-RELEASE) 的 `-O1` 选项或在 [sysinstall(8)](https://man.freebsd.org/cgi/man.cgi?query=sysinstall\&sektion=8\&manpath=FreeBSD+5.4-RELEASE) 的磁盘标签屏幕上指定。这种情况最常出现在双启动 FreeBSD 4.X 和 FreeBSD 5.X 的单台机器上。请注意，无法在两种磁盘上格式之间进行转换（除了备份、重新创建文件系统和恢复）。
* 由于 **GCC** 编译器的升级，C++ 程序通常需要重新编译和重新安装。这一要求源于 C++ ABI 的变更。
* 运行为 FreeBSD 4.X 编译的可执行文件可能可以借助 `compat4x` 发行版（或等效的 [misc/compat4x](http://www.FreeBSD.org/cgi/url.cgi?ports/misc/compat4x/pkg-descr) 软件包/port）来实现。但是，如果系统上的任何 ports 或软件包需要升级，通常建议重新构建并重新安装系统上*所有*已安装的 ports。这将防止程序与新旧库的某种组合链接时可能发生的问题。[sysutils/portupgrade](http://www.FreeBSD.org/cgi/url.cgi?ports/sysutils/portupgrade/pkg-descr) 实用程序可能对重新安装 ports 有所帮助。

  请注意，无论如何，存在一些已知的向后不兼容情况。例如，由于 `statfs` 结构的变更，[devel/gnomevfs2](http://www.FreeBSD.org/cgi/url.cgi?ports/devel/gnomevfs2/pkg-descr)、[mail/postfix](http://www.FreeBSD.org/cgi/url.cgi?ports/mail/postfix/pkg-descr) 和 [security/cfs](http://www.FreeBSD.org/cgi/url.cgi?ports/security/cfs/pkg-descr) ports 需要重新编译。
* `host.conf` 解析器服务配置文件已被（更通用的）[nsswitch.conf(5)](https://man.freebsd.org/cgi/man.cgi?query=nsswitch.conf\&sektion=5\&manpath=FreeBSD+5.4-RELEASE) 名称服务切换配置机制所取代。
* **BIND** 已从版本 8 更新到版本 9。BIND 8 和 9 之间存在许多差异。拥有重要 [named(8)](https://man.freebsd.org/cgi/man.cgi?query=named\&sektion=8\&manpath=FreeBSD+5.4-RELEASE) 安装的用户应阅读 **/usr/share/doc/bind9/misc/migration** 中的迁移文档。**/usr/share/doc/bind9/arm** 中还有一份新的指令手册。在运行 [named(8)](https://man.freebsd.org/cgi/man.cgi?query=named\&sektion=8\&manpath=FreeBSD+5.4-RELEASE) 的系统上，它现在默认在 [chroot(8)](https://man.freebsd.org/cgi/man.cgi?query=chroot\&sektion=8\&manpath=FreeBSD+5.4-RELEASE) 环境的 **/var/named** 中运行。在 **/var/named** 中有现有 [named(8)](https://man.freebsd.org/cgi/man.cgi?query=named\&sektion=8\&manpath=FreeBSD+5.4-RELEASE) 配置的用户应在升级前备份此目录的内容，以免被 [named(8)](https://man.freebsd.org/cgi/man.cgi?query=named\&sektion=8\&manpath=FreeBSD+5.4-RELEASE) 启动脚本覆盖。
* 从 5.3-RELEASE 开始，X Window System 的 **Xorg** 实现是 FreeBSD 5.X 的默认实现。截至本文撰写时，**XFree86™** 仍然是 FreeBSD 4.X 的默认实现。有关这些版本之间差异的更多信息，以及现有系统的升级信息，可在 FreeBSD Handbook 的 [X Window System](http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/x11.html) 章节中找到。
* 文档（例如 FreeBSD [Handbook](http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/index.html) 和 [FAQ](http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/faq/index.html)）仍在更新中，以反映最近对 FreeBSD 5.X 所做的变更。

更多信息可在各种 FreeBSD 5.X 发行版的发行说明以及 FreeBSD 源代码树中的 **src/UPDATING** 文件中找到。FreeBSD Ports 的显著变更列在 ports 树中的 **ports/UPDATING** 和 **ports/CHANGES** 文件中。

## 5 从 FreeBSD 4.X 升级的说明

对于已有 FreeBSD 系统的用户，本节提供了一些关于将 FreeBSD 4.X 系统升级到 5.X 的说明。与任何 FreeBSD 升级一样，务必阅读相关版本的发行说明和勘误，以及源代码升级情况下的 **src/UPDATING**。

### 5.1 二进制升级

可能最直接的方法是“备份所有内容、重新格式化、重新安装并恢复用户数据”。这消除了不兼容或过时的可执行文件和配置文件污染新系统的问题。它允许创建新的文件系统以利用新功能（最显著的是 UFS2 默认值）。

截至本文撰写时，[sysinstall(8)](https://man.freebsd.org/cgi/man.cgi?query=sysinstall\&sektion=8\&manpath=FreeBSD+5.4-RELEASE) 中的二进制升级选项对于跨主版本的升级尚未经过充分测试。不建议使用此功能。

一些变更可能对习惯于 FreeBSD 4.X 引导介质的用户感兴趣。安装软盘（在支持它们的平台上，如 i386）的组织方式与先前发行版略有不同。在 4.X 发行版上，软盘集包含一个精简的内核，仅具有安装系统所需的功能。这种安排使内核能够装在一张软盘上，但缺少某些硬件配置所需的设备驱动程序。从 FreeBSD 5.3-RELEASE 开始，安装软盘包含跨多张磁盘分段的标准 `GENERIC` 内核，具有更完整的驱动程序和功能集。引导加载程序会根据需要提示插入额外的磁盘。下载软盘镜像的用户（可能是为了执行基于网络的安装）应注意，软盘集现在包括三张磁盘：`boot.flp`、`kern1.flp` 和 `kern2.flp`。

i386 架构的安装 CDROM 现在使用“无仿真”引导加载程序。除其他事项外，这允许使用 `GENERIC` 内核，而不是先前版本中软盘镜像上使用的精简内核。通常，任何能够引导 Microsoft Windows NT® 4、Windows 2000 或 Windows XP 安装 CDROM 的系统都应该能够引导 FreeBSD 5.X CDROM。

CDROM 的布局已从 4.X 系列发生变化。从 5.4-RELEASE 开始，安装镜像和“实时文件系统”现在包含在除 ia64 之外的所有架构的第一张磁盘上（ia64 发行版由于磁盘空间限制使用独立的安装和实时文件系统磁盘）。常见软件包现在包含在发行版的第二张及后续磁盘上。

### 5.2 源代码升级

> **注意：** 许多用户和开发者发现，备份所有数据和配置文件（在任何情况下这都是明智的预防措施）、执行二进制安装（例如从 CDROM）并恢复数据会更容易。与源代码升级相比，二进制升级消除了处理磁盘上遗留文件和程序的需要，并允许系统利用新的文件系统功能，如 UFS2 文件系统布局。
>
> 不熟悉用于从源代码更新 FreeBSD 的 `buildworld`/`installworld` 过程的用户*不*应尝试源代码升级，而应在备份所有数据后执行二进制安装。

基于源代码的升级过程构建并安装一组在本地机器上从源代码编译的二进制文件。它基于 `buildworld`/`installworld` 过程，高级 FreeBSD 用户经常使用此过程跟踪开发分支（例如 FreeBSD-STABLE 或 FreeBSD-CURRENT）的变更。通常，此过程比二进制升级过程涉及更多工作量，但在系统的配置文件复杂或已高度自定义时可能有用。对于管理员有远程控制台访问权限但没有物理访问权限（因此无法插入安装介质）的远程系统，源代码升级也可能有用。

阅读 **src/UPDATING** 是绝对必要的。题为“To upgrade in-place from 4.x-stable to current”的章节包含逐步更新过程，必须严格遵循，不能利用一些用户偶尔使用的“快捷方式”。下面是这些步骤的注释列表：

1. 进行备份。

   此步骤的重要性怎么强调都不为过。备份所有用户数据和配置文件很重要。使用 [dump(8)](https://man.freebsd.org/cgi/man.cgi?query=dump\&sektion=8\&manpath=FreeBSD+5.4-RELEASE) 进行零级转储是执行此操作的好方法，尽管当然有许多可行的替代方案。
2. 确保 **/** 文件系统上有约 30MB 的可用磁盘空间。

   FreeBSD 5.X 比 FreeBSD 4.X 使用更多空间。如果 **/tmp** 目录位于 **/** 文件系统上（通常如此），删除此目录中的所有内容可能有助于释放所需空间。
3. 如有必要，修复 **/etc/fstab**。

   此项可能只影响较旧的 FreeBSD/i386 系统。在使用 MBR 样式磁盘片的系统上，FreeBSD 过去支持“兼容片”，磁盘分区名称可以采用 **/dev/ad0a** 的形式（不显式指定片名称）。这些不再受支持；磁盘分区必须按 **/dev/ad0s1a** 的形式命名。换句话说，磁盘分区现在必须完整指定磁盘设备、片编号和分区字母。

   请注意，自 FreeBSD 2.2.6-RELEASE 以来，默认情况下通常不使用“兼容片”。此项完全不适用于 FreeBSD/alpha，也不适用于使用“危险专用”模式的系统。
4. 使用 [cvs(1)](https://man.freebsd.org/cgi/man.cgi?query=cvs\&sektion=1\&manpath=FreeBSD+5.4-RELEASE) 或其他方式获取 FreeBSD 基本系统源代码（`src/` 模块）的副本。要从 FreeBSD CVS 仓库检出 5.4-RELEASE，请使用 `RELENG_5_4_0_RELEASE` 标签。对于 5.4 发行版和勘误分支，使用 `RELENG_5_4` 标签。要跟踪 FreeBSD 5-STABLE 开发分支，使用 `RELENG_5` 分支标签。使用 CVS 检出源代码树时，向 CVS 传递标志 `-P` 以删除空目录很重要。
5. FreeBSD 5.X 需要在系统密码和组文件中添加一些新条目，对应于各种系统服务。它们应当通过运行以下命令安装：

   ```sh
   # mergemaster -p
   ```

   必须执行此步骤以给某些新文件赋予正确的用户名和组名。

   请注意，在 FreeBSD 5.X 中，[nologin(8)](https://man.freebsd.org/cgi/man.cgi?query=nologin\&sektion=8\&manpath=FreeBSD+5.4-RELEASE) 实用程序的位置已从 **/sbin/nologin** 移至 **/usr/sbin/nologin**。由于许多伪用户将 [nologin(8)](https://man.freebsd.org/cgi/man.cgi?query=nologin\&sektion=8\&manpath=FreeBSD+5.4-RELEASE) 作为其登录 shell，此变更会在 **/etc/passwd** 中产生额外的差异。
6. 使用以下命令构建新用户空间：

   ```sh
   # cd /usr/src
   # make buildworld
   ```

   如果在 **/etc/make.conf** 中定义了 `CPUTYPE`，应当使用 `?=` 运算符定义它，以便 `buildworld` 过程可以在必要时覆盖此变量。

   请注意，`MAKEOBJDIRPREFIX` *不得*在 **/etc/make.conf** 中定义。

   通常，**/etc/make.conf** 中定义的大多数构建“旋钮”应当被注释掉或移除。此声明特别适用于那些直接影响 FreeBSD 构建或基本操作的旋钮，例如 `NO_TOOLCHAIN`。
7. 使用以下命令构建并安装新内核：

   ```sh
   # make buildkernel
   ```

   请注意，必须使用 `buildkernel` [make(1)](https://man.freebsd.org/cgi/man.cgi?query=make\&sektion=1\&manpath=FreeBSD+5.4-RELEASE) 目标，以确保生成的内核使用上述 `buildworld` 步骤中构建的工具链进行编译。手动使用 [config(8)](https://man.freebsd.org/cgi/man.cgi?query=config\&sektion=8\&manpath=FreeBSD+5.4-RELEASE) 设置内核构建区域并尝试构建内核将不起作用。

   尽管此时构建（以及稍后安装）自定义内核是可行的，但使用 `GENERIC` 内核升级并稍后安装自定义内核配置可能更不易出错。当第一次尝试构建自定义内核时，强烈建议使用 FreeBSD 5.X 的 `GENERIC` 内核作为模板，因为自 4.X 以来添加或更改了大量设备和选项。无论如何，包含 `COMPAT_FREEBSD4` 内核配置选项对于成功升级至关重要。
8. 使用以下命令的变体设置 ISA 设备的设备提示文件。用适当的架构名称（例如 `i386`）替换 *MACHINE*。

   ```sh
   # cp sys/MACHINE/conf/GENERIC.hints /boot/device.hints
   ```

   虽然对于现代硬件，空的设备提示文件可能就足够了，但对于具有自定义 ISA 非 PNP 卡的系统（需要自定义提示）、对于非 PNPBIOS 系统，或对于在 PNPBIOS 系统上使软盘正常工作，需要 ISA 提示。
9. 使用以下命令安装新内核：

   ```sh
   # make installkernel
   ```

   请注意，虽然 FreeBSD 4.X 内核默认安装到 **/kernel**，但 FreeBSD 5.X 内核安装到 **/boot/kernel/kernel**。4.X 下的内核模块通常安装到 **/modules** 目录，而 5.X 下它们安装到 **/boot/kernel**。
10. 使用以下命令安装 FreeBSD 5.X 引导加载程序：

    ```sh
    # cd /usr/src/sys/boot
    # make STRIP="" install
    ```

    此步骤虽然是可选的，但强烈建议执行。
11. 禁用第三方模块（例如 VMware 的模块），以防止因内核 ABI 变更或其他不兼容性导致的崩溃。
12. 重新引导至单用户模式。此时必须重新引导，因为必须运行新内核才能安装新用户空间。处于单用户模式将大幅降低升级期间发生意外事件的可能性，因为没有其他程序在运行。
13. 使用以下命令挂载所需的文件系统：

    ```sh
    # fsck -p
    # mount -uw /
    # mount -at ufs
    ```

    请注意，必须调用 [fsck(8)](https://man.freebsd.org/cgi/man.cgi?query=fsck\&sektion=8\&manpath=FreeBSD+5.4-RELEASE) 来更新 FreeBSD 5.X 文件系统超级块中的某些字段。如果系统时钟跟踪本地时间而不是 UTC 时间，还要执行：

    ```sh
    # adjkerntz -i
    ```

    在此步骤期间，控制台上可能会出现以下警告消息（多次）。

    ```sh
    WARNING: userland calling deprecated sysctl, please rebuild world
    ```

    此消息可以安全忽略。
14. 使用以下命令删除 C++ 头文件：

    ```sh
    # rm -rf /usr/include/g++
    ```

    此步骤防止未来的编译意外地引用 GCC 2.95 C++ 编译器的旧头文件。
15. 使用以下命令安装新用户空间实用程序：

    ```sh
    # cd /usr/src
    # make installworld
    ```
16. 在运行 [named(8)](https://man.freebsd.org/cgi/man.cgi?query=named\&sektion=8\&manpath=FreeBSD+5.4-RELEASE) 的系统上，其配置文件需要移动到 **/var/named** 中的 [chroot(8)](https://man.freebsd.org/cgi/man.cgi?query=chroot\&sektion=8\&manpath=FreeBSD+5.4-RELEASE) 区域。如果 **/var/named** 中存在任何文件，此时应当备份它们。

    ```sh
    # cd /etc
    # mv named named.bak
    # mkdir -p /var/named/etc/namedb
    # cp -Rp named.bak/* /var/named/etc/namedb
    ```

    如果配置使用生成的 `localhost` 文件，可能需要以下步骤来重新生成它们：

    ```sh
    # cd /var/named/etc/namedb
    # /bin/sh make-localhost
    # rm -f localhost-v6.rev localhost.rev
    ```

    最后，需要从先前的 **BIND** 中删除两个过时的二进制文件：

    ```sh
    # rm /usr/sbin/nslookup
    # rm /usr/sbin/nsupdate
    ```
17. 通过运行以下命令更新系统配置文件：

    ```sh
    # mergemaster -i
    ```

    此步骤是必需的。它需要使 **/etc** 中的启动和配置文件与新内核和 world 保持一致。

    调用 [mergemaster(8)](https://man.freebsd.org/cgi/man.cgi?query=mergemaster\&sektion=8\&manpath=FreeBSD+5.4-RELEASE) 后，最好检查（可能还要修改）**/etc/rc.conf**。此文件中定义的变量的许多默认值发生了变更；特别是，在 4.X 中默认启用的某些服务现在在 5.X 中默认禁用。
18. 删除遗留的 **BIND 8** 文件：

    ```sh
    # rm /usr/bin/dnskeygen /usr/bin/dnsquery
    # rm /usr/libexec/named-xfer
    # rm /usr/sbin/named.restart /usr/sbin/ndc
    ```
19. 重新引导。

升级基本系统后，通常需要升级一些非基本系统组件以恢复正常功能。**Perl** 不再是基本系统的一部分，应当从 Ports（具体来说是 [lang/perl5.8](http://www.FreeBSD.org/cgi/url.cgi?ports/lang/perl5.8/pkg-descr) port）或从软件包安装。此安装后，所有依赖 **Perl** 的 Ports 和/或软件包都需要重新安装。

运行 FreeBSD 4.X 二进制文件需要一组兼容性库。这些可以通过安装 [misc/compat4x](http://www.FreeBSD.org/cgi/url.cgi?ports/misc/compat4x/pkg-descr) 软件包/port 来获得。

如前所述，**Xorg** 是 X Window System 的默认实现。Ports（以及软件包）依赖此变更来满足依赖关系。要将已安装的窗口系统从 **XFree86** 转换为 **Xorg**，请参阅 FreeBSD Handbook 中的 [安装 X11](http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/x-install.html) 章节。

## 6 总结

本文介绍了 FreeBSD 5.X 中一些较为显著的新功能，并列出了升级现有 FreeBSD 4.X 系统的用户特别关注的一些领域。它还提供了两套升级说明，一套使用安装介质中的二进制文件，另一套基于从源代码重新编译基本系统。

***

***

本文件及其他与发布相关的文档可从 [ftp://ftp.FreeBSD.org/](ftp://ftp.freebsd.org/) 下载。

如有关于 FreeBSD 的问题，请先阅读 [文档](http://www.freebsd.org/docs.html)，再联系 <questions@FreeBSD.org>。

如有关于此文档的问题，请发送电子邮件至 <doc@FreeBSD.org>。

[^1]: 请注意，使用 `COMPAT_AOUT` 内核选项，在 i386 和 pc98 上执行 `a.out` 可执行文件仍然受支持。Ports 中的一些编译器（例如 [lang/gcc28](http://www.FreeBSD.org/cgi/url.cgi?ports/lang/gcc28/pkg-descr)）仍然能够生成 `a.out` 格式的可执行文件。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://book.bsdcn.org/release/freebsd-5.4-release/5.4-migration-guide.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
