使用 FreeBSD 构建产品

商标

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

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

摘要

FreeBSD 项目是一个全球性的、基于志愿者的合作项目,致力于开发一个可移植且高质量的操作系统。FreeBSD 项目在其产品的源代码下发布了一个宽松的许可证,旨在鼓励使用其代码。与 FreeBSD 项目合作可以帮助组织缩短上市时间、降低工程成本并提高产品质量。

本文探讨了在设备和软件产品中使用 FreeBSD 代码的问题。它强调了 FreeBSD 的特点,使其成为产品开发的理想基础。本文最后提出了一些与 FreeBSD 项目合作的最佳实践建议。


1. 简介

如今,FreeBSD 已成为众所周知的、高性能的服务器操作系统。它部署在全球数百万台 Web 服务器和面向互联网的主机上。FreeBSD 代码也是许多产品的组成部分,从网络路由器、防火墙和存储设备等设备到个人电脑。FreeBSD 的部分代码也已被用于商业封装软件(参见 FreeBSD 作为一组构建块)。

在本文中,我们将 FreeBSD 项目 视为一个软件工程资源——一个你可以用来构建产品的构建块和流程集合。

虽然 FreeBSD 的源代码是免费分发给公众的,但要充分利用该项目的成果,组织需要与该项目合作。在本文的后续章节中,我们将讨论与该项目合作的有效方法以及在合作过程中需要注意的陷阱。

读者注意事项。 作者认为,本文中列出的 FreeBSD 项目的特点在本文构思和撰写之时(2005 年)基本上是真实的。但是,读者应注意,开源社区使用的实践和流程可能会随着时间的推移而改变,因此本文中的信息应被视为指示性的而不是规范性的。

1.1. 目标受众

以下广泛群体的人员可能会对本文感兴趣

  • 寻求方法来提高产品质量、缩短上市时间以及长期降低工程成本的产品公司的决策者。

  • 寻求最佳实践来利用“开源”的科技顾问。

  • 对理解开源项目动态感兴趣的行业观察者。

  • 希望使用 FreeBSD 并寻求回馈方式的软件开发人员。

1.2. 文章目标

阅读本文后,您应该:

  • 了解 FreeBSD 项目的目标及其组织结构。

  • 了解其开发模型和版本工程流程。

  • 了解传统企业软件开发流程与 FreeBSD 项目中使用的流程有何不同。

  • 了解项目使用的沟通渠道以及您可以期望的透明度水平。

  • 了解与项目合作的最佳方式——如何最好地降低工程成本、缩短上市时间、管理安全漏洞以及随着 FreeBSD 项目的发展,保持产品与未来的兼容性。

1.3. 文章结构

本文的其余部分结构如下:

  • FreeBSD 作为一组构建块 介绍了 FreeBSD 项目,探讨了其组织结构、关键技术和版本工程流程。

  • 与 FreeBSD 合作 描述了与 FreeBSD 项目合作的方式。它考察了企业与 FreeBSD 等志愿者项目合作时遇到的常见陷阱。

  • 结论 总结。

2. FreeBSD 作为一组构建块

FreeBSD 是构建产品的绝佳基础

创新发生在其他地方:开源作为商业策略 更详细地考察了使用开源的商业原因。对于组织而言,在产品中使用 FreeBSD 组件的益处包括更短的上市时间、更低的开发成本以及更低的开发风险。

2.1. 使用 FreeBSD 构建

以下是一些组织使用 FreeBSD 的方法:

  • 作为经过测试的库和实用程序代码的 upstream 源。

    通过成为该项目的“downstream”,组织可以利用 upstream 代码接收到的新功能、错误修复和测试。

  • 作为嵌入式操作系统(例如,用于 OEM 路由器和防火墙设备)。在这种模型中,组织使用定制的 FreeBSD 内核和应用程序集,以及专有的管理层来管理其设备。OEM 可以从 FreeBSD 项目 upstream 添加的新硬件支持中获益,以及从基础系统接收到的测试中获益。

    FreeBSD 附带一个自托管开发环境,可以轻松创建此类配置。

  • 作为高端存储和网络设备管理功能的 Unix 兼容环境,在独立的处理器“刀片”上运行。

    FreeBSD 提供了创建专用操作系统和应用程序镜像的工具。它对 BSD unix API 的实现已成熟且经过测试。FreeBSD 还可以为高端设备的其他组件提供稳定的交叉开发环境。

  • 作为一种方式,从全球开发人员团队获得广泛的测试和支持,以支持非关键的“知识产权”。

    在这种模型中,组织向 FreeBSD 项目贡献有用的基础架构框架(例如,参见 netgraph(3))。代码获得的广泛曝光有助于快速识别性能问题和错误。顶级开发人员的参与也会导致对基础架构的有用扩展,贡献组织也会从中受益。

  • 作为支持像 RTEMSeCOS 这样的嵌入式操作系统的交叉开发的开发环境。

    在 FreeBSD 附带的 36000 个应用程序集合中,有许多功能齐全的开发环境。

  • 作为一种方式,在其他专有操作系统中支持 Unix 风格的 API,提高其对应用程序开发人员的吸引力。

    在这里,FreeBSD 内核和应用程序程序的部分内容被“移植”到专有操作系统中与其他任务一起运行。提供一个稳定且经过良好测试的 Unix™ API 实现可以减少将流行应用程序移植到专有操作系统的所需工作量。由于 FreeBSD 附带其内部的优质文档,并且拥有有效的漏洞管理和版本工程流程,因此保持更新的成本保持在较低水平。

2.2. 技术

FreeBSD 项目支持许多技术。下面列出了一些选定的技术:

  • 一个完整的系统,可以为 多种体系结构 进行交叉主机:

  • 一个模块化的对称多处理能力内核,具有可加载的内核模块和灵活且易于使用的配置系统。

  • 支持以接近机器速度模拟 Linux™ 和 SVR4 二进制文件。支持二进制 Windows™ (NDIS) 网络驱动程序。

  • 许多编程任务的库:存档器、FTP 和 HTTP 支持、线程支持,以及完整的 POSIX™ 风格的编程环境。

  • 安全特性:强制访问控制 (mac(9))、监狱 (jail(2))、ACL 和内核级加密设备支持。

  • 网络特性:防火墙、QoS 管理、高性能 TCP/IP 网络,支持许多扩展。

    FreeBSD 的内核级 Netgraph (netgraph(4)) 框架允许内核网络模块以灵活的方式相互连接。

  • 对存储技术的支持:光纤通道、SCSI、软件和硬件 RAID、ATA 和 SATA。

    FreeBSD 支持多种文件系统,其原生 UFS2 文件系统支持软更新、快照和非常大的文件系统大小(每个文件系统 16TB) 软更新:一种在快速文件系统中消除大多数同步写入的技术

    FreeBSD 的内核级 GEOM (geom(4)) 框架允许内核存储模块以灵活的方式组合。

  • 通过 FreeBSD 端口集合管理的 36000 多个移植应用程序,包括商业应用程序和开源应用程序。

2.3. 组织结构

FreeBSD 的组织结构是非层次化的。

FreeBSD 的贡献者主要分为两种:FreeBSD 的普通用户,以及拥有源代码库写入权限(在行话中被称为提交者)的开发人员。

第一组中有数千名贡献者;对 FreeBSD 的绝大多数贡献来自该组中的个人。提交权限(对代码库的写入权限)授予持续为该项目做出贡献的个人。提交权限伴随着额外的责任,新的提交者会被分配导师来帮助他们学习相关知识。

freebsd organization
图 1. FreeBSD 组织

冲突解决由一个由 9 名成员组成的“核心团队”完成,该团队从提交者群体中选举产生。

FreeBSD 没有“企业”提交者。个人提交者需要对他们引入代码的更改负责。 FreeBSD 提交者指南 提交者指南 文档记录了提交者的规则和责任。

FreeBSD 的项目模型在 FreeBSD 项目的项目模型 中进行了详细的考察。

2.4. FreeBSD 版本工程流程

FreeBSD 的发布工程流程在确保其发布版本质量方面发挥着重要作用。在任何时间点,FreeBSD 的志愿者都支持多个代码线(FreeBSD 发布分支)。

  • 新特性和颠覆性代码进入开发分支,也称为 -CURRENT 分支。

  • -STABLE 分支是定期从 HEAD 分支出来的代码线。只有经过测试的代码才能进入 -STABLE 分支。新特性在 -CURRENT 分支中经过测试和稳定后才能被允许加入。

  • -RELEASE 分支由 FreeBSD 安全团队维护。只有针对关键问题的错误修复才能被允许进入 -RELEASE 分支。

freebsd branches
图 2. FreeBSD 发布分支

只要用户和开发者对代码线感兴趣,它们就会被保持活跃。

机器架构被分为“层级”;第 1 层 架构得到项目发布工程和安全团队的完全支持,第 2 层 架构以尽力而为的方式提供支持,实验性架构构成第 3 层受支持的架构列表是 FreeBSD 文档集的一部分。

发布工程团队在项目的网站上发布了 FreeBSD 未来版本的路线图。路线图中列出的日期不是最后期限;FreeBSD 在其代码和文档准备就绪时发布。

FreeBSD 的发布工程流程在 FreeBSD 发布工程 中有描述。

3. 与 FreeBSD 合作

像 FreeBSD 这样的开源项目提供了高质量的完整代码。

虽然访问高质量源代码可以降低初始开发成本,但从长远来看,管理变更的成本开始占据主导地位。随着计算环境多年来的变化以及新安全漏洞的发现,您的产品也需要改变和适应。使用开源代码最好被视为一项持续进行的流程,而不是一次性活动。最好的合作项目是活跃的项目;即,拥有活跃的社区、明确的目标和透明的工作方式。

  • FreeBSD 周围拥有一个活跃的开发者社区。在撰写本文时,全球每个有人居住的大陆都有数千名贡献者,并且有超过 300 人拥有对项目源代码库的写入权限。

  • FreeBSD 项目的目标是 为 FreeBSD 项目做出贡献

    • 为流行的计算机硬件开发高质量的操作系统,以及

    • 以自由许可证的形式将我们的工作提供给所有人。

  • FreeBSD 享有开放和透明的工作文化。项目中几乎所有讨论都通过电子邮件进行,在 公共邮件列表 上,这些邮件列表也被存档以供后代使用。项目的策略被 记录 并在版本控制下维护。所有人的参与对项目都是开放的。

3.1. 了解 FreeBSD 文化

为了能够有效地与 FreeBSD 项目合作,您需要了解项目的文化。

由志愿者驱动的项目在运作规则上与盈利公司不同。公司在进军开源世界时常犯的一个错误是低估了这些差异。

动机。对 FreeBSD 的大多数贡献都是自愿进行的,没有金钱奖励的介入。激励个人的因素是复杂的,从利他主义到对解决 FreeBSD 试图解决的这类问题的兴趣都有。在这种环境中,“优雅永远不是可选的"良好 Lisp 编程风格教程

长期视角。FreeBSD 的根源可以追溯到近 20 年前,来自加州大学伯克利分校计算机科学研究组的工作。[1] 一些最初的 CSRG 开发人员仍然与项目相关联。

该项目重视长期视角 在十年内自学编程。项目中经常遇到的一个缩略语是 DTRT,它代表“做正确的事”。

开发流程。计算机程序是交流的工具:在某种程度上,程序员使用精确的符号向工具(编译器)传达他们的意图,该工具将他们的指令转换为可执行代码。在另一个层面上,相同的符号用于在两个程序员之间进行意图交流。

项目中很少使用正式规范和设计文档。清晰明了的代码和写得好的变更日志(示例变更日志条目)被用来代替它们。FreeBSD 的开发是通过“粗略共识和运行代码"互联网的架构原则 进行的。

r151864 | bde | 2005-10-29 09:34:50 -0700 (Sat, 29 Oct 2005) | 13 lines
Changed paths:
   M /head/lib/msun/src/e_rem_pio2f.c

Use double precision to simplify and optimize arg reduction for small
and medium size args too: instead of conditionally subtracting a float
17+24, 17+17+24 or 17+17+17+24 bit approximation to pi/2, always
subtract a double 33+53 bit one.  The float version is now closer to
the double version than to old versions of itself -- it uses the same
33+53 bit approximation as the simplest cases in the double version,
and where the float version had to switch to the slow general case at
|x| == 2^7*pi/2, it now switches at |x| == 2^19*pi/2 the same as the
double version.

This speeds up arg reduction by a factor of 2 for |x| between 3*pi/4 and
2^7*pi/4, and by a factor of 7 for |x| between 2^7*pi/4 and 2^19*pi/4.
示例变更日志条目

程序员之间的交流通过使用通用的编码标准 style(9) 得到增强。

通信渠道。FreeBSD 的贡献者遍布世界各地。电子邮件(以及在较小程度上,IRC)是项目中首选的交流方式。

3.2. 与 FreeBSD 项目合作的最佳实践

我们现在来看一些最佳实践,以充分利用 FreeBSD 进行产品开发。

计划长期目标

建立有助于跟踪 FreeBSD 开发的流程。例如

跟踪 FreeBSD 源代码。该项目使用 svnsync 使镜像其 SVN 存储库变得容易。拥有完整的源代码历史在调试复杂问题时非常有用,并能提供对原始开发人员意图的宝贵见解。使用功能强大的源代码控制系统,使您能够轻松地在上游 FreeBSD 代码库和您自己的内部代码之间合并更改。

使用 svn blame 生成的带注释的源代码列表 显示了变更日志中引用的文件的带注释列表的一部分 示例变更日志条目。每行源代码的祖先清晰可见。显示 FreeBSD 中每个文件历史记录的带注释列表 在网络上可用

#REV         #WHO #DATE                                        #TEXT

176410        bde 2008-02-19 07:42:46 -0800 (Tue, 19 Feb 2008) #include <sys/cdefs.h>
176410        bde 2008-02-19 07:42:46 -0800 (Tue, 19 Feb 2008) __FBSDID("$FreeBSD$");
  2116        jkh 1994-08-19 02:40:01 -0700 (Fri, 19 Aug 1994)
  2116        jkh 1994-08-19 02:40:01 -0700 (Fri, 19 Aug 1994) /* __ieee754_rem_pio2f(x,y)
  8870    rgrimes 1995-05-29 22:51:47 -0700 (Mon, 29 May 1995)  *
176552        bde 2008-02-25 05:33:20 -0800 (Mon, 25 Feb 2008)  * return the remainder of x rem pi/2 in *y
176552        bde 2008-02-25 05:33:20 -0800 (Mon, 25 Feb 2008)  * use double precision for everything except passing x
152535        bde 2005-11-16 18:20:04 -0800 (Wed, 16 Nov 2005)  * use __kernel_rem_pio2() for large x
  2116        jkh 1994-08-19 02:40:01 -0700 (Fri, 19 Aug 1994)  */
  2116        jkh 1994-08-19 02:40:01 -0700 (Fri, 19 Aug 1994)
176465        bde 2008-02-22 07:55:14 -0800 (Fri, 22 Feb 2008) #include <float.h>
176465        bde 2008-02-22 07:55:14 -0800 (Fri, 22 Feb 2008)
  2116        jkh 1994-08-19 02:40:01 -0700 (Fri, 19 Aug 1994) #include "math.h"
使用 svn blame 生成的带注释的源代码列表

使用门卫。指定一名门卫来监控 FreeBSD 的开发,注意可能影响您产品的更改。

向上游报告错误。如果您发现您正在使用的 FreeBSD 代码中的错误,请提交 错误报告。此步骤有助于确保您下次从上游获取代码时无需修复此错误。

利用 FreeBSD 的发布工程成果

使用 FreeBSD 的 -STABLE 开发分支的代码。这些开发分支得到 FreeBSD 发布工程和安全团队的正式支持,并且包含经过测试的代码。

捐赠代码以降低成本

与开发产品相关的成本中很大一部分是维护成本。通过将非关键代码捐赠给项目,您将从代码获得比平时更广泛的曝光率中受益。这反过来又会导致更多错误和安全漏洞被消除,以及性能异常被识别和修复。

有效地获得支持

对于有严格截止日期的产品,建议您雇用或与具有 FreeBSD 经验的开发人员或公司签订咨询协议。 FreeBSD 相关招聘邮件列表 是寻找人才的有用沟通渠道。FreeBSD 项目维护着 咨询顾问和咨询公司画廊,他们从事 FreeBSD 工作。 BSD 认证组 为所有主要的 BSD 派生操作系统提供认证。

对于不太关键的需求,您可以在 项目邮件列表 上寻求帮助。 如何明智地提问 提供了寻求帮助时可以遵循的有用指南。

宣传您的参与

您不需要宣传您使用 FreeBSD,但这样做有利于您和项目本身。

让 FreeBSD 社区知道您的公司使用 FreeBSD,这有助于提高您吸引高质量人才的机会。FreeBSD 的大量支持人员也意味着它在开发人员中的认知度更高。这反过来又会为您的未来打下更健康的基础。

支持 FreeBSD 开发人员

有时,将所需功能添加到 FreeBSD 中最直接的方法是支持一个已经在研究相关问题的开发人员。帮助可以从硬件捐赠到直接经济援助。在一些国家,对 FreeBSD 项目的捐赠享受税收优惠。该项目有一个专门的 捐赠联络人 来协助捐赠者。该项目还维护一个网页,让开发人员 列出他们的需求

作为一项政策,FreeBSD 项目 确认 其网站上收到的所有贡献。

4. 结论

FreeBSD 项目的目标是创建并赠送高质量操作系统的源代码。通过与 FreeBSD 项目合作,您可以在许多产品开发场景中降低开发成本并缩短上市时间。

我们考察了 FreeBSD 项目的特性,使其成为组织产品策略的一部分的绝佳选择。然后,我们研究了项目的流行文化,并考察了与开发者有效互动的方式。这篇文章最后列出了可以帮助与该项目合作的组织的最佳实践。

参考文献

[Carp1996] 互联网的架构原则 B. Carpenter. 互联网体系结构委员会。互联网体系结构委员会。版权® 1996。

[ComGuide] 贡献者指南 FreeBSD 项目。版权® 2005。

[GoldGab2005] 创新发生在别处:开源作为商业战略 Ron Goldman. Richard Gabriel. 版权® 2005. Morgan-Kaufmann。

[Hub1994] 为 FreeBSD 项目做出贡献 Jordan Hubbard. 版权® 1994-2005. FreeBSD 项目。

[McKu1999] Soft Updates:一种在快速文件系统中消除大多数同步写入的技术 Kirk McKusick. Gregory Ganger. 版权® 1999。

[McKu1999-1] 二十年伯克利 Unix:从 AT&T 拥有到自由分发 Marshall Kirk McKusick. 开源:来自开源革命的声音 O’Reilly Inc.. 版权® 1993。

[Mon2005] 为什么您应该为您的开源项目使用 BSD 风格的许可证 Bruce Montague. FreeBSD 项目。版权® 2005。

[Nik2005] FreeBSD 项目的项目模型 Niklas Saers. 版权® 2005. FreeBSD 项目。

[Nor1993] 良好 Lisp 编程风格教程 Peter Norvig. Kent Pitman. 版权® 1993。

[Nor2001] 在十年内自学编程 Peter Norvig. 版权® 2001。

[Ray2004] 如何明智地提问 Eric Steven Raymond. 版权® 2004。

[RelEngDoc] FreeBSD 发布工程 Murray Stokely. 版权® 2001. FreeBSD 项目。


1. FreeBSD 的源代码库包含了自项目开始以来的所有历史记录,并且有可用的 CDROM 包含来自 CSRG 的早期代码。

最后修改于:2024 年 9 月 27 日,作者:Fernando Apesteguía