旧版 FreeBSD 版本工程

商标

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

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

许多制造商和销售商用来区分其产品的名称被认为是商标。在本文档中出现这些名称时,如果 FreeBSD 项目了解该商标声明,则在这些名称后会加上“™”或“®”符号。

摘要

本文档已过时,不能准确地描述 FreeBSD 版本工程团队目前的发布流程。它被保留用于历史目的。FreeBSD 版本工程团队目前使用的流程可在 FreeBSD 版本工程 文章中找到。

本文档介绍了 FreeBSD 版本工程团队用于发布 FreeBSD 操作系统的生产级版本的方法。它详细介绍了用于官方 FreeBSD 版本的方法,并描述了适用于那些有兴趣为企业部署或商业产品化制作定制 FreeBSD 版本的人员的工具。


1. 简介

FreeBSD 的开发是一个非常开放的流程。FreeBSD 包括来自世界各地成千上万人的贡献。FreeBSD 项目向公众提供 Subversion [1] 访问权限,以便其他人可以访问日志消息、开发分支之间的差异(补丁)以及正式源代码管理提供的其他生产力增强功能。这对于吸引更多有才华的开发人员加入 FreeBSD 帮助很大。但是,我认为每个人都会同意,如果向互联网上的每个人开放对主存储库的写入权限,混乱很快就会出现。因此,只有大约 300 人的“精选”小组获得了对 Subversion 存储库的写入权限。这些 FreeBSD 提交者[2] 通常是完成 FreeBSD 开发大部分工作的人。由开发人员组成的当选 核心团队[3] 为项目提供了一定程度的指导。

FreeBSD 开发的快速步伐使主开发分支不适合公众日常使用。特别是,需要进行稳定化工作才能将开发系统打造成生产级版本。为了解决这种冲突,开发在几个并行轨道上继续进行。主开发分支是我们的 Subversion 树的HEADtrunk,简称为“FreeBSD-CURRENT”或“-CURRENT”。

维护着一组更稳定的分支,简称为“FreeBSD-STABLE”或“-STABLE”。所有分支都位于由 FreeBSD 项目维护的主 Subversion 存储库中。FreeBSD-CURRENT 是 FreeBSD 开发的“最前沿”,所有新更改都首先进入该系统。FreeBSD-STABLE 是从其中进行主要版本发布的开发分支。更改以不同的速度进入该分支,并假定它们已首先进入 FreeBSD-CURRENT,并且已由我们的用户社区进行了彻底测试。

分支名称中的稳定一词是指项目承诺的应用程序二进制接口稳定性。这意味着在同一分支的旧系统上编译的用户应用程序可以在同一分支的新系统上运行。与之前的版本相比,ABI 稳定性有了很大提高。在大多数情况下,来自较旧STABLE 系统的二进制文件可以在较新系统(包括HEAD)上运行,无需修改,假设不使用系统管理接口。

在版本发布之间,FreeBSD 项目构建机器会自动构建每周快照,并可从 https:/download.FreeBSD.org/snapshots/ 下载。二进制发布快照的广泛可用性以及我们的用户社区倾向于使用 Subversion 和“make buildworld”[4] 跟踪 -STABLE 开发,这有助于确保即使在质量保证活动开始之前,FreeBSD-STABLE 处于非常可靠的状态,直到主要版本发布。

除了安装 ISO 快照之外,还提供了每周虚拟机镜像,用于与 VirtualBox、qemu 或其他流行的模拟软件一起使用。虚拟机镜像可以从 https://download.FreeBSD.org/snapshots/VM-IMAGES/ 下载。

虚拟机镜像大小约为 150MB xz(1) 压缩,并在连接到虚拟机时包含 10GB 的稀疏文件系统。

用户在整个发布周期中不断提交错误报告和功能请求。问题报告通过 https://freebsd.ac.cn/support/bugreports/ 提供的 Web 界面输入到我们的 Bugzilla 数据库中。

为了服务我们最保守的用户,在 FreeBSD 4.3 中引入了单独的发布分支。这些发布分支是在最终版本发布之前不久创建的。在发布之后,只有最关键的安全修复程序和新增内容才会合并到发布分支中。除了通过 Subversion 进行源代码更新外,还提供二进制补丁包来更新 releng/X.Y 分支上的系统。

1.1. 本文描述的内容

本文档的以下部分描述了

发行流程

导致实际系统构建的版本工程流程的不同阶段。

发行构建

实际的构建过程。

可扩展性

第三方如何扩展基本发行版。

从 FreeBSD 4.4 中汲取的经验教训

FreeBSD 4.4 发布过程中汲取的一些经验教训。

未来方向

未来开发方向。

2. 发行流程

新的 FreeBSD 版本大约每四个月从 -STABLE 分支发布一次。FreeBSD 发行流程在预计发布日期前 70-80 天开始启动,届时版本工程师会向开发邮件列表发送一封电子邮件,提醒开发人员,他们只有 15 天时间在代码冻结之前集成新更改。在此期间,许多开发人员执行了被称为“MFC 扫描”的操作。

MFC 代表“从 CURRENT 合并”,它描述了将测试后的更改从我们的 -CURRENT 开发分支合并到我们的 -STABLE 分支的过程。项目策略要求所有更改都首先应用于 trunk,并在 -CURRENT 用户进行足够的外部测试后合并到 -STABLE 分支(开发人员预计在提交到 -CURRENT 之前会对更改进行广泛测试,但一个人无法对通用操作系统的所有用法进行测试)。最小的 MFC 期间为 3 天,通常仅用于微不足道的或关键的错误修复。

2.1. 代码审查

在预计发布日期前 60 天,源代码存储库进入“代码冻结”状态。在此期间,对 -STABLE 分支的所有提交都必须获得 版本工程团队 <re@FreeBSD.org> 的批准。批准流程通过预提交钩子在技术上得到执行。在此期间允许的更改类型包括

  • 错误修复。

  • 文档更新。

  • 任何类型的安全相关修复。

  • 对设备驱动程序的微小更改,例如添加新的设备 ID。

  • 来自供应商的驱动程序更新。

  • 版本工程团队认为合理的任何其他更改,考虑到潜在风险。

在代码冻结启动后不久,将构建并发布BETA1 镜像,用于广泛测试。在代码冻结期间,每两周至少发布一个 beta 镜像或候选版本,直到最终版本准备就绪。在最终发布前的几天,版本工程团队将与安全官员团队、文档维护人员和端口维护人员保持持续沟通,以确保所有发布成功所需的组件都可用。

在 BETA 镜像的质量足够令人满意并且没有计划进行重大且可能存在风险的更改后,将创建发布分支,并将候选版本(RC)镜像从发布分支构建,而不是从 STABLE 分支构建 BETA 镜像。此外,将取消对 STABLE 分支的冻结,并将发布分支进入“硬代码冻结”状态,在这种状态下,很难为系统进行新的更改,除非涉及严重的错误修复或安全问题。

2.2. 最终发布清单

当几个 BETA 镜像已用于广泛测试并且所有主要问题都已解决后,最终发布“润色”可以开始。

2.2.1. 创建发布分支

在以下所有示例中,$FSVN 指的是 FreeBSD Subversion 存储库的位置,svn+ssh://svn.FreeBSD.org/base/

Subversion 中的 FreeBSD 分支布局在 提交者指南 中描述。创建分支的第一步是确定要其分支的 stable/X 源代码的修订版。

# svn log -v $FSVN/stable/9

下一步是创建发布分支

# svn cp $FSVN/stable/9@REVISION $FSVN/releng/9.2

可以签出此分支

# svn co $FSVN/releng/9.2 src

创建 releng 分支和 release 标签由 版本工程团队 完成。

FreeBSD Development Branch
FreeBSD 3.x STABLE Branch
FreeBSD 4.x STABLE Branch
FreeBSD 5.x STABLE Branch
FreeBSD 6.x STABLE Branch
FreeBSD 7.x STABLE Branch
FreeBSD 8.x STABLE Branch
FreeBSD 9.x STABLE Branch

2.2.2. 提高版本号

在最终版本可以被标记、构建和发布之前,需要修改以下文件以反映 FreeBSD 的正确版本

  • doc/en_US.ISO8859-1/books/handbook/mirrors/chapter.xml

  • doc/en_US.ISO8859-1/books/porters-handbook/book.xml

  • doc/en_US.ISO8859-1/htdocs/cgi/ports.cgi

  • ports/Tools/scripts/release/config

  • doc/shared/xml/freebsd.ent

  • src/Makefile.inc1

  • src/UPDATING

  • src/gnu/usr.bin/groff/tmac/mdoc.local

  • src/release/Makefile

  • src/release/doc/en_US.ISO8859-1/shared/xml/release.dsl

  • src/release/doc/shared/examples/Makefile.relnotesng

  • src/release/doc/shared/xml/release.ent

  • src/sys/conf/newvers.sh

  • src/sys/sys/param.h

  • src/usr.sbin/pkg_install/add/main.c

  • doc/en_US.ISO8859-1/htdocs/search/opensearch/man.xml

发行说明和勘误文件也需要针对新版本(在发布分支上)进行调整,并在稳定/当前分支上适当地截断

  • src/release/doc/en_US.ISO8859-1/relnotes/common/new.xml

  • src/release/doc/en_US.ISO8859-1/errata/article.xml

Sysinstall 应该更新以说明可用的端口数量以及 Ports Collection 所需的磁盘空间量。 [5] 此信息当前保存在 src/usr.sbin/bsdinstall/dist.c 中。

在构建发行版之后,应更新一些文件以向世界宣布发行版。这些文件相对于 doc/ 版本控制树中的 head/

  • share/images/articles/releng/branches-relengX.pic

  • head/shared/xml/release.ent

  • en_US.ISO8859-1/htdocs/releases/*

  • en_US.ISO8859-1/htdocs/releng/index.xml

  • share/xml/news.xml

此外,更新“BSD 家族树”文件

  • src/shared/misc/bsd-family-tree

2.2.3. 创建发行版标签

当最终发行版准备好时,以下命令将创建 release/9.2.0 标签。

# svn cp $FSVN/releng/9.2 $FSVN/release/9.2.0

文档和 Ports 管理员负责用 tags/RELEASE_9_2_0 标签标记其各自的树。

当使用 Subversion svn cp 命令创建发行版标签时,这将标识特定时间点的源代码。通过创建标签,我们确保未来的发行版构建者始终能够使用我们创建官方 FreeBSD 项目发行版的相同源代码。

3. 发行版构建

任何拥有快速机器和源代码库访问权限的人都可以构建 FreeBSD “发行版”。(这应该是每个人,因为我们提供 Subversion 访问权限!有关详细信息,请参阅手册中的 Subversion 部分。)唯一的特殊要求是 md(4) 设备必须可用。如果该设备未加载到您的内核中,则在引导介质创建阶段执行 mdconfig(8) 时,应自动加载内核模块。构建发行版所需的所有工具都可以在 Subversion 库的 src/release 中找到。这些工具旨在提供一种一致的方式来构建 FreeBSD 发行版。实际上,可以使用单个命令构建完整的发行版,包括创建适用于刻录到 CDROM 或 DVD 的 ISO 映像,以及 FTP 安装目录。release(7) 完整记录了用于构建发行版的 src/release/generate-release.sh 脚本。generate-release.sh 是 Makefile 目标的包装器:make release

3.1. 构建发行版

release(7) 记录了构建 FreeBSD 发行版所需的准确命令。以下命令序列可以构建 9.2.0 发行版

# cd /usr/src/release
# sh generate-release.sh release/9.2.0 /local3/release

运行这些命令后,所有准备好的发行版文件都将位于 /local3/release/R 目录中。

发行版 Makefile 可以细分为几个不同的步骤。

  • 在具有“make installworld”的单独目录层次结构中创建经过清理的系统环境。

  • 从 Subversion 中签出系统源代码、文档和端口的干净版本到发行版构建层次结构中。

  • 在 chrooted 环境中填充 /etc/dev

  • 进入 chrooted 发行版构建层次结构,以使外部环境更难以污染此构建。

  • 在 chrooted 环境中运行 make world

  • 构建 Kerberos 相关的二进制文件。

  • 构建 GENERIC 内核。

  • 创建暂存目录树,用于构建和打包二进制发行版。

  • 构建和安装将文档源代码(SGML)转换为 HTML 和文本文档所需的文档工具链,这些文档将与发行版一起提供。

  • 构建和安装实际文档(用户手册、教程、发行说明、硬件兼容性列表等)。

  • 打包二进制文件和源代码的发行版压缩包。

  • 创建 FTP 安装层次结构。

  • (可选) 为 CDROM/DVD 介质创建 ISO 映像。

有关发行版构建基础结构的更多信息,请参阅 release(7)

/etc/make.conf 中删除所有特定于站点的设置非常重要。例如,分发在 CPUTYPE 设置为特定处理器的系统上构建的二进制文件将是不明智的。

3.2. 贡献软件(“端口”)

FreeBSD Ports 合集 是一个包含超过 36000 个可用于 FreeBSD 的第三方软件包的集合。Ports Management Team <portmgr@FreeBSD.org> 负责维护一致的端口树,该树可用于创建与官方 FreeBSD 发行版一起提供的二进制包。

3.3. 发行版 ISO

从 FreeBSD 4.4 开始,FreeBSD 项目决定发布之前在 BSDi/Wind River Systems/FreeBSD Mall “官方” CDROM 发行版上销售的所有四个 ISO 映像。这四个磁盘中的每一个都必须包含一个 README.TXT 文件,该文件解释磁盘的内容,一个 CDROM.INF 文件,该文件提供磁盘的元数据,以便 bsdinstall(8) 可以验证和使用内容,以及一个 filename.txt 文件,该文件提供磁盘的清单。可以使用以下简单命令创建此清单

/stage/cdrom# find . -type f | sed -e 's/^\.\///' | sort > filename.txt

下面概述了每个 CD 的具体要求。

3.3.1. 磁盘 1

第一个磁盘几乎完全由 make release 创建。对 disc1 目录进行的唯一更改应该是添加一个 tools 目录,以及尽可能多的适合该磁盘的流行第三方软件包。 tools 目录包含允许用户从其他操作系统创建安装软盘的软件。该磁盘应该是可引导的,以便现代 PC 用户无需创建安装软盘。

如果要包含 FreeBSD 的自定义内核,则必须更新 bsdinstall(8)release(7) 以包含安装说明。相关代码包含在 src/releasesrc/usr.sbin/bsdinstall 中。具体来说,文件 src/release/Makefile 以及 dist.cdist.hmenus.cinstall.cMakefile 将需要在 src/usr.sbin/bsdinstall 下更新。您也可以选择更新 bsdinstall.8

3.3.2. 磁盘 2

第二个磁盘也主要由 make release 创建。该磁盘包含一个“实时文件系统”,可以从 bsdinstall(8) 中使用来排查 FreeBSD 安装问题。该磁盘应该是可引导的,还应包含 CVSROOT 目录中 CVS 存储库的压缩副本,以及 commerce 目录中的商业软件演示版。

3.3.3. 多卷支持

Sysinstall 支持多卷软件包安装。这要求每个磁盘都包含一个 INDEX 文件,其中包含一组所有卷上的所有软件包,以及一个额外的字段,该字段指示特定软件包位于哪个卷上。该组中的每个卷还必须在 cdrom.inf 文件中设置 CD_VOLUME 变量,以便 bsdinstall 可以识别哪个卷是哪个卷。当用户尝试安装不在当前磁盘上的软件包时,bsdinstall 会提示用户插入相应的磁盘。

4. 分发

4.1. FTP 站点

当发行版经过彻底测试并打包以供分发时,必须更新主 FTP 站点。官方的 FreeBSD 公共 FTP 站点都是仅对其他 FTP 站点开放的主服务器的镜像。该站点称为 ftp-master。当发行版准备就绪时,必须修改 ftp-master 上的以下文件

/pub/FreeBSD/releases/arch/X.Y-RELEASE/

make release 输出的可安装 FTP 目录。

/pub/FreeBSD/ports/arch/packages-X.Y-release/

此发行版的完整软件包构建。

/pub/FreeBSD/releases/arch/X.Y-RELEASE/tools

指向 ../../../tools 的符号链接。

/pub/FreeBSD/releases/arch/X.Y-RELEASE/packages

指向 ../../../ports/arch/packages-X.Y-release 的符号链接。

/pub/FreeBSD/releases/arch/ISO-IMAGES/X.Y/X.Y-RELEASE-arch-*.iso

ISO 映像。"*" 是 disc1disc2 等。只有当存在 disc1 且存在备用第一个安装 CD(例如,没有窗口系统的精简安装)时,也可能存在 mini

有关 FreeBSD FTP 站点分发镜像体系结构的更多信息,请参阅 镜像 FreeBSD 文章。

在更新 ftp-master 之后,可能需要很多小时到两天的时间,才能让大多数 Tier-1 FTP 站点拥有新软件,具体取决于软件包集是否同时加载。在宣布 FTP 站点上新软件的普遍可用性之前,发行版工程师必须与 FreeBSD 镜像站点管理员 协调。理想情况下,发行版软件包集应在发行版日期至少四天前加载。发行版内容应在计划发行时间之前 24 到 48 小时内加载,并将“其他”文件权限关闭。这将允许镜像站点下载它,但公众将无法从镜像站点下载它。应在发布发行版内容时向 FreeBSD 镜像站点管理员 发送邮件,说明发行版已准备就绪,并说明镜像站点应开始允许访问的时间。确保在时间中包含时区,例如,使其相对于 GMT。

4.2. CD-ROM 复制

即将推出:将 FreeBSD ISO 发送到复制器的技巧以及要采取的质量保证措施。

5. 可扩展性

虽然 FreeBSD 构成一个完整的操作系统,但没有什么可以强迫您完全按照我们打包分发的系统使用。我们一直努力使系统尽可能可扩展,以便它可以作为其他商业产品可以构建在其之上的平台。我们对此的唯一“规则”是,如果您要分发带有非平凡更改的 FreeBSD,我们鼓励您记录您的增强功能!FreeBSD 社区只能帮助支持我们提供的软件的用户。我们当然鼓励创新形式,例如高级安装和管理工具,但我们不能预期会回答有关它的问题。

5.1. 编写 bsdinstall 脚本

FreeBSD 系统安装和配置工具 bsdinstall(8) 可以编写脚本,以便为大型站点提供自动化安装。此功能可以与 Intel® PXE [6] 结合使用,以从网络启动系统。

6. 从 FreeBSD 4.4 中吸取的经验教训

4.4 的发行版工程流程于 2001 年 8 月 1 日正式开始。从那天起,对 FreeBSD 的 RELENG_4 分支的所有提交都必须由 Release Engineering Team <re@FreeBSD.org> 明确批准。x86 架构的第一个发行版候选版本于 8 月 16 日发布,随后发布了 4 个发行版候选版本,最终版本于 9 月 18 日发布。安全主管在最后一周的流程中非常积极参与,因为在早期的发行版候选版本中发现了一些安全问题。在短短一个月的时间里,共向 Release Engineering Team <re@FreeBSD.org> 发送了超过500 封电子邮件。

我们的用户社区已经明确表示,FreeBSD 版本的安全性与稳定性不应该为了任何自我强加的截止日期或目标发布日期而牺牲。FreeBSD 项目在它的生命周期中发展壮大,对标准化发布工程流程的需求从未如此明显。随着 FreeBSD 被移植到新的平台,这将变得更加重要。

7. 未来方向

对于我们不断增长的用户群,我们的发布工程活动必须与之同步。沿着这条路线,我们正在努力记录制作 FreeBSD 版本所涉及的程序。

  • 并行性 - 发布构建的某些部分实际上是“尴尬的并行”。大多数任务都非常依赖 I/O,因此拥有多个高速磁盘驱动器实际上比使用多个处理器在加速 make release 过程中更重要。如果在 chroot(2) 环境中对不同的层次结构使用多个磁盘,那么 portsdoc 树的 CVS 检查可以与另一个磁盘上的 make world 同时进行。使用 RAID 解决方案(硬件或软件)可以显着缩短整体构建时间。

  • 交叉构建版本 - 在 x86 硬件上构建 IA-64 或 Alpha 版本?make TARGET=ia64 release

  • 回归测试 - 我们需要为 FreeBSD 构建更好的自动化正确性测试。

  • 安装工具 - 我们的安装程序早就超过了它的预期寿命。正在开发多个项目来提供更高级的安装机制。libh 项目就是这样一个项目,旨在提供一个智能的新软件包框架和 GUI 安装程序。

8. 致谢

我要感谢 Jordan Hubbard 为我提供了承担 FreeBSD 4.4 一些发布工程职责的机会,也感谢他多年来为使 FreeBSD 成为今天的样子所做的所有工作。当然,如果没有 Satoshi Asami <asami@FreeBSD.org>Steve Price <steve@FreeBSD.org>Bruce A. Mah <bmah@FreeBSD.org>Nik Clayton <nik@FreeBSD.org>David O’Brien <obrien@FreeBSD.org>Kris Kennaway <kris@FreeBSD.org>John Baldwin <jhb@FreeBSD.org> 以及其他 FreeBSD 开发社区成员在发布相关方面所做的所有工作,这个版本是不可能实现的。我还要感谢 Rodney W. Grimes <rgrimes@FreeBSD.org>Poul-Henning Kamp <phk@FreeBSD.org> 以及其他在 FreeBSD 最早期开发发布工程工具的人员。这篇文章受到 CSRG [7]、NetBSD 项目 [8] 以及 John Baldwin 提出的发布工程流程笔记 [9] 的影响。


5. FreeBSD 端口集合 https://ports.FreeBSD.org
7. Marshall Kirk McKusick、Michael J. Karels 和 Keith Bostic:4.3BSD 的发布工程
8. NetBSD 开发者文档:发布工程 http://www.NetBSD.org/developers/releng/index.html
9. John Baldwin 的 FreeBSD 发布工程提案 https://people.FreeBSD.org/~jhb/docs/releng.txt

最后修改于:2024 年 9 月 20 日,由 Fernando Apesteguía 修改。