# FreeBSD 30 周年：成功的秘诀

* 作者：Marshall Kirk Mckusick
* 译者：一木
* 原文地址：<https://freebsdfoundation.org/wp-content/uploads/2023/06/mckusick_secret.pdf>

今年，FreeBSD 项目迎来了提供可用系统发行版的第 30 周年。这篇文章的目的是了解是什么使得 FreeBSD 能够成为为数不多的长期的、可行的开源项目之一。大多数长期成功的项目都是由一些公司赞助的，这些公司的产品都是以他们积极培育的开源软件为基础。虽然 FreeBSD 有一些公司在积极地使用和支持它，但这些公司多年以来，没有一家是其主要的长期支持者。

## 缘起

许多开源项目都是从一个人编写代码开始的，然后从那里开始构建。FreeBSD 从一个坚实的代码库开始，即加州大学伯克利分校的 4.4BSD-Lite 开源发行版。伯克利软件发行版（BSD）那时已经开发和发行了十多年，BSD 发行版源于贝尔实验室的 Unix 发行版，她比 BSD 早开发了十多年。尽管 BSD 并非开源，但其代码得到了广泛的访问许可，并有许多来自学术界和工业界的贡献者。几乎所有的 BSD 最终都在 4.4BSD-Lite 发行版中作为开放源代码发布。

BSD 内核引入了至今仍在使用的重要操作系统接口：

* Socket 网络接口和最初广泛使用的 TCP/IP
* 实现用于操作文件系统的系统调用：支持多种文件系统实现的虚拟文件系统（VFS）接口，以及快速文件系统和网络文件系统（NFS）实现
* mmap 内存模型，以及
* 管理进程的接口（信号、进程组、作业控制等）

BSD 发行版还建立了完整系统发行版的模式，包括操作系统、一组核心库和工具、贡献的软件（最终成为 FreeBSD 的 ports）以及完整的手册和系统文档。

## 领导

**FreeBSD 组织成立之初，组织者决定成立一个由 7 人小组（核心小组），负责监督项目。**

大多数开源项目都是由个人发起的，然后这个人就成了项目的终身领袖。众所周知的一个例子是 Linus Torvalds，他创建了 Linux 项目，并一直领导着该项目。当领导者失去兴趣并停止工作时，项目通常就会走向失败。如果领导者不善于审查和批评或接受他人的意见，贡献者往往会感到沮丧。

FreeBSD 组织成立时，组织者决定成立一个由 7 人组成的小组，称为核心小组，负责监督项目。最初的核心小组是内定的。建立项目的人将自己任命为核心小组的成员。他们是“终身沙皇”。核心小组决定项目的方向，并授予和取消提交者的特权；提交者是被允许对项目仓库进行修改的人。

虽然这种方法比单一的领导者要好，但它仍然存在一个问题，即提交者在项目中只能升到中层，因此如果他们的想法不被接受，就会导致他们的沮丧和放弃。为了解决这个问题，FreeBSD 项目决定让核心小组成为一个经选举而产生的职位。核心小组成员也扩大到 9 人。整个核心小组每两年选举一次。核心成员由提交者提名并选举产生。任何活跃的提交着都可以竞选核心小组。候选人可自行选择，无需提名。这一变化的效果是，新人可以晋升到领导岗位。因此，项目领导层会随着时间的推移而不断发展，项目也不容易因为领导者的离开而崩溃。

## 开发

FreeBSD 项目从一开始就使用集中式工具（源代码控制和 Bug 报告）。这种工具从一开始就支持远程开发。尽管在今天已经很普遍，但在 FreeBSD 发展伊始，通常的做法是由一个人来维护发行版，其他人的修改必须发送给这个人才能并入。随着项目的发展，维护源代码主复制的人就会不堪重负，从而限制了项目前进的速度。此外，当出现需要分配的 Bug 时，也很难跟踪谁在处理什么。值得庆幸的是，现代工具集（如 gitlab 和 github）可以有效解决这些问题。

FreeBSD 项目也在吸纳 NetBSD 和 OpenBSD 项目的思想和代码，并从中受益匪浅。NetBSD 在高效支持多种体系结构方面处于领先地位，这对 FreeBSD 从最初的 Intel 体系结构扩展到支持其他体系结构非常有帮助。NetBSD 还提供了许多测试，这些测试已被纳入 FreeBSD 的持续集成测试。OpenBSD 专注于系统安全，FreeBSD 也整合了他们的许多安全改进。OpenBSD 还提供了一些 FreeBSD 使用的关键安全组件，如 ssh 远程访问和登录程序，以及支持 https 加密的软件组件。

## 发布

许多开源项目只是代码的集合，必须下载、编译和安装后才能使用。它们通常依赖于其他库和基础架构，而这些库和基础架构也必须找到，并构建和安装。近年来，一些项目开始提供可启动的容器，但这并不能有效利用资源，因为他们包括整个软件堆栈，一直到操作系统，从而重复了机器上已有的大量软件。

在 FreeBSD 项目历史的早期，它就开始分发包含完整系统的光盘（CDROM），这些光盘可以在 PC 电脑上启动。用户可以从光盘启动系统进行试用，然后根据自己的需要将其安装到硬盘上。而且，由于它是从 BSD 系统衍生而来的，用户所需的所有命令和库都已经存在。此外，还提供了丰富的文档资料，即使非专业人士也能轻松安装。

## 硬件支持

大多数开源项目都试图支持所有硬件，这通常意味着很多硬件性能不佳，经常在负载下出现故障。从 FreeBSD 项目一启动，我们就决定对硬件进行精挑细选，并决定哪些硬件能与 FreeBSD 完美配合。硬件被选中后，我们就会花费大量精力来编写强健和完整的设备驱动程序来运行他们。FreeBSD 发布了他们推荐的硬件列表，并通过修复报告的问题和更新驱动程序来支持这些硬件。有了这份精心挑选的列表，就可以很容易地组装出在负载情况下运行良好的服务器机器。由于 FreeBSD 性能卓越、运行可靠，它成为运行拨号服务器的公司，以及后来的互联网和网络服务提供商的首选系统。

## 沟通

**由于几乎所有的 FreeBSD 开发人员都是远程工作，因此建立邮件列表来讨论核心设计决策非常重要。**

由于几乎所有的 FreeBSD 开发人员都是远程工作，因此建立邮件列表来讨论核心设计决策是非常重要的。主题领域包括网络、文件系统、核心架构等。邮件列表中经常出现的一个问题是，讨论可能会偏离正轨，尤其是在大多数人从未谋面的情况下。在项目的最初几年吵得不可开交并不罕见，因此邮件列表开始受到积极监控，以抑制不良行为，确保文明讨论。可悲的是，时至今日，许多项目的邮件列表仍然充满乌烟瘴气。待一个项目因不良行为而声名狼借，往往会导致其进入死亡轮回。另外，也有可能走向另一个极端，变得过渡控制，以至于人们因为感觉受到限制而放弃项目。对于像 FreeBSD 这样开发人员遍布全球的项目来说，很难找到适合开发人员文化多样性的规则。这个问题很难有效解决，最终，需要有一个不断发展的社区守则，来保证项目平稳地向前发展。

## 文档

FreeBSD 项目一开始就基于 4.4BSD-Lite 发行版的文档，建立了坚实的文档基础。在发展早期，FreeBSD 接纳了专注于系统文档的贡献者。我们鼓励编写代码的人员与编写文档的人员合作，以确保文档的完整性和正确性。

项目为编写文档的人员设立了一个文档提交小组。该小组拥有代码提交者的所有权利和特权。他们可以竞选核心小组，拥有平等的投票权，以及自己的组长，负责添加和删除文档提交者、建立文档结构和工具，以及监督文档储存库。在他们的指导下，文档的结构框架可以轻松支持多种语言。许多文档提交者一开始都是将文档翻译成自己的母语。这种翻译工作通常有助于他们尽快了解文档工具的工作原理以及 FreeBSD 本身的工作原理。

## Ports

4.4BSD-Lite 发行版整合了大约 50 个在伯克利之外开发的实用程序和库，这些软件都包含在 BSD 发行版中。其中包括 X 视窗系统、gated 路由守护进程、emacs 编辑器等。FreeBSD 以这套核心整合程序为起点，并通过后来的 ports 集对其进行了极大的扩展。与安装所有贡献程序的 BSD 发行版不同，由 FreeBSD ports 单独提供它们，这样就可以只安装它们需要的程序。ports 集确保了程序能以合理的默认值在 FreeBSD 上编译和运行。它还保证了在 BSD 环境中发现的错误修正会被上传到软件维护者那里，并且这些修正会被带到 FreeBSD port。大多数用户只需使用 port 的编译后版本，而那些需要对参数进行修改的用户则可以先进行修改，然后再编译他们自己的二进制文件。port 使得在 FreeBSD 上使用其它开源软件变得更加容易。如今，大多数开源发行商都有类似 port 的东西，但这在当时还是个新事物。

多年以来，ports 一直在不断发展。最近的创新是增加了 pkg 系统来操作 ports。pkg 系统处理软件包的注册、添加、删除和升级。另一个关键组件是 Poudriere，它是一个用于创建和测试 FreeBSD 软件包的工具。它使用 FreeBSD jail 来建立隔离的编译环境。这些 jail 可用于为非实体 FreeBSD 系统的其他版本编译软件包，也可用于为不同于主机系统的体系结构编译软件包。软件包编译完成后，它们的布局就会与官方镜像完全相同。pkg 系统和其他软件包管理工具可以使用这些软件包。

FreeBSD 提供了基石，可以通过修改它来构建一个定制的操作系统，同时还提供了构建一个完整的操作系统发行版所需的所有基础架构，不仅包括基本系统，还包括 ports 集。可以定制的操作系统以支持设备，因为如何为定制操作系统构建发布镜像以及通过 Poudriere 为定制操作系统自动构建软件包的所有信息都是公开的，并有详细的文档记录。在这方面，没有一个 Linux 发行版能像 FreeBSD 那样一键搞定。例如，在修改过的内核和系统库等基础上构建自己的 Debian-fork 会困难得多。

## 项目文化

**核心小组对 Port、文档和开发的提交者对项目的运行都有同等的发言权。**

Port、文档和开发的提交者对项目的运行都有同等的发言权。值得注意的是，他们都可以竞选核心小组，并获得相同的投票权。在大多数项目中，开发人员拥有更多的发言权，而其他人则被视为低人一等。FreeBSD 项目从一开始就致力于建立包容文化。这种文化最看重的是“与他人相处融洽”。它不会为了得到自己的文档、port 或代码而容忍“智者”的存在（尽管有时“智者”的离开或被踢出局可能需要一段时间）。

FreeBSD 项目并不是为了培训人们如何写作或编程而成立的。加入 FreeBSD 项目的人应该了解他们的行业。文档作者需要了解如何撰写技术文档。Port 和源代码贡献者需要了解 C 语言和任何其它相关语言，以及用于编写、构建、调试和分析他们的工具。尽管如此，FreeBSD 还是通过谷歌代码之夏等项目对学生进行指导。事实上，许多参加代码之夏的学生后来都成为了 FreeBSD 项目的提交者。

FreeBSD 项目欢迎新人加入。要想成为项目的提交者，并不需要经过严格的筛选，也不需要去讨好项目领导者。关于如何参与到项目中来，有一个完整的文档流程。

## 项目支持

FreeBSD 创立之初，其基础架构只是开发人员家中的一台机器。随着 FreeBSD 的发展，它的基础设施首先得到了 Walnut Creek CD-ROM 的支持，后来又由雅虎支持。依赖公司的善意是灾难的根源，因此 FreeBSD 基金会应运而生，以筹集资金，最初的用途是为 FreeBSD 基础架构提供机器和託管服务。尽管基金会对项目的支持在今天很常见，但 FreeBSD 是最早成立基金会来支持项目的项目之一。基金会最初由董事会（无报酬）管理。几年后，基金会雇用了第一位兼职员工。如今，基金会拥有近二十名员工和承包商，为基础架构、开发、市场营销、工具、资金筹集和其它项目相关服务提供支持。

## 许可证

FreeBSD 使用伯克利许可证（BSD license），它不要求公司向他人提供自己的代码。伯克利许可证的使用对 FreeBSD 的成功起了很大的作用，特别是对那些在内核中使用其专有代码的公司。FreeBSD 被大量用于设备和嵌入式操作系统市场，在这些市场中，公司需要将其知识产权置于操作系统中，因此不能使用 Linux，因为其使用的 GNU 公共许可证（GPL）要求提供所有更改的源代码。

## 总结

FreeBSD 仍在不断发展壮大。它的力量来自于在代码、文档和文化方面打下的坚实基础。它与时俱进，不断引入新的提交者，并在多个领导小组中平稳过渡。

它继续填补一个重要的支持领域——替代 Linux。具体来说，需要冗余的公司需要不止一个操作系统，因为任何一个操作系统都可能成为故障的受害者，从而导致整个公司的基础设施瘫痪。基于所有这些原因，FreeBSD 前景光明。总之，FreeBSD 非常棒！

***

MARSHALL KIRK MCKUSICK 博士撰写图书和文章，教授 UNIX 和 BSD 相关课程，并就软件专利、商业秘密和版权问题提供专家证人证词。自 1993 年 FreeBSD 项目成立以来，他一直是该项目的开发者和提交者。


---

# Agent Instructions: 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:

```
GET https://book.bsdcn.org/qi-kan/20230506-freebsd-san-shi-zhou-nian-ji-nian-te-kan/30.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
