> For the complete documentation index, see [llms.txt](https://freebsd-journal-cn.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://freebsd-journal-cn.bsdcn.org/20210102-an-li-yan-jiu/bally.md).

# BALLY WULFF

* 原文链接：[BALLY WULFF](https://freebsdfoundation.org/wp-content/uploads/2021/03/Bally-Wulf.pdf)
* 作者：MATEUSZ PIOTROWSKI

![BALLY WULFF 公司形象](/files/6huQRO7Dd079gisYKkE2)

BALLY WULFF Games & Entertainment GmbH 是德国一家知名的娱乐电子产品公司，专门开发、生产和销售现金游戏机。公司总部位于柏林，BALLY WULFF 不仅在德国运营，还在西班牙开展业务，目前约有 300 名员工。

自 2000 年代初以来，FreeBSD 一直是 BALLY WULFF 产品的首选平台。得益于其极其宝贵的稳定性和一致性，系统工程团队能够应对市场需求的不断变化，无论是小型磁盘空间占用、更高的安全性措施，还是更好的图形效果。团队经常将代码和文档补丁贡献回社区。此外，许多 BALLY WULFF 员工担任过 FreeBSD 的提交者。

BALLY WULFF 以其完全在内部的开发流程著称。最终产品是各个 BALLY WULFF 团队共同努力的结果。产品设计师、硬件工程师和游戏开发者之间的合作是其成功的关键。从机器设计、硬件集成和游戏开发到最终的生产和组装，所有工作都在内部完成。FreeBSD 是这一切的核心，不仅作为最终游戏机中的操作系统，还在开发工作站和生产设备中发挥作用。

这篇简短的案例研究深入探讨了 BALLY WULFF 系统工程团队的目标，并解释了 FreeBSD 如何帮助实现这些目标。

## 目标 1：限制操作系统的磁盘占用

BALLY WULFF 的游戏机可看作巨大的视频游戏主机。在物联网时代，这或许令人惊讶：它并没有连接到互联网，而是预装了所有软件、游戏及其资源。一旦离开生产现场，唯一改变机器上软件的方法是通过涉及 U 盘等物理存储介质的手动更新程序。虽然这不再是紧迫的问题，但旧一代游戏机曾为系统工程师带来有趣的挑战。每个团队的磁盘配额必须小心平衡，以确保每个游戏和管理工具获得合理的磁盘空间。然而，磁盘总是稍微小了一点，无法容纳所有需要的数据。因此，操作系统必须剔除所有不必要的部分。FreeBSD 与其他设计良好的软件项目一样，提供了许多构建选项，能够在编译过程中排除一切非核心部分。

然而，标准的构建选项并不足够。事实证明，为了实现所需的磁盘占用，系统工程团队必须更细粒度地控制构建过程。所幸的是，FreeBSD 的构建系统在设计、维护和不断改进时都考虑到了可定制性和稳定性。这是设计使然，下游用户（尤其是设备供应商）能够深入了解构建系统，按需修改，并预期对源树的本地更改仅带来最小的维护开销。

BALLY WULFF 维护着针对 FreeBSD 构建系统的内部补丁集，用于从最终 OS 镜像中排除非必要文件。这个专门针对设备的补丁集自然地融入了构建基础设施，看起来并不像是硬塞进现有环境的外部附加组件。同时，它并没有给系统工程团队带来显著的维护负担。因此，操作系统的磁盘占用被限制到最低，为游戏腾出了更多的磁盘空间——这对客户来说是真正的价值。

## 目标 2：发布修改过的软件包

多年来，FreeBSD Ports 一直是 BALLY WULFF 的宝贵资产。它提供了标准化且可扩展的方式来定制并向操作系统添加额外的软件。事实上，它如此简便，以至于创建定制软件包是新 FreeBSD 用户最早学习的内容之一。

FreeBSD Ports 开发者确保 Ports 框架稳步发展，并且在许多年内保持向后兼容。因此，即使 FreeBSD 项目已经在其打包基础设施中改用 poudriere，BALLY WULFF 这类用户仍可按自己的时间表迁移。最终，FreeBSD 的核心是稳定性，不会有令人不快的意外。因此，BALLY WULFF 的系统工程团队能够轻松跟进这些变化，并做好规划。

BALLY WULFF 在内部维护着 FreeBSD Ports 的分支，包含一些额外的公司特定 Port 和对现有 Port 的补丁。不仅回溯最新版本的 Port 非常容易，维护现有 Port 的自定义版本也简单且无痛。FreeBSD Ports 的另一优势是，通过内部软件包库分发软件包非常轻松，并且得到了很好的支持。

FreeBSD 项目持续改进，简化扩展私有 Port 集合的过程，这直接惠及 BALLY WULFF。最新的例子是 poudriere，它简化了软件包构建、测试和发布的过程。另一重要特性是对 Ports 树的叠加支持，目前 BALLY WULFF 的系统工程团队正在测试这一功能。它很可能减轻维护内部 Ports 分支的需求，进一步减少维护负担。

## 目标 3：定制系统启动

通常，通用操作系统会有程序控制系统启动。它通常配置新启动的系统，例如，挂载磁盘并启动基本的系统服务，如网络服务。

在 BALLY WULFF 的游戏机中，系统启动过程与典型桌面系统大不相同。标准的 FreeBSD 启动过程足够可配置，可以覆盖大多数服务器和桌面系统的使用场景，但对于游戏机来说，完全替换标准的 rc.8 机制更合理。所幸的是，替换标准的 rc.8 框架无需什么黑魔法。实际上，替换 **/etc/rc** 文件即可启动。因此，BALLY WULFF 的系统工程团队维护着专门的系统启动脚本，用来为游戏启动准备操作系统环境。

在 BALLY WULFF，定制的 rc.8 框架在多个版本中使用，并且继续完美运行。这无疑是 FreeBSD 稳定开发实践和基本系统模块化的好处——定制 FreeBSD 的一部分，并且期望其余部分正常工作是完全合理的。这给开发人员带来了安心，使他们能够专注于开发重要的功能，而不是不断追赶向后不兼容的上游变化。

## 目标 4：支持自定义更新程序

BALLY WULFF 游戏机需要定期更新，这一点并不令人惊讶。当需要修复恼人的 bug 或向已经发布并正在运行的机器添加重要的业务功能时，就会更新平台。更频繁的情况是，机器通过新游戏更新。游戏机的更新过程是公司中最重要且经过严格测试的程序之一。彻底的测试和 QA 检查确保应用到市场上已运行机器的更新不会导致任何不必要的停机。更新过程必须允许无人值守地自动安装新软件。在更新过程中让机器无法操作是绝对不可接受的。

由于游戏机操作系统的架构，使用 freebsd-update.8 和 pkg.8 更新系统会过于复杂。所幸的是，FreeBSD 的简洁性能实现完全自定义的更新程序。

## 目标 5：在生产和开发中运行相同的操作系统

软件工程的一条黄金法则是，开发应该在与生产环境完全相同或至少相似的环境下进行。开发人员在统一的环境中工作时，就不必为调试代码做重复工作。

BALLY WULFF 的游戏开发人员使用 FreeBSD 工作站，在实际游戏机上测试游戏之前先测试。令人惊讶的是，FreeBSD 对游戏机和工作站都能提供同样出色的支持。

值得注意的是，游戏开发部门的规模远大于 BALLY WULFF 的 FreeBSD 团队。然而，维护专门为游戏开发人员需求量身定制的内部 FreeBSD 发行版完全可行。相同的基于 FreeBSD 的操作系统运行在游戏机和开发工作站上，主要区别在于已安装的软件包列表。这是 FreeBSD 作为通用操作系统的巨大优势。

## 目标 6：保持与社区的紧密联系

与社区保持紧密联系让 BALLY WULFF 既能参与 FreeBSD 的开发，又能与 FreeBSD 开发人员保持联系。例如，BALLY WULFF 旨在将本地 FreeBSD 补丁的数量保持在最低限度。非必要补丁的维护负担无法支持。上游提交补丁不仅因附加测试而成为非常明智的商业决策，也是回馈 FreeBSD 社区的好方法。然而，大多数情况下，BALLY WULFF 内部开发的 FreeBSD 补丁过于特定于供应商，不适合纳入 FreeBSD 源代码树。不过，公司确保通过其他方式做出贡献。BALLY WULFF 的开发人员定期参与 FreeBSD 开发者峰会和开源会议，如 FOSDEM 和 EuroBSDcon。2019 年，BALLY WULFF 在公司总部柏林举办了开发者峰会。

## 总结

FreeBSD 一直是 BALLY WULFF 出色的操作系统，得益于其卓越的构建系统，该系统的开发和维护方式使其能够有效适应专用设备。过去，FreeBSD 对 BALLY WULFF 的主要好处是小巧而功能强大的基本系统，通过利用现有的 build.7 选项或引入供应商特定的更改，可以进一步精简，从而精确控制最终操作系统镜像中包含的内容。FreeBSD 基本系统和 Ports 构建系统的内部补丁自然融入了基于 Makefile 的一致基础设施。所有这些特性使 BALLY WULFF 的系统工程团队能够最大限度地减小操作系统的大小，从而为游戏及其资产腾出更多空间，让 BALLY WULFF 开发人员继续推动硬件和软件的极限。

现在，磁盘空间不再像过去那样珍贵，减少操作系统最终大小的特殊补丁集已无必要。BALLY WULFF 的焦点和精力转向了系统开发的其他方面。不再需要对 FreeBSD 源代码进行大量修改以优化小磁盘占用。从修改过的 FreeBSD 源代码构建操作系统到使用未修改 FreeBSD 源代码构建操作系统的过渡正在进行中。到目前为止，这一过程既无痛又有益，因为它显著简化了构建基础设施。这得益于 FreeBSD 社区的巨大努力，在可行的情况下保持向后兼容性。对 FreeBSD 系统的每个重大更改都是在考虑下游用户工作流程的前提下实现的。

计算世界发展迅速，团队的焦点不再是让系统占用尽可能小的空间。现在的目标是提高系统的稳健性，并保持低维护成本。最终，BALLY WULFF 系统工程团队的目标是为游戏开发者提供高性能且稳定的游戏平台。

***

**MATEUSZ PIOTROWSKI** 是一位来自柏林的 FreeBSD Ports 和文档提交者。他喜欢排查 bug、脚本自动化和设计稳健的软件系统（并始终彻底记录一切）。最近，他的兴趣转向了追踪和性能工程。当他不在现代软件“假定确定性”的电路上做 hack 工作时，他会探索社会和文化中不断变化的动态。


---

# 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://freebsd-journal-cn.bsdcn.org/20210102-an-li-yan-jiu/bally.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.
