FreeBSD 5.4-STABLE 迁移指南

The FreeBSD Release Engineering Team

$FreeBSD: src/release/doc/zh_CN.GB2312/early-adopter/article.sgml,v 1.1 2004/10/15 06:43:44 delphij Exp $

FreeBSD is a registered trademark of the FreeBSD Foundation.

Apple, FireWire, Mac, Macintosh, Mac OS, Quicktime, and TrueType are trademarks of Apple Computer, Inc., registered in the United States and other countries.

IBM, AIX, EtherJet, Netfinity, OS/2, PowerPC, PS/2, S/390, and ThinkPad are trademarks of International Business Machines Corporation in the United States, other countries, or both.

IEEE, POSIX, and 802 are registered trademarks of Institute of Electrical and Electronics Engineers, Inc. in the United States.

Intel, Celeron, EtherExpress, i386, i486, Itanium, Pentium, and Xeon are trademarks or registered trademarks of Intel Corporation or its subsidiaries in the United States and other countries.

Microsoft, IntelliMouse, MS-DOS, Outlook, Windows, Windows Media and Windows NT are either registered trademarks or trademarks of Microsoft Corporation in the United States and/or other countries.

Sparc, Sparc64, SPARCEngine, and UltraSPARC are trademarks of SPARC International, Inc in the United States and other countries. Products bearing SPARC trademarks are based upon architecture developed by Sun Microsystems, Inc.

Many of the designations used by manufacturers and sellers to distinguish their products are claimed as trademarks. Where those designations appear in this document, and the FreeBSD Project was aware of the trademark claim, the designations have been followed by the ``™'' or the ``®'' symbol.

这篇文章从用户或管理员的视角描述了 FreeBSD 4.X 和 FreeBSD 5.3-RELEASE 的主要区别, 并给出了针对现有系统的升级方案。 它对 FreeBSD 的发行版制作工程进行了介绍, 随后描述了一些 FreeBSD 5.X 的新特性, 以及熟悉 4.X 系列发行版本的用户应关注的一些变化。 这篇文章同时分别描述了对现有系统基于预编译发行包以及源代码的升级过程。 这篇文章在较早的 FreeBSD 5.X 版本中被称为 ``Early Adopters Guide''。


1 介绍

FreeBSD 5.3-RELEASE 标志着新的 ``FreeBSD-STABLE'' 系列发行版的开始。 这个版本以及其后的 5.X 系列版本主要面向生产环境中的使用, 类似之前 4.X 系列发行版那样。

这篇文章介绍了一系列从 4.X 升级到 5.3-RELEASE 的用户会感兴趣的问题。 它首先介绍了目前的发布工程实践, 随后描述了一些 FreeBSD 5.X 系列的新特性。 最重要的, 这篇文章列举了所进行的重大修改, 用户可见的行为变化, 或修改的外部软件接口。 最后是一些通过源代码或预编译包将现有的 FreeBSD 4.X 升级到 FreeBSD 5.3-RELEASE 需要注意的问题。


2 FreeBSD 发布流程概览

FreeBSD 采用了一种依赖于代码库中多个分支的开发模式。 主分支被称为 ``CURRENT'', 在 CVS 代码库中记为 HEAD。 新的特性首先被提交到这个分支; 虽然 CURRENT 是最先看到新功能的分支, 它也因此偶尔会在调试新功能时存在问题。

绝大多数 FreeBSD 发行版本来自一个或多个 ``STABLE'' 分支。 新功能加入到 CURRENT 一段时间之后才会合并到这些分支。 在过去两年中, 唯一处于持续开发中的 STABLE 分支是 ``4-STABLE'', 所有的 FreeBSD 4.X 发行版本都基于它。 这个分支在 CVS 代码库中的 tag 是 RELENG_4

过去的两个 STABLE 分支 (3-STABLE 和 4-STABLE) 是在它们开发周期非常早的时候创建的 (相应的分支起点是 3.1 和 4.0)。 现在看来, 这样的方法没有在创建新的分支时为相应的 CURRENT 分支留出足够的时间来变得稳定。 因而, 这导致了时间被浪费在不同分支之间移植对错误的修正上, 并产生了一些完全无法在分支间移植的架构变动。

5.X 系列发行版对此作了略有不同的处理。 FreeBSD 5.0, 5.1, 以及 5.2 都基于 CURRENT 分支。 第一个发行版是在进行了两年的开发之后发布的 (在此之前, 最后一个来自 HEAD 的发行版是 FreeBSD 4.0, 在 2000 年 3 月发布)。

与之前的 ``STABLE'' 分支不同, CVS 中的 ``5-STABLE'' 分支 (分支 tag RELENG_5) 是在第一个 5.X 发行版发布一年多之后才建立的 (具体而言, 是在 5.3 发行版本的发布工程中)。 这个延期给了开发团队时间来完成必要的架构修改, 使系统更加稳定, 完善各式各样的接口, 以及为后续的 5.X 版本打下良好的基础。

除了一般的改进和错误修正之外, 5-STABLE 分支的一项优先考虑的目标是保持应用二进制接口 (ABI) 和应用编程接口 (API) 的兼容性。 任何可能破坏向前兼容性 (包括内核或库接口) 的修改都是被强烈反对的, 只有当这是解决某个重大问题的最后办法时, 才可能被允许。

下一个 CURRENT 分支的发行版应该是 6.0-RELEASE, 它将从 CVS HEAD 构建。 对于 6.0 没有确定的发布日期, 这一点同 5.3 不同, 不过尽管如此, 应该是 2006 年的某个时候。

在 4-STABLE 开发分支上还将进行一些有限的开发, 并且有计划在 5.3-RELEASE 之后的某个时候推出它的下一个版本 (4.11)。 对于那些非常保守的用户, 继续使用一段时间的 4.X 版本可能看起来更为合理一些。 Security Officer Team 将按照他们公布的方针继续支持 4-STABLE 一段时间, 您可以在 FreeBSD 网站的 安全主页 找到相关信息。

关于 FreeBSD 发布工程过程的进一步详情可以在 Release Engineering 主页``FreeBSD 发布工程'' 一文中找到。


3 新特性

FreeBSD 5.X 最吸引人的地方就是一系列全新的功能, 这些功能基本上都和无法移植回 FreeBSD 4-STABLE 开发分支的那些大幅度的架构调整有关。 (与此相反, 许多独立的改进, 例如新的设备驱动或对于一些用户级应用的更新等, 则已经移植回去了。) 这里是一份简明的列表, 它并不包含全部内容:

更详细的新功能列表可以在 FreeBSD 5.X 的发行版发布说明中找到。


4 值得注意的变化

一些 FreeBSD 4.X 到 5.X 的变化需要给予特别的关注, 因为它们涉及到了主要的架构变动, 或在某些方面破坏了向下兼容性。 尽管这些变动通常不会造成数据丢失, 但是它可能会给那些不太注意的人带来困惑。 最明显的例子包括:

更详细的资料可以在 FreeBSD 5.X 发行版本的发布说明, 以及 FreeBSD 源代码中的 src/UPDATING 中找到。 重要的 FreeBSD Ports Collection 变动会在 ports/UPDATINGports/CHANGES 两个文件中列出并说明。


5 从 FreeBSD 4.X 升级需要注意的事项

对于那些使用现有的 FreeBSD 系统的用户, 这一节提供了一些将现有的 FreeBSD 4.X 系统升级到 5.X 的说明。 同任何 FreeBSD 升级一样, 阅读发布说明以及那个版本的发行版勘误, 以及在源代码升级时阅读 src/UPDATING 文件都是至关重要的。


5.1 使用预编译的版本升级

``备份全部数据, 重新格式化, 重新安装, 然后恢复用户数据'' 可能是最为简单的升级方式。 这会消除任何不兼容或由于过时的可执行文件和配置文件的污染造成的问题。 这也使得您能够创建新的文件系统并利用它们的提供的功能 (最值得关注的是默认的 UFS2)。

撰写本文时, sysinstall(8) 中使用预编译版本升级的选项还没有针对跨主要版本的升级进行严格的测试。 不推荐您使用这个功能。

一些变化对于那些使用软盘引导和安装 FreeBSD 4.X 的用户来说相当振奋人心。 安装软盘 (当然是在支持它们的平台上, 例如 i386), 在组织结构上与过去相比作了大幅度改进。 在 4.X 版本中, 软盘中包含一个只提供了足以将系统安装上的功能的内核。 这个设计使得内河能够放在一张软盘之内, 但缺少了某些硬件配置所需要的设备驱动程序。 从 FreeBSD 5.3-RELEASE 开始, 安装软盘中也采用了标准的 GENERIC 内核, 它被切分成多个片断放在多张软盘上, 引导加载器会在需要时提示插入需要的其他磁盘。 下载软盘镜像的用户 (可能准备进行网络安装) 需要注意启动软盘现在变成了三张: boot.flpkern1.flp, 以及 kern2.flp

在 i386 架构上的 CDROM 现在采用了 ``no-emulation'' 引导加载器。 除了其他好处之外, 这样使得直接使用 GENERIC 内核而不是先前版本中软盘镜像的那个削减过的内核成为可能。 一般来说, 能够从 Microsoft Windows NT® 4, Windows 2000, 或 Windows XP 安装 CDROM 的机器应该能够正确使用 FreeBSD 5.X CDROM。


5.2 源代码升级

注意: 许多用户和开发人员会觉得备份全部数据和配置文件 (这是预防任何意外的好习惯), 完成使用预编译版本的升级, (例如从 CDROM), 然后恢复数据是一种更方便的做法。 与源代码升级相比, 这种方式不需要处理磁盘上遗留的文件, 并使得系统能够从新的文件系统, 如 UFS2 中受益。

不熟悉 buildworld/installworld 过程的用户在升级 FreeBSD 的时候 应该尝试源代码升级, 他们应该考虑使用预编译版本的升级。

从源代码升级的过程实际上就是联编一系列源代码并生成本机上的可执行文件。 这一操作是通过 buildworld/installworld 来完成的, 通常被熟练的 FreeBSD 用户用以追踪开发分支 (例如 FreeBSD-STABLE 或者 FreeBSD-CURRENT)。 一般来说, 这一过程要比从预编译的安装包升级麻烦一些, 但对于系统配置文件较为复杂或进行了大量定制的用户可能会比较有用。 源代码升级对于只能从远程操纵服务器的管理员也尤为有用 (因为这种情况无法使用安装介质)。

一定要记得阅读 src/UPDATING。 标题为 ``To upgrade in-place from 4.x-stable to current'' 的部分包含了如何一步一步地进行更新的过程, 必须严格地按照它来操作, 而不要走某些用户偶尔会用的 ``捷径''。 下面是一个带注释的升级步骤概述:

  1. 制作备份。

    这一步的重要性绝不是夸大其辞。 备份所有用户数据和配置文件非常的重要。 通过 dump(8) 进行零级的转储是一个完成这项工作的好办法, 当然, 也还有很多可用的其他方法。

  2. 确保有 30MB 的剩余磁盘空间在 / 文件系统上。

    FreeBSD 5.X 需要使用比 FreeBSD 4.X 更多的磁盘空间。 如果 /tmp 目录是在 / 文件系统上的 (这是非常常见的情况), 删除其中的所有内容将会有助于释放所需的空间。

  3. 如果需要, 修正 /etc/fstab

    这只影响到较老的 FreeBSD/i386 系统。 这些系统采用 MBR-风格的磁盘 slice, FreeBSD 过去支持 ``兼容 slices'', 也就是可以使用形如 /dev/ad0a 的名字 (而不明确指定 slice 的名字)。 这一特性不再被支持了; 磁盘分区的名字必须符合类似 /dev/ad0s1a 的样子。 换言之, 现在磁盘分区必须明确指定磁盘设备、 slice 号, 以及分区字母。

    请注意 ``兼容 slices'' 从 FreeBSD 2.2.6-RELEASE 开始已经不是默认的了。 这一内容也不适用于 FreeBSD/alpha, 或使用 ``危险独占 (dangerously dediated)'' 模式。

  4. 使用 cvs(1) 或其他等价的工具来获取 FreeBSD 基本系统源代码的副本 (src/ 模块)。 要从 CVS 代码库提取 5.3-RELEASE, 使用 RELENG_5_3_0_RELEASE tag。 如果想得到 5.3 发行版和安全分支的更新, 使用 RELENG_5_3 tag。 要是用 FreeBSD 5-STABLE 开发分支, 则应采用 RELENG_5 分支 tag。 当使用 CVS 提取代码树时, 使用 CVS 的 -P 参数很有用, 它将自动删除空的目录。

  5. FreeBSD 5.X 需要在系统的口令和用户组描述文件中增加一些新的项, 以适应各种系统服务的需要。 这些应该使用:

    # mergemaster -p
    

    来安装。 这一步骤是必须的, 它将确保系统中有所需的用户和组身份。

    注意在 FreeBSD 5.X 中, nologin(8) 工具的位置从 /sbin/nologin 变成了 /usr/sbin/nologin。 由于许多伪用户使用 nologin(8) 作为它们的登录 shell, 这一变动需要对 /etc/passwd 进行更多的修改。

  6. 联编整个系统所需的执行文件和库:

    # cd /usr/src
    # make buildworld
    

    如果 CPUTYPE/etc/make.conf 中进行了定义, 则应采用 ?= 操作符, 这样 buildworld 过程能够在需要时采用其他设置。

    注意 MAKEOBJDIRPREFIX 绝对 不能够/etc/make.conf 中定义。

    基本上, 绝大多数 /etc/make.conf 中定义的 ``开关'' 都应被注释掉或删除。 特别是可能会影响 FreeBSD 联编或基本操作的那些, 例如 NO_TOOLCHAIN

  7. 使用下面的命令联编并安装新的内核:

    # make buildkernel
    

    注意您必须使用 buildkernel make(1) 对象来确保编译的内核采用了上面 buildworld 过程中生成的编译工具。 手工使用 config(8) 来创建内核联编区域并尝试联编它可能会不正常。

    虽然联编 (以及在安装之后) 一个定制的内核是可行的, 但使用 GENERIC 内核并随后安装定制的内核配置能够规避风险。 当尝试首次定制内核时, 强烈建议采用 FreeBSD 5.XGENERIC 作为模板, 因为大量的设备和选项和 4.X 中有相当大的不同。 在配置文件中加入 COMPAT_FREEBSD4 对于成功的升级至关重要。

  8. 使用下面的命令为 ISA 设备配置设备线索文件。 您需要使用适当的硬件架构名称 (例如 i386) 来换掉 MACHINE

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

    虽然说空的设备线索文件对于现代的硬件应该是足够了, ISA 线索对于适用定制的 ISA 非PNP卡 (可能还需要定制的线索) 来说仍然是需要的, 特别是那些没有采用 PNPBIOS 的系统, 或者软驱无法配合 PNPBIOS 系统正常工作的机器上。

  9. 用下面的命令安装新内核:

    # make installkernel
    

    请注意尽管 FreeBSD 4.X 内核默认会安装成 /kernel, FreeBSD 5.X 的内核会安装到 /boot/kernel/kernel。 在 4.X 中内核模块一般是安装到 /modules 目录, 而在 5.X 中它们会被安装到 /boot/kernel

  10. 使用下面的命令来安装 FreeBSD 5.X 引导加载器:

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

    虽然这一步是可选的, 但强烈建议您这么做。

  11. 禁用第三方模块 (例如用于 VMware 的那些) 以避免由于内核 ABIs 或其他不兼容所造成的崩溃。

  12. 重新引导进入单用户模式。 此时必须重新启动, 因为新的内核是运行新联编好的应用程序所必须的。 在单用户模式能够极大地减少在其他程序正在运行的同时进行升级所可能带来的问题。

  13. 用下面的命令来挂接需要的文件系统:

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

    请注意执行 fsck(8) 是升级到 FreeBSD 5.X 所必须的步骤, 它将修改磁盘的超级块中的统计数据。 如果系统时钟使用的是本地时间而非 UTC 时间, 您还需要执行:

    # adjkerntz -i
    

    这一步中, 您可能会在控制台上看到这样的信息 (会有很多次):

    WARNING: userland calling deprecated sysctl, please rebuild world
    

    您可以简单地忽略它们。

  14. 使用下面的命令删除 C++ 头文件:

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

    这将防止以后的编译过程错误地使用 GCC 2.95 C++ 编译器附带的旧的头文件。

  15. 安装新的可执行文件和库以及其他数据:

    # cd /usr/src
    # make installworld
    
  16. 在运行 named(8) 的系统上, 它的配置文件需要挪到 /var/named chroot(8) 区域中。 如果在 /var/named 中有有用的文件, 则应该进行备份。

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

    如果配置中使用了生成的 localhost 文件, 需要用下面的命令来重新生成它们:

    # cd /var/named/etc/namedb
    # /bin/sh make-localhost
    # rm -f localhost-v6.rev localhost.rev
    
  17. 运行下面的命令更新系统配置文件:

    # mergemaster -i
    

    这步不是可选的。 必须让 /etc 中的启动脚本和配置文件与新的内核及用户执行文件匹配。

    在执行了 mergemaster(8) 之后, 最好是看一看 (并适当地修改) /etc/rc.conf。 这个文件中所定义的许多变量的默认值发生了变化; 特别是许多在 4.X 中默认开启的服务在 5.X 中不再默认开启了。

  18. 删除遗留的 BIND 8 文件:

    # rm /usr/bin/dnskeygen /usr/bin/dnsquery
    # rm /usr/libexec/named-xfer
    # rm /usr/sbin/named.restart /usr/sbin/ndc
    
  19. 重新启动。

升级了基本系统之后, 您通常还需要升级一些非基本系统的组件才能够完全使系统恢复正常。 Perl 现在不再是基本系统的一部分了, 需要从 Ports Collection (具体来说, lang/perl5.8 port) 或 package 安装。 安装之后, 所有依赖 Perl 的应用程序都应重新安装。

运行 FreeBSD 4.X 的可执行文件需要一系列兼容库。 它们可以通过使用 misc/compat4x package/port 来安装。

就像前一节中所提到的那样, Xorg 是系统中默认的 X Window System 实现。 Ports Collection (以及 packages) 都可能会依赖它。 要将现有的窗口系统从 XFree86 转到 Xorg, 请参考 FreeBSD 手册中的 安装 X11 一节。


6 总结

这篇文档介绍了 FreeBSD 5.X 中最值得注意的新特性, 并列举了一些在升级现有的 FreeBSD 4.X 系统时需要注意的问题。 它还展示了两组升级方法, 一种是从安装介质中使用预编译的版本, 而另一种则是从源代码重新编译整个基本系统。

备注

[1]

应当说明的是在 i386 和 pc98 上执行 a.out 格式的可执行文件仍然可以通过 COMPAT_AOUT 内核选项来支持。 Ports Collection 中的某些编译器 (例如, lang/gcc28) 仍然能够生成 a.out 格式的可执行文件。


这份文档,以及其他与FreeBSD发行版本有关的文档,都可以在 http://www.FreeBSD.org/snapshots/下载。

在遇到关于FreeBSD的技术问题时,请首先阅读 文档 之后再考虑联系 <questions@FreeBSD.org>。

所有 FreeBSD 5-STABLE 的用户都应该订阅 <stable@FreeBSD.org> 邮件列表。

关于这份文档的任何问题,请致信 <doc@FreeBSD.org>。