FreeBSD 中文社区 2025 第二季度问卷调查
FreeBSD 中文社区(CFC)
VitePress 镜像站QQ 群 787969044视频教程Ⅰ视频教程Ⅱ
  • FreeBSD 从入门到追忆
  • 中文期刊
  • 状态报告
  • 发行说明
  • 手册
  • 网络文章集锦
  • 笔记本支持报告
  • Port 开发者手册
  • 架构手册
  • 开发者手册
  • 中文 man 手册
  • 文章
  • 书籍
  • FreeBSD 中文期刊
  • 编辑日志
  • 2025-123 下游项目
    • FreeBSD 发布工程:新主管上任
    • GhostBSD:从易用到挣扎与重生
    • BSD Now 与将来
    • 字符设备驱动教程(第三部分)
    • 学会走路——连接 GPIO 系统
    • FreeBSD 中对 SYN 段的处理
    • FreeBSD 2024 年秋季峰会
  • 2024-1112 虚拟化
    • 字符设备驱动程序教程(第二部分)
    • 面向 Linux 和 Windows 用户的 bhyve
    • Xen 与 FreeBSD
    • Wifibox:一种嵌入式虚拟化无线路由器
    • 嵌入式 FreeBSD:Fabric——起步阶段
    • DGP:一种新的数据包控制方法
    • 会议报告:我在都柏林的 EuroBSDCon 体验
  • 2024-0910 内核开发
    • 字符设备驱动程序教程
    • VPP 移植到了 FreeBSD:基础用法
    • 利用 Kyua 的 Jail 功能提升 FreeBSD 测试套件的并行效率
    • FreeBSD 上的 Valgrind
    • 嵌入式 FreeBSD:探索 bhyve
    • TCP/IP 历险记:FreeBSD TCP 协议栈中的 Pacing
    • 实用软件:实现无纸化(Paperless)
  • 2024-0708 存储与文件系统
    • FreeBSD 中的 NVMe-oF
    • FreeBSD iSCSI 入门
    • 使用 ZFS 原生加密保护数据
    • 嵌入式 FreeBSD:打造自己的镜像
    • TCP LRO 简介
    • 基于 Samba 的时间机器备份
  • 2024-0506 配置管理对决
    • 基本系统中的 mfsBSD
    • rdist
    • Hashicorp Vault
    • 在 GitHub 上向 FreeBSD 提交 PR
    • 悼念 Mike Karels
    • 2024 年 5-6 月来信
    • 嵌入式 FreeBSD 面包板
    • TCP/IP 历险记:TCP BBLog
    • 实用软件:开发定制 Ansible 模块
  • 2024-0304 开发工作流与集成
    • FreeBSD 内核开发工作流程
    • FreeBSD 与 KDE 持续集成(CI)
    • 更现代的内核调试工具
    • 从零开始的 ZFS 镜像及 makefs -t zfs
    • 提升 Git 使用体验
  • 2024-0102 网络(十周年)
    • FreeBSD 中的 RACK 栈和替代 TCP 栈
    • FreeBSD 14 中有关 TCP 的更新
    • if_ovpn 还是 OpenVPN
    • SR-IOV 已成为 FreeBSD 的重要功能
    • FreeBSD 接口 API(IfAPI)
    • BATMAN:更优的可移动热点网络方式
    • 配置自己的 VPN——基于 FreeBSD、Wireguard、IPv6 和广告拦截
    • 实用软件:使用 Zabbix 监控主机
  • 2023-1112 FreeBSD 14.0
    • LinuxBoot:从 Linux 启动 FreeBSD
    • FreeBSD 容器镜像
    • 现在用 Webhook 触发我
    • 新的 Ports 提交者:oel Bodenmann (jbo@freebsd.org)
  • 2023-0910 Port 与软件包
    • 回忆录:与 Warner Losh(@imp)的访谈
    • 在你自己的仓库中定制 Poudriere 源
    • Wazuh 和 MITRE Caldera 在 FreeBSD Jail 中的使用
    • PEP 517
    • CCCamp 2023 旅行报告
  • 2023-0708 容器与云
    • 在 Firecracker 上的 FreeBSD
    • 使用 pot 和 nomad 管理 Jail
    • 会议报告:C 与 BSD 正如拉丁语与我们——一位神学家的旅程
    • 抒怀之旅:与 Doug Rabson 的访谈
    • 基于 Jail 的广告拦截教程
    • 我们收到的来信
  • 2023-0506 FreeBSD 三十周年纪念特刊
    • CheriBSD 近十多年的历程
    • AArch64:成为 FreeBSD 新的一级架构
    • 岁月如梭:我个人的时间线
    • 安装 FreeBSD 1.0:回顾 30 年前
    • ZFS 是如何进入 FreeBSD 的呢?
    • 我不是来自约克郡的,我保证!
    • 回忆录:采访 David Greenman Lawrence
    • FreeBSD 和早期的 Unix 社区
    • 早期的 FreeBSD 移植
    • FreeBSD 30 周年:成功的秘诀
    • FreeBSD 在日本:回忆之旅与今日之实
  • 2023-0304 嵌入式
    • CheriBSD port 和软件包
    • 让我们来试试 ChatGPT
    • GPU 直通
  • 2023-0102 构建 FreEBSD Web 服务器
    • ZFS 的原子 I/O 与 PostgreSQL
    • 虚拟实验室——BSD 编程研讨会
    • ZFS 简介
    • 会议报告:落基山庆祝女性计算机科学家
    • 进行中的工作/征求反馈:数据包批处理
    • 基金会与 FreeBSD 桌面
  • 2022-1112 可观测性和衡量标准
    • 在 FreeBSD 的 DDB 内核调试器中编写自定义命令
    • DTrace:老式跟踪系统的新扩展
    • 基于证书的 Icinga 监控
    • 活动监控脚本(activitymonitor.sh)
    • 实用 IPv6(第四部分)
    • EuroBSDCon 会议报道
    • 实用 Port:Prometheus 的安装与配置
    • 书评:《用火解决问题:管理老化的计算机系统(并为现代系统保驾护航)》Kill It with Fire: Manage Aging Computer Systems (and Future Proof Modern Ones)
  • 2022-0910 安全性
    • CARP 简介
    • 重构内核加密服务框架
    • PAM 小窍门
    • SSH 小窍门
    • 实用 IPv6(第三部分)
    • 书评:Understanding Software Dynamics(深入理解软件性能——一种动态视角)—— Richard L. Sites 著
    • 访谈:保障 FreeBSD 安全性
    • MCH 2022 会议报告
  • 2022-0708 科研、系统与 FreeBSD
    • 在 FreeBSD 上构建 Loom 框架
    • 教授本科生 Unix 课程
    • FreeBSD 入门研讨会
    • 实用 IPv6(第二部分)
    • 在 2022 年及以后推广 FreeBSD
    • 进行中的工作/征求反馈:Socket 缓冲区
    • FreeBSD 开发者峰会报告
    • 支持 Electromagnetic Field 2022
  • 2022-0506 灾难恢复
    • 使用 FreeBSD 构建高弹性的私有云
    • LLDB 14 —— FreeBSD 新调试器
    • 实用 IPv6(第一部分)
    • 利用 netdump(4) 进行事后内核调试
    • 进行中的工作/征求反馈:FreeBSD 启动性能
    • 实用 Port:在 OpenZFS 上设置 NFSv4 文件服务器
  • 2022-0304 ARM64 是一级架构
    • FreeBSD/ARM64 上的数据科学
    • Pinebook Pro 上的 FreeBSD
    • 嵌入式控制器的 ACPI 支持
    • 进行中的工作/征求反馈:Lumina 桌面征集开发人员
    • 实用 Port:如何设置 Apple 时间机器
  • 2022-0102 软件与系统管理
    • 为 FreeBSD Ports 做贡献
    • 使用 Git 贡献到 FreeBSD Ports
    • CBSD:第一部分——生产环境
    • 将 OpenBSD 的 pf syncookie 代码移植到 FreeBSD 的 pf
    • 进行中的工作/征求反馈:mkjail
    • 《编程智慧:编程鬼才的经验和思考》(The Kollected Kode Vicious)书评
    • 会议报告:EuroBSDCon 2021 我的第一次 EuroBSDCon:一位新组织者的视角
  • 2021-1112 存储
    • 开放通道 SSD
    • 构建 FreeBSD 社区
    • 与完美操作系统同行 27 年
    • 进行中的工作/征求反馈:OccamBSD
    • 通过 iSCSI 导入 ZFS ZIL——不要在工作中这样做——就像我做的那样
  • 2021-0910 FreeBSD 开发
    • FreeBSD 代码审查与 git-arc
    • 如何为 FreeBSD 实现简单的 USB 驱动程序
    • 内核开发技巧
    • 程序员编程杂谈
  • 2021-0708 桌面/无线网
    • 通往 FreeBSD 桌面的直线路径
    • FreeBSD 13 中的人机接口设备 (HID) 支持
    • Panfrost 驱动程序
    • 用 Git 更新 FreeBSD
    • FreeBSD 的新面孔
    • 想给你的桌面加点佐料?
  • 2021-0506 安全
    • 七种提升新安装 FreeBSD 安全性的方法
    • copyinout 框架
    • 使用 TLS 改善 NFS 安全性
    • Capsicum 案例研究:Got
    • 对 Jail 进行安全扫描
  • 2021-0304 FreeBSD 13.0
    • 展望未来
    • FreeBSD 13.0 工具链
    • FreeBSD 13.0 中有新加载器吗?
    • TCP Cubic 准备起飞
    • OpenZFS 中的 Zstandard 压缩
    • 会议报告:FreeBSD 供应商峰会
    • Git 不够吗?
  • 2021-0102 案例研究
    • Tarsnap 的 FreeBSD 集群
    • BALLY WULFF
    • Netflix Open Connect
    • FreeBSD 的新面孔
    • 写作学者的 FreeBSD
    • 在世界之巅
  • 2020-1112 工作流/持续集成(CI)
    • FreeBSD Git 快速入门
    • 使用 syzkaller 进行内核 Fuzzing
    • Mastering Vim Quickly 书评
    • 线上会议实用技巧
    • 在控制台上进行网络监控
  • 2020-0910 贡献与入门
    • 采访:Warner Losh,第 2 部分
    • 代码审查
    • 撰写良好的提交消息
    • 如何在不是程序员的情况下做出贡献——成为 FreeBSD 译者
    • 如何成为文档提交者
    • 谷歌编程之夏
    • 为 FreeBSD 期刊撰写文章
    • 你为什么使用 FreeBSD
    • FreeBSD 的新面孔
  • 2020-0708 基准测试/调优
    • FreeBSD Friday
    • 采访:Warner Losh,第 1 部分
    • 构建和运行开源社区
    • 在 FreeBSD 上轻松搭建我的世界(Minecraft)服务器
    • FreeBSD 的新面孔
  • 2020-0506 网络性能
    • 内核中的 TLS 卸载
    • 访谈:Michael W Lucas
    • FreeBSD 桌面发行版
    • 使用 Poudriere 进行 Port 批量管理
    • FreeBSD 的新面孔
由 GitBook 提供支持
LogoLogo

FreeBSD 中文社区(CFC) 2025

在本页
  • 移植 FreeBSD 到 Alpha 平台
  • 设备驱动程序
  • 文件格式
  • 启动
  • 用户空间
  • 内核
  • 移植 FreeBSD 到 IA-64 平台
  • 启动
  • 用户空间
  • 内核
  • 32 位兼容性
  • 传统
在GitHub上编辑
导出为 PDF
  1. 2023-0506 FreeBSD 三十周年纪念特刊

早期的 FreeBSD 移植

上一页FreeBSD 和早期的 Unix 社区下一页FreeBSD 30 周年:成功的秘诀

最后更新于1个月前

  • 原文:

  • 作者:DOUG RABSON

  • 译者:basebyte

自诞生之初,FreeBSD 便专注于为 i386 架构提供稳固的支持。这种 PC 平台普遍易得且相对廉价,将现有资源集中于此有助于使 FreeBSD 在 i386 上保持稳定和高性能。但是,几年后,我们决定扩大支持范围;第一个目标是 DEC 的 Alpha 平台,因为它是 64 位架构的平台,是一个不错的选择。几年之后,我们又增加了对 IA-64 的支持,当时 Intel 将其定位为 i386 的继任者。

移植 FreeBSD 到 Alpha 平台

在 1997 年 5 月初,Jordan Hubbard 征求志愿者来将 FreeBSD 移植到 DEC Alpha 平台。Alpha 是一种 64 位的加载/存储体系结构,与 i386 截然不同,它拥有更多的寄存器和 RISC 指令集。当时的硬件使用了我们熟悉的 PCI 和 ISA 总线接口。

我自愿参加了这个项目。DEC 的 Clem Cole 借给了我们一些硬件,这些硬件于 1997 年 7 月运抵(除了 Peter Wemm 的机器,我记得他的机器好像在海关丢失了)。从那时起,我开始逐渐意识到这个项目需要多少工作量,并且需要在许多不同的领域进行改进。

设备驱动程序

在 FreeBSD 中,特别是针对 ISA 的设备驱动程序,需要进行修改以支持新的 Alpha 架构,因为硬件访问方式有很大的不同。为了使这项工作顺利进行,并在 i386 和 Alpha 平台之间尽可能共享代码,我们需要一个抽象层。

我对此有一些想法,这些想法最终演变成了 FreeBSD 的 newbus 框架。我的计划是从顶层系统设备总线开始自动发现设备,对于 i386 和 Alpha 来说,顶层系统设备总线通常是指 PCI 和 ISA。内核将动态构建设备树,然后将这些设备与可用的驱动程序进行匹配。我还希望能够将这个功能与早先开发的内核链接器(KLD)结合起来,以允许系统在初始引导后添加驱动程序。我在 1997 年末为此开发了一个原型,但并没有进展到支持任何"真实"的硬件驱动程序的程度。

文件格式

在 1997 年,FreeBSD 仍在使用 a.out 文件格式,这是一种非常简单的 32 位格式。而当时大多数其他类 Unix 系统已经在使用 ELF 格式,它提供了更多的灵活性,并且已经支持包括 Alpha 在内的 64 位平台。

改用新格式需要修改编译系统,以支持新格式,并支持动态链接,动态链接是通过运行时链接器(RTLD)在用户区实现的。在 1998 年初的几个月里,包括 John Polstra、Jordan Hubbard、Peter Wemm 和我在内的许多人都在为此而努力。

改用新的文件格式涉及对构建系统的修改,以支持新格式和动态链接。动态链接在用户空间中通过运行时链接器(RTLD)来实现。在 1998 年初的几个月里,包括 John Polstra、Jordan Hubbard、Peter Wemm 和我在内的许多人都在为此而努力。

启动

最初这是该项目的一个不确定领域。Alpha 的"预引导"环境非常分散,Digital Unix (DUX) 和 VMS 使用 SRM 控制台,NT 使用 AlphaBIOS,Linux 则同时使用这两者以及它们自己的 MILO。

在 Alpha 上,任何操作系统都需要一种称为 PALcode 的东西来处理虚拟页转换、缓存、中断以及用户模式和内核模式之间的转换。DUX、NT 和 VMS 都有各自的 PALcode 变体。尽管 DUX 的 PALcode 可能是我们最好的选择,但我们并不清楚是否可以在没有昂贵的许可证的情况下使用它。后来,我们支持的所有 Alpha 硬件都附带有支持 DUX PALcode 的 SRM 控制台,因此这个问题不再是问题。

i386 引导启动代码的大小被限制在 7.5 KB。这个限制来自于 UFS 文件系统格式,它为引导程序保留了 8KB 的区域,而我们需要其中的 512 字节的扇区来让 PC BIOS 进行引导。这只够将 a.out 格式的内核文件从根文件系统读入内存并启动它。

Alpha 也有类似的限制;SRM 控制台使用磁盘的第一个扇区来标识要加载的一系列连续扇区,这样与 i386 一样,UFS 引导区只剩下 7.5 KB 的空间。在 Alpha 上,由于 RISC 架构的代码密度较低以及 ELF 格式所需的额外复杂性,受限的 7.5KB 空间可能不能够装下完整的引导程序。最终我们重新编写了引导程序,使得这 7.5KB 的引导区能够加载一个更大的引导程序(在现代的 FreeBSD 系统中称为/boot/loader)。这给了我们足够的灵活性来完全支持在 i386 和 Alpha 上启动 ELF 格式的内核,以及其他新特性,如预加载内核模块、网络启动等等。Mike Smith 负责多阶段引导的工作,Peter Wemm 负责内核模块预加载。不知从什么时候开始,Forth 解释器被添加进来了---我想这是 Jordan Hubbard 的功劳。

用户空间

在我们开始这个项目时,FreeBSD 的源代码树并没有为简便的交叉编译而设置。这使得构建用户空间的实用程序具有一些挑战性。John Birrell 致力于在 NetBSD 主机上构建大部分 FreeBSD 源代码树,并成功运行了一个具有相当完整的 FreeBSD 用户空间的 NetBSD 内核系统。

NetBSD 的系统调用接口与 FreeBSD 略有不同,因此 John 早期的用户空间程序开发工作使用了 NetBSD 的 ABI 接口。原生的 FreeBSD 内核需要使用 FreeBSD ABI 的实用程序,但这是一个重要的进展。待我们有了一个可用的内核,从混合的 NetBSD/FreeBSD 系统迁移到一个完整的原生 FreeBSD 系统就相对比较简单了。

内核

这可能是整个项目中最大的一部分,它涉及填充内核中的所有与机器相关的部分,为虚拟内存、中断处理、进程上下文切换等提供底层支持。

我通过构建一个 Alpha 交叉编译器,尝试构建内核,看哪些部分无法编译通过,然后填补这些空白,要么使用空的存根,要么从 NetBSD 中导入代码,因为那些代码与 FreeBSD 的代码非常相似。这是一个相当繁琐的过程,花了好几天时间,但最终却得到了一个无法运行的二进制内核文件。

接下来,花费更长时间的移植工作是尝试运行这个内核,看它运行到哪个阶段出现问题,然后解决问题后再进行下一次尝试。为了运行每个测试,我使用了一个名为 SimOS 的工具。它模拟了一台基于 Alpha 的计算机,并配有磁盘和串口等模拟硬件。SimOS 支持使用 gdb 对模拟内核进行调试;这非常有帮助,因为我可以逐步执行非常早期的内核初始化过程,比如设置内核虚拟内存等,然后再进入与机器无关的初始化序列。

为了缩短移植过程,我在适当的地方使用了 NetBSD/alpha 的代码。不幸的是,在一些地方我忽略了 NetBSD 的版权信息。我不得不在提交代码后,在公开场合对这些问题进行更正,这让我感到相当尴尬。这也是 FreeBSD 提交历史被修改的极少数时刻之一---我们删除了版权信息不正确的修订。

在虚拟内存支持方面,使用 NetBSD 的代码是行不通的,因为 FreeBSD 在这方面有很大的不同。Alpha 的页表与 i386 类似,都是采用基于树的三层结构(而 i386 当时使用的是两层结构)。我复制了 i386 的代码并进行了修改,以增加了额外的层级。

Alpha 的初步支持于 1998 年 7 月提交,随后几个月里又推出了对 SimOS 仿真器和真正硬件的支持。FreeBSD 3.0 的发布说明中提到了这一点:“对 DEC Alpha 架构的移植已进入“ALPHA”(haha)状态。”

移植 FreeBSD 到 IA-64 平台

这个项目始于 2000 年,当时 Paul Saab 在 Usenix ATC 年度技术会议上带来了一套 IA-64 的文档,并询问我是否有兴趣将 FreeBSD 移植到这个新平台。当时,雅虎是 i386 上 FreeBSD 的大规模用户,他们的一些工作负载已经达到了 32 位平台的限制。

IA-64 架构在多个方面都非常有趣。其指令编码采用 128 位指令束,每个指令束最多包含三条可同时执行的 41 位指令。这使得它具有大型寄存器集,包括 128 个通用寄存器和 128 个浮点寄存器。

通用寄存器分为两组---32 个“静态”寄存器和 96 个“堆叠”寄存器。处理器会从一个大型寄存器池中分配这些寄存器,并在函数调用和返回时自动保存和恢复。每个寄存器是 64 位,外加一个用于推测执行的 NaT("Not a Thing")位。

条件执行通过 64 个谓词寄存器实现,每个寄存器都是一个比特位,保存比较指令的结果。每条指令都可以根据谓词寄存器的值进行条件执行。

使用 8 个分支寄存器支持间接跳转(例如函数指针),这有助于进行分支预测。

虚拟内存管理由虚拟散列页表(VHPT)控制,该表包含可能的虚拟地址到物理地址映射的子集。软件 TLB 缺失处理程序用于查找 VHPT 中不存在的映射。VHPT 支持两种格式,一种是 "短 "格式,可用于模拟传统的树形页表;另一种是 "长 "格式,即包含冲突链的简单哈希表。

启动

IA-64 硬件使用了 EFI 预启动环境。我在多级引导加载器中添加了对 EFI 的基本支持。在 IA-64 的 EFI 环境中,程序是可重定位的;这需要在 EFI 程序本身中进行处理,而这在调试时可能会很困难。

用户空间

移植 FreeBSD 用户空间工具和实用程序的工作相当简单,因为在这个时候,FreeBSD 构建系统已经支持交叉编译,只需要添加 IA-64 版本的底层库代码,比如字符串比较、内存复制和系统调用等。

内核

我们很幸运能够使用 HP IA-64 仿真器(SKI),Marcel Moolenaar 利用它制作了 FreeBSD 移植程序。它包括一个指令级调试器,对于调试内核早期初始化和陷阱处理非常有帮助。

与 Alpha 相比,内核的移植稍微困难一些。这次,没有其他可供参考的 BSD 移植版本,所以所有的底层支持都是新代码。由于额外的寄存器状态和推测执行以及堆叠寄存器的复杂性,IA-64 架构要求有两个堆栈,一个用于寄存器,另一个用于常规数据,这使得陷阱处理比大多数其他架构要困难得多。

长格式的 VHPT 最终成为 FreeBSD 的虚拟内存系统的一个合理选择。机器无关的虚拟内存系统通过向平台的 pmap 系统发出请求来建立虚拟地址到物理地址的映射。这些映射就是直接添加到 VHPT 中的。

32 位兼容性

在移植过程中,我们使用 Perforce 作为源代码控制工具,当时只有 i386 平台的二进制版本可用。

我希望能在移植过程中在目标平台上使用这个二进制文件,因此我最终实现了 i386 的兼容性,利用了 IA-64 处理器中内置的 i386 支持。这建立在早期 Linux 和 SVR4 仿真工作的基础上,这些工作明确地将系统调用的 ABI 和实现分开。

传统

针对 Alpha 的移植工作,促使了大量必要的支持性开发,这些开发帮助形成了现代的 FreeBSD 内核。从 a.out 到 ELF 格式的过渡是 Alpha 移植的必要步骤,但由于 ELF 迅速成为事实上的标准,使得所有平台上都不再使用 a.out,这避免了我们花费大量精力来支持和扩展过时的格式。事实证明,多阶段引导加载器是一个灵活的平台,它使新的架构移植变得更容易,并支持从现代文件系统(如 OpenZFS)引导。newbus 设备框架促进了驱动程序在不同架构之间的兼容性,并支持动态设备发现,这在设备可随时添加或移除的现代系统中是必需的。

增加对 Alpha 的支持迫使我们解决了内核和用户空间的 64 位兼容性问题。加载/存储架构还暴露了一些其他问题,例如假设对内存进行读 - 改-写操作以设置标志或递增计数器的操作不会受到硬件中断的影响。为了解决这个问题,我们在内核中添加了一组“原子”操作。John Baldwin 对原子框架进行了扩展,以支持 IA-64 的获取/释放语义,并广泛用于支持多 CPU 平台。

IA-64 移植的灵感来自于摆脱 32 位 i386 平台限制同时保留与传统软件的兼容性的需要。虽然这些目标已经实现,但该平台本身并没有达到更简单的 i386 架构的性价比。IA-64 最终在大规模超级计算中找到了自己的定位,但它并不适合大多数 FreeBSD 工作负载,并被 AMD 对 i386 架构的 x86-64 扩展所取代,后者在现代计算环境中无处不在。

此后,FreeBSD 移除了对这两个平台的支持。Alpha 架构是 Digital 与 Compaq 合并后的牺牲品,尽管它一直作为产品存在,直到 2007 年才停止生产。FreeBSD 于 2006 年移除了对 Alpha 平台的支持。对 IA-64 的支持持续时间稍长一些;Marcel Moolenaar 多年来对支持这个平台的多处理器和 NUMA 变体进行了许多改进。2014 年,FreeBSD 移除了对 IA-64 平台的支持,而该平台也于 2021 年停产。


DOUG RABSON 是一名软件工程师,拥有超过三十年的经验,历经上世纪 80 年代的 8 位文本冒险游戏到本世纪 20 年代的每秒 TB 级分布式日志聚合系统。自 1994 年以来,他一直是 FreeBSD 项目的成员和贡献者,目前正致力于改进 FreeBSD 对现代容器编排系统的支持,如 podman 和 kubernetes。

Early FreeBSD Ports