芳菲随春去,碧绿入夏来。我们回顾 FreeBSD 项目在 2019 年第一季度取得的成果。本季度的活动包括 FOSDEM 和 AsiaBSDCon;FreeBSD 期刊现已对所有人免费开放;ASLR 已在 -CURRENT 可用;KPTI 也可以按进程控制。已经启动 11.3-RELEASE 的准备工作,一个团队正在应用 syzkaller 指导的模糊测试来改进内核,此外还有许多其他进展。了解项目中众多新进展和持续工作的最新动态,并寻找适合你的贡献点。
来自 管理页面 所列的各个官方和半官方团队的报告。
联系人:Jenkins 管理员 <jenkins-admin@FreeBSD.org> 联系人:許立文 <lwhsu@FreeBSD.org>
FreeBSD CI 团队负责维护 FreeBSD 项目的持续集成系统及相关任务。CI 系统会定期检查提交到项目 Subversion 代码库的变更是否能成功构建,并执行各种测试和分析结果。构建任务的结果会存档到产物服务器,以便后续测试和调试。CI 团队成员会分析失败的构建和不稳定的测试,并与相关领域的专家合作修复代码或调整测试基础设施。
从本季度开始,我们在 freebsd-testing@ 邮件列表上发布 CI 每周报告,可在 https://hackfoldr.org/freebsd-ci-report/ 查看归档。
此外,我们还致力于扩展测试执行环境以提高代码覆盖率,临时禁用不稳定的测试用例,并为相关问题创建工单,与领域专家合作解决。更多详情请参见 CI 每周报告。
我们已发布 CI 策略的 FCP 草案,并开放意见反馈。
请查看与 freebsd-testing@ 相关的工单,以获取更多信息。
进行中的工作:
修复失败的测试用例和构建任务
在 -CURRENT 上添加 drm Port 的构建测试
在裸机硬件上实现自动化测试
实现嵌入式测试平台
规划运行 ztest 和网络栈测试
通过托管 CI 解决方案,帮助更多第三方软件在 FreeBSD 上实现 CI
联系人:FreeBSD 核心团队 <core@FreeBSD.org>
FreeBSD 核心团队是 FreeBSD 的管理机构。
核心团队成立了一个发布工程章程现代化工作组,该工作组的目标是向核心团队提交一份更新后的发布工程章程,并制定新的发布工程团队运营计划。预计该工作组将在 2019 年 6 月 30 日前完成任务并解散。
核心团队邀请所有 FreeBSD 社区成员参与 2019 年 FreeBSD 社区调查:
https://www.research.net/r/freebsd2019
本次调查旨在收集公众的定量数据,以帮助指导项目的优先事项和发展方向。调查将持续 17 天,并于 5 月 13 日世界标准时间午夜(太平洋夏令时间下午 5 点)结束。(编者注:调查已结束)
核心团队投票批准了 Johannes Lundberg(johalun@)和 Mitchell Horne(mhorne@)的源码提交权限,并批准了 Philip Jocks 的关联成员资格。同时,核心团队投票撤销了 Michael Dexter 的文档提交权限。
在源码提交权限长期未清理,闲置的情况下,核心团队决定收回如下开发者的提交权限。我们感谢他们作为源码提交者对项目的贡献。
Alfred Perlstein(alfred@)
Eric Badger(badger@)
Daniel Eischen(deischen@)
Ermal Luçi(eri@)
Tony Finch(fanf@)
Justin T. Gibbs(gibbs@)
Imre Vadász(ivadasz@)
Julio Merino(jmmv@)
John W. De Boskey(jwd@)
Kai Wang(kaiw@)
Luigi Rizzo(luigi@)
Neel Natu(neel@)
Craig Rodrigues(rodrigc@)
Stanislav Sedov(stas@)
Thomas Quinot(thomas@)
Andrew Thompson(thompsa@)
Pyun YongHyeon(yongari@)
Zbigniew Bodek(zbb@)
联系人:Deb Goodkin <deb@FreeBSDFoundation.org>
FreeBSD 基金会是一家 501(c)(3) 非营利组织,致力于在全球范围内支持和推广 FreeBSD 项目及其社区。资金来源于个人和企业捐赠,并用于赞助和管理软件开发项目、会议及开发者峰会,并为 FreeBSD 贡献者提供旅行赞助。
基金会还采购和维护硬件,以改进和支持 FreeBSD 基础设施,并提供资源来加强安全性、质量保证和发布工程工作。此外,基金会发布市场宣传材料,以推广、教育和倡导 FreeBSD 项目;促进商业供应商与 FreeBSD 开发者之间的合作;并代表 FreeBSD 项目执行合同、许可协议及其他需要法律实体参与的事务。
以下是上个季度基金会为 FreeBSD 所做的一些重要工作:
我们在 FreeBSD 的诞生地伯克利召开了一整天的董事会议,为 2019 年制定高层次规划,包括优先支持的技术和特性、未来 2-5 年的长期规划,以及关于基金会目标和使命的讨论。
年初,我们与一些商业用户进行了会面,帮助他们了解如何与 FreeBSD 项目合作,并了解他们在 FreeBSD 上的使用情况。我们也正在安排 2019 年第二季度及全年更多的会议。作为 501(c)(3) 非营利组织,基金会无法直接为商业用户提供支持,但这些会议有助于促进他们与 FreeBSD 社区的合作。
我们的工作 100% 依赖于捐赠资金支持。今年伊始,我们收到了一些个人和企业的捐赠,包括来自 NetApp、奈飞、英特尔、Tarsnap、倍福自动化、E-Card、VMware 和 Stormshield 的捐款和承诺。我们正在努力让更多商业用户回馈 FreeBSD,以帮助我们继续支持这个项目。如果你愿意帮助我们持续并加强对 FreeBSD 的支持,请考虑捐赠:www.FreeBSDfoundation.org/donate/。
此外,我们还推出了 合作伙伴计划,为大型企业捐赠者提供更多支持。详细信息请访问 https://www.FreeBSDfoundation.org/FreeBSD-foundation-partnership-program/,并分享给你的公司!
基金会通过雇佣技术人员来维护和改进 FreeBSD 的关键内核子系统,增加新功能并修复问题。此外,我们还赞助了多个独立项目,例如 arm64 平台移植、blacklistd 访问控制守护进程移植,以及 VIMAGE 支持的集成,以确保 FreeBSD 在研究、教育、计算及产品开发领域保持竞争力。
本季度,由基金会赞助的 9 名开发人员和项目受赞助者共提交了 241 次代码提交。
本季度启动或推进的项目包括:
FUSE 文件系统 内核支持(更新与修复)
测试和诊断改进 Linux 兼容层
改进 SDIO 和 WiFi 基础设施
x86-64 可扩展性和性能优化
OpenZFS 在线 RAID-Z 扩展
基金会的开发人员也直接参与了一些 FreeBSD 关键改进,包括:
amd64 和 i386 pmap 机制优化与修复
解决 用户态线程库 问题
改进 i386 支持,保持其可用性
改进 FreeBSD 在 RISC-V 平台上的表现
Capsicum 沙箱 框架应用
构建系统 改进和错误修复
安全问题响应 和 漏洞缓解措施 实施
工具链 更新和优化
Syzkaller 覆盖引导系统调用模糊测试的 内核代码覆盖支持
提升 Syzkaller 在 FreeBSD 上的支持
改善 freebsd-update 可用性
提高 网络栈稳定性 并修复竞争条件
确保 FreeBSD 提供现代应用所需的 用户态接口
实现 机器相关优化子例程 支持
文档和 man 手册 更新与修正
DTrace 错误修复
更新 PortFreeBSD Valgrind 并尝试向上游提交修改
基金会雇佣了一名全职员工,专门负责改进 FreeBSD 项目的自动化测试、持续集成(CI)和整体质量保证工作。
在 2019 年第一季度,基金会团队持续改进 FreeBSD 的 CI 基础设施,与贡献者合作修复构建和测试失败的问题,并与项目中的其他团队合作,满足其测试需求。本季度,我们开始在 freebsd-testing@ 邮件列表上发布 CI 周报。
更多信息请参阅本报告的 FreeBSD CI 章节。
基金会提供了一名全职员工,专门负责 FreeBSD 的 发布工程,确保 FreeBSD 在过去五年中能够按时、稳定地发布新版本。
在 2019 年第一季度,FreeBSD 发布工程团队持续为 13-CURRENT、12-STABLE 和 11-STABLE 提供每周开发快照。此外,该团队还发布了即将到来的 11.3-RELEASE 版本周期的时间表,该版本是 stable/11 分支的第四个正式版本,建立在 11.2-RELEASE 的稳定性和可靠性基础上。
即将发布的 11.3-RELEASE 版本时间表 可在此查看:https://www.freebsd.org/releases/11.3R/schedule.html
FreeBSD 11.3 预计将在 2019 年 7 月初正式发布。
更多关于发布工程团队的工作详情,请参阅本季度状态报告的 FreeBSD 发布工程团队 章节。
基金会为 FreeBSD 基础设施提供硬件和技术支持。上一季度,我们持续支持全球各地的 FreeBSD 服务器和硬件资源,以保障 FreeBSD 项目的顺利运行。
基金会的一项重要工作是 推广 FreeBSD 项目。这包括:
宣传 FreeBSD 社区成员的贡献
制作宣传材料,帮助更多人了解 FreeBSD,并降低新用户或贡献者的入门门槛
组织和参与 FreeBSD 相关活动,包括志愿者支持、展台宣传和技术演讲等
基金会赞助了多个全球性会议、活动和开发者峰会。这些活动既包括 BSD 相关会议,也涵盖更广泛的开源技术及面向特定群体的技术活动。我们的目标是:
通过 FreeBSD 相关活动,促进知识共享、项目合作和开发者与企业用户的交流,维护健康的 FreeBSD 生态。
通过非 FreeBSD 专属活动,提升 FreeBSD 影响力,推动 FreeBSD 在不同领域的应用,并吸引更多贡献者加入。
以下是我们在上一季度的部分推广和教育工作:
参加 FOSDEM 2019:
设立 FreeBSD 展台
赞助 FreeBSD 开发者峰会
在 BSD Dev Room 发表 FreeBSD 25 周年 主题演讲
赞助并演讲于 SANOG33(不丹廷布)
代表 FreeBSD 参加 APRICOT 2019(韩国大田)
作为行业合作伙伴,赞助 USENIX FAST 会议(美国波士顿)
SCALE 17x(南加州 Linux 博览会):
首次举办 FreeBSD 专题研讨会
开设 Getting Started with FreeBSD 一日培训班(近 30 名学员,反响热烈)
在展览大厅设立 FreeBSD 展台
赞助、演讲并参展于 FOSSASIA(新加坡)
赞助 AsiaBSDCon 2019
承诺赞助 Rootconf、BSDCan 和 EuroBSDcon
为 阿伯丁黑客松 和 2019 维也纳 FreeBSD 安全黑客松 创建注册系统
提供 FreeBSD 宣传资料
赞助 3 名 FreeBSD 贡献者 参加上述多个活动
此外,我们还持续制作 FreeBSD 宣传材料,方便全球社区成员推广 FreeBSD。
关于更多会议经历和活动回顾,请查阅基金会的 月度通讯。
我们还通过 FreeBSD 期刊教育全球用户,这是一份由专业团队制作的 FreeBSD 期刊。从 2019 年 1/2 月刊开始,该期刊已改为免费发布!
访问 www.FreeBSDfoundation.org/journal/ 获取最新期刊。
了解更多基金会参与的活动和即将举办的会议:www.FreeBSDfoundation.org/news-and-events/
我们还与新的网站开发团队合作,以改进 FreeBSD 官网,使社区成员更方便地查找信息,同时提升网站的整体效率。
基金会持有 FreeBSD 商标,并承担保护其合法权益的责任。此外,基金会还为 FreeBSD 核心团队提供法律支持,以解答各种法律相关问题。
访问 www.FreeBSDfoundation.org,了解我们如何支持 FreeBSD,以及我们如何帮助你!
联系方式:FreeBSD 发布工程团队 <re@FreeBSD.org>
FreeBSD 发布工程团队负责制定并公布 FreeBSD 官方项目发布的时间表、宣布代码冻结以及维护相关分支,等等。
在 2019 年第一季度,FreeBSD 发布工程团队公布了即将发布的 11.3-RELEASE 的初始计划。
FreeBSD 11.3-RELEASE 将是 stable/11 分支的第四个发布版本,它基于 11.2-RELEASE 的稳定性和可靠性。目前计划于 2019 年 7 月初发布 FreeBSD 11.3-RELEASE。
此外,在整个季度中,还为 head、stable/12 和 stable/11 分支发布了多个开发快照构建版本。
这项工作的很大一部分得到了 FreeBSD 基金会的赞助。
联系方式:René Ladan <portmgr-secretary@FreeBSD.org> 联系方式:FreeBSD Ports 管理团队 <portmgr@FreeBSD.org>
一如既往,以下是上一季度 Ports 中发生情况的摘要。
在 2019 年第一季度,Ports 的数量略微下降至略高于 32,500 个。季度末,我们有 2092 个开放的 Port PR。上一季度共有 167 位提交者进行了 8205 次提交。因此,与 2018 年第四季度相比,关闭的 PR 数量更多,提交次数也更多。
在上一季度,我们欢迎了 Kai Knoblich(kai@)的加入,并同 Matthew Rezny(rezny@)告别。
在基础设施方面,引入了两个新的 USES(azurepy
和 sdl
),同时移除了 USES=gecko
。Lazarus 和 LLVM 的默认版本分别提升至 2.0.0 和 8.0。一些已到生命周期终点的大型 port 框架被移除,包括 PHP 5.6、Postgresql 9.3、Qt4、WebKit-Gtk 以及 XPI。Firefox 更新到了 66.0.2,Firefox-ESR 更新到了 60.6.1,Chromium 更新到了 72.0.3626.121。
在上一季度, antoine@ 进行了 30 次 exp-run 以更新软件包,从 GNU ld 切换到 LLVM ld,并将 clang 切换至 DWARF4。
这些项目跨越多个领域,从内核和用户空间到 Ports 及外部项目。
联系方式:Ganbold Tsagaankhuu <ganbold@FreeBSD.org>
AXP803 是一款高度集成的 PMIC,面向锂电池(锂离子或锂聚合物)应用。它为例如 Allwinner A64 SoC 等处理器提供灵活的电源管理解决方案。该 SoC 被用于 Pinebook。
对 AXP803 驱动程序进行了以下更新:
在激活中断时启用了必要的位,从而能够从中断状态寄存器中读取部分事件。这些事件通过系统 “PMU” 以及 “Battery”、“AC” 和 “USB” 子系统报告给 devd,例如插入/拔出、电池缺失、充电完成和正在充电等状态。
为 AXP803/AXP813 添加了传感器支持。通过 sysctl 可获取电池充电、充电状态、电压、充电电流、放电电流和电池容量等传感器数值。
添加了用于设置电池充电电流的 sysctl。充电电流可通过 0 至 13 的步长进行设置,这些步长分别对应 200mA 至 2800mA,每步的粒度为 200mA。
联系方式:Michal Stanek <mst@semihalf.com>
联系方式:Marcin Wojtas <mw@semihalf.com>
Semihalf 团队继续致力于 FreeBSD 对 Broadcom BCM5871X SoC 系列 的支持。
BCM5871X 是面向网络应用(例如 10G 路由器、网关、控制平面处理和 NAS)的四核 64 位 ARMv8 Cortex-A57 通信处理器。
自上次更新以来已完成的工作:
iProc PCIe 根复合体(内部和外部总线)
OTP(一种一次性可编程存储器)驱动
正在进行中的工作:
BNXT 以太网支持
用于 IPsec 卸载的加密引擎加速
待办事项
工作合并到上游。预计这部分工作将在 2019 年下半年提交并合并到 HEAD。
此项目由 Juniper Networks, Inc. 赞助。
联系方式:Konstantin Belousov <kib@freebsd.org>
对 C 运行时做了多项修改,总体上改善了应用程序运行时的环境。
一些库(其中最突出的是由 NVidia 提供的仅以二进制形式发布的 libGL.so.1)使用所谓的初始执行模式(initial exec mode)来访问 TLS 变量。该模式是 TLS 访问最快的方式,但其缺点在于它只有在主二进制文件与该库静态链接时才能可靠工作,也就是说,运行时通过 dlopen 加载该库不一定能正常运作。
这种模式的原理是:在可执行文件初始化期间为对象分配一个区域,用以存放 TLS 变量,这也正是该模式名称的由来。显而易见的后果是,如果该库在之后加载,那么应用程序在 TLS 区域就没有足够空间存放其 TLS 变量。
FreeBSD 动态链接器意识到部分应用构建者的不当做法,因此在 TLS 区域预留了一定的富余空间以供此类库使用。但问题在于,库中 TLS 段的初始内容并未分配到各线程的 TLS 区域,仍然会导致使用初始执行模式的库出错。
另一个在一定程度上缓解这种问题的措施是动态段中的标志 DF_STATIC_TLS 。该标志允许链接器提前检查所需空间,并在总需求空间不足时避免加载依赖项。此链接器标志由 BFD ld 链接器实现,但 LLVM lld 链接器尚未支持。
现已修正 FreeBSD 动态链接器,能够正确地将 TLS 初始化数据分发到所有线程的初始段,这项修正需要对 libc 和 libthr 针对各架构做出较大改动。同时,LLD 也得到了改进,现在能为使用初始执行 TLS 模式的库打上相应标记。
这些措施应能使 FreeBSD 更加健壮,能够容忍那些链接不当的库。对于使用 NVidia libGL 库的用户来说,这一修复尤为关键,因为该问题无法通过重新链接来解决。
FreeBSD 在 libthr 中实现互斥锁时,会分配一部分内存来保存互斥锁初始化所需的数据。而 FreeBSD 默认使用的 jemalloc(3) 内存分配器要求在其运行时能够使用正常工作的 pthread 互斥锁。
这在可执行文件启动期间就造成了“先有鸡还是先有蛋”的问题,并迫使 jemalloc 提供一些脆弱的变通方法来完成互斥锁的初始化。这一直是 jemalloc 新版本导入时产生不匹配问题的根源。
而 FreeBSD 的 rtld 实现中已经包含了一个非常轻量的 malloc 实现,适合在 C 运行时初始化前的受限环境中使用。这个轻量级的分配器正好可以用于为 pthread 的私有互斥锁内存分配内存。通过采用这个分配器,终于能够解决 jemalloc 与 libthr 之间的循环依赖问题。
已经重命名 rtld 中 malloc.c 的入口函数,以避免与 libc 导出的符号冲突,现在该文件已被静态链接到 libthr 中,为私有互斥锁和 pthread 键存储提供内存分配支持。后者之前已因相似原因改为直接使用 mmap(2)。这样,当键存储所需内存不足一页时,也能减少内存浪费。
Alexander Kabaev (kan@) 注意到,在链接的共享库中,静态对象的 C++ 析构函数的执行顺序居然早于主二进制文件中静态对象的 C++ 析构函数。这一现象在 clang++ 和 g++ 中均得到了验证,但有趣的是,使用 __attribute__((destructor))
标记的析构函数则不受此影响。
该 Bug 出现在主二进制文件启动时,由 rtld 而非 csu(通常来自 crt1.o 的 C 启动代码)调用 init 函数和 init 数组时。其根本原因在于析构函数的调用机制较为复杂:既涉及 fini/fini 数组,也涉及 rtld 注册的 atexit(3) 处理程序。
解决方案是在调用主二进制文件的 init 函数之前,使用新的内部 ABI 函数 __libc_atexit()
注册 rtld 的 atexit(3) 处理程序。
有趣的是,这个 Bug 居然多年未被发现。
此项目由 FreeBSD 基金会赞助。
联系方式:Enji Cooper <ngie@freebsd.org>
联系方式:Mark Johnston <markj@FreeBSD.org>
联系方式:Ed Maste <emaste@freebsd.org>
联系方式:Mariusz Zaborski <oshogbo@FreeBSD.org>
联系方式:Bora Özarslan <borako.ozarslan@gmail.com>
Capsicum 工作主要围绕以下三个主题展开:
将 Google 的 Capsicum 测试套件引入 FreeBSD
为 FreeBSD 移植并沙盒化 openrsync
将 Capsicum 应用于更多基本系统工具
基于 Googletest 的 Capsicum 测试用例现已集成到 FreeBSD 中。经过与 Capsicum 在 Linux 平台上移植的主要维护者及开发者 David Drysdale 讨论后,我们决定从现在起,FreeBSD 将成为 Capsicum 测试用例的上游。
接下来的主要步骤是对 openrsync 进行沙盒化。在这项工作过程中,我们为 fileargs 服务扩展了两项新功能:一是修改 fileargs 服务以限制可执行的操作,二是现在可以将 lstat 调用委托给 Casper 服务。
此外,openrsync 对 fts API 依赖较大。我们花费了一些时间对 fts 进行了优化,并通过引入 fts_openat 函数以及消除遍历路径时更改工作目录的需求,使其更适合在沙盒环境中使用。目前,对 fts API 的改动正处于测试阶段。
另外,我们改进了非 FreeBSD 机器的引导程序构建。得益于这项工作,我们现在可以构建出那些依赖 Casper 服务来引导 FreeBSD 的工具,结果在基本系统中,strings 工具也实现了沙盒化。
同时,我们还对 rtsol、rtsold 和 savecore 进行了沙盒化。
我们每两周举办一次 Capsicum 电话会议。会议记录已发布在 FreeBSD 的 Capsicum 会议仓库(GitHub 上)。如果你想加入会议,请随时发送邮件联系我们。
联系方式:Kris Moore <kmoore@FreeBSD.org>
TrueOS 项目一直在开发 Package Base 的实现,并很高兴地向 FreeBSD 社区发布了首个 CFT。
TrueOS 的打包工作已开展近 6 个月,与原有的 FreeBSD package base 努力有所不同,因为它是一种“树外”(out of tree)的实现。该实现允许对任意版本的 FreeBSD 进行打包,仅需要对 poudriere 打一个补丁,以及进行一些小幅度的 ports 增强工作(其中一项目前正 在审核中)。有关当前状态的更多信息,请参阅 FAQ 页面。
此外,在 BSDCan 2019 上还将成立一个 工作组,我们鼓励各位 porters 参加并加入讨论。
此项目由 iXsystems Inc. 赞助。
联系方式:Michal Krawczyk <mk@semihalf.com>
联系方式:Marcin Wojtas <mw@semihalf.com>
ENA(Elastic Network Adapter)是 Amazon Web Services (AWS) 虚拟化环境中提供的智能网卡。ENA 驱动支持多个发送和接收队列,并能根据所用实例类型处理高达 100 Gb/s 的网络流量。
类似于 Linux 和 DPDK,ENAv2 正在为 FreeBSD 开发中。自上次更新以来,我们对补丁进行了内部审查和改进,并在各种 AWS 实例上完成了验证。
待办事项
将 ENAv2 补丁上游合并
最近,AWS 发布了 A1 实例——这是一种基于 arm64 架构的实例。FreeBSD 内核已进行了相应修正,因此在这些实例上可以无障碍使用 ENA 驱动。为此,ENA 驱动在资源激活方面做了一些修改(见 r345371),并在 aarch64 的 nexus 模块中增加了缺失的总线释放方法(见 r345373)。经过这些修改,ENA 驱动现已能在 A1 实例上运行,且没有已知问题。
此项目由亚马逊公司赞助。
联系方式: Michal Stanek <mst@semihalf.com>
Marcin Wojtas <mw@semihalf.com>
Kornel Duleba <mindal@semihalf.com>
FreeBSD 在 2018 年底获得了 TPM 2.0(可信平台模块)的支持。同时,还新增了一个内核配置选项 TPM_HARVEST
,用于将 TPM 随机数生成器作为系统熵源使用。当以这种方式使用时,TPM 每十秒便可收集一次熵,并混入操作系统的熵池中。目前,该内核选项在 amd64 GENERIC 内核配置中处于默认禁用状态。
由 Semihalf 开发的 UEFI 安全启动支持现已与 sjg 的 Veriexec 支持合并,形成了一个统一的库,命名为 libsecureboot。该库由加载器用于验证内核及其模块,内部采用 BearSSL 作为加密后端。它支持从 UEFI(DB/DBx 数据库)中加载可信与黑名单证书,并可将这些证书作为验证时的信任锚。
此外,该库还被 Veriexec 用于验证和解析内核中的认证数据库(称为“清单”)。此前,这个清单由用户空间的应用程序验证和解析后,再通过 /dev/veriexec
传递给内核,这一方式存在明显的局限性和安全隐患。
待办事项
将改动移植到 stable 分支。
特别感谢 sjg 和 Juniper 在 Veriexec 以及 libsecureboot 开发过程中所进行的富有成果的合作。
该项目由 Stormshield 赞助。
联系方式: Alan Somers <asomers@FreeBSD.org>
FUSE(用户空间文件系统)能在用户空间程序实现文件系统。它被广泛用于支持诸如 NTFS 这样的树外文件系统,以及 sshfs 等特殊伪文件系统。FreeBSD 的 fuse 驱动最初作为谷歌编程之夏项目于 2012 年引入,但自那以后便基本被忽视。目前的 FUSE 软件存在诸多 bug 且已过时,我们的实现落后于最新版本约 11 年。
FreeBSD 基金会已同意赞助此项目,以改善 FreeBSD FUSE 驱动的现状。到目前为止,我已为 fusefs(5) 模块编写了测试套件,修复了一个此前报告的 bug,发现并修复了 6 个新 bug,解决了所有 fusefs 的 Coverity CID 问题,做了一些小幅性能提升及常规清理工作。在接下来的季度中,我计划继续修复 bug,并在本季度结束前尽可能提升驱动的 API 级别。目前驱动的级别为 7.8,而定义的最高级别为 7.28。
该项目由 FreeBSD 基金会赞助。
联系方式: Yoshihiro Ota <ota@j.email.ne.jp>
FreeBSD 系统仍在使用非常古老的 zlib 版本(有 20 余年历史,即 1.0.4 版本)。FreeBSD 内核中 zlib 的实现包含了一些仅供 netgraph 使用的特殊增强功能。另外,还有一份源自 unzip 5.12 的代码版本,用于在内核中解压 gzip 文件,该代码可以被替换为更现代的 zlib。更多详细信息请参见审核中的 sys/modules/zlib/README
。
为了使用最新的 zlib(1.2.11 版本),我们对系统中所有现有的 zlib 用法进行了重新审视。大部分代码可以直接与新版 zlib 协同工作,而 unzip 代码则需要进行一些转换以适应新版 zlib。部分调用者可以借助新版 zlib 中提供的一些新 API 得到简化。同时,也有一些已经损坏的“僵尸”程序需要被删除。
这项工作将清理僵尸程序和重复的 zlib 代码,同时也会使未来 zlib 版本的更新变得更加容易。
这些改动涉及系统中的一些极为敏感的区域,如内核加载,或与特定体系结构相关(例如 armv6/armv7),同时还涉及一些遗留代码(如 i386 上的 kgzip+kgzldr)。欢迎测试者和这些遗留 zlib 代码的活跃用户参与测试。
armv elf_trampoline arm 架构(最高至 v5)可以从 gzip 压缩的内核启动。此代码已修改为使用新版 API 以简化实现。请验证经过新代码后,gzip 压缩的内核仍能正常启动(当前代码在失败时会回退到旧版 zlib)。同时,请详细说明如何链接此类内核——这一部分我仍在努力弄清。
netgraph 压缩/解压缩 请协助测试和/或说明如何进行测试。Netgraph 在编译时使用了 FreeBSD 内置的 zlib 版本。
gzipped a.out 是否仍有人使用 gzip 压缩的 a.out 可执行文件?如果有,是否有人能提供一个简单且安全的运行程序?另外,a.out 格式是否仅适用于 i386?
zfs 启动 目前是否可以从 gzip 压缩的文件系统启动?
CTF 正在探索如何进行相关测试。
联系方式:Ed Maste <emaste@freebsd.org>
在 FreeBSD-HEAD 和 12.0 中,默认的 FreeBSD 系统链接器(即 /usr/bin/ld
)已经切换为 LLVM 的 lld,适用于 amd64、arm64 和 armv7 架构。而在 i386 平台上,12.0 中 lld 被用作引导链接器(即用于构建内核和基本系统),但由于启用 lld 时在构建 FreeBSD ports 时会出现多种问题,所以它尚未作为系统链接器正式启用。
影响 i386 的主要问题在于,许多 ports 构建共享库时使用了位置相关代码(即非 PIC 代码)。这可能是因为省略了 -fPIC 编译选项,或使用了手写的依赖位置的汇编代码。相比其它 CPU 架构,i386 的位置无关代码效率较低,这可能促使 port 作者明确选择避免使用 PIC。
默认情况下,lld 不允许在共享对象中使用位置相关代码(特别是不允许对只读段进行重定位——通常这些段包含 .text
部分)。
在过去的一个季度中,Ports 中提交了许多补丁,以修复当系统链接器为 lld 时的构建问题。这些补丁有的是通过构建 PIC 代码解决问题,有的是添加了 -znotext 链接器标志以允许对只读段进行重定位,还有的是在发现与 lld 不兼容的情况下直接切换为使用 GNU ld 进行链接。
目前,关于使用 lld 作为系统链接器时链接 ports 出现问题的 Bug 报告仅有几十个,我预计 FreeBSD 12.1 在 i386 上也将会使用 lld 作为系统链接器。
任务:
修复使用 lld 的 freepascal/Lazarus Ports
分类并解决剩余的 port 链接失败问题
对 Ports 中所有与 lld 相关的变通方案进行整体审查,以确定哪些更改已经不再需要、哪些问题应在 lld 中解决、或哪些应上游提交
该项目由 FreeBSD 基金会赞助。
联系方式:Slava Shwartsman, Hans Petter Selasky, Konstantin Belousov <freebsd-drivers@mellanox.com>
mlx5 驱动为基于 ConnectX-4(LX)、ConnectX-5(EX) 和 ConnectX-6(DX) 的 PCI Express 适配器提供支持;其中,mlx5en 驱动负责以太网支持,而 mlx5ib 驱动则为 InfiniBand 以及基于融合以太网的 RDMA(RoCE)提供支持。
在 mlx5 驱动中,以下更新已完成:
增加对 ConnectX-6 与 ConnectX-6dx 设备的支持:这些设备支持最高可达 200Gb/s 的接口速率!
增加对 ConnectX-6dx 设备的 TLS 硬件卸载支持:TLS Tx 加密卸载是网络设备的一项新功能,它使内核 TLS 套接字在数据传输时可以跳过加密和认证操作,将这些操作委托给网卡处理。网卡会即时对属于被卸载 TLS 套接字的数据包进行加密,而不会修改任何数据包头部。它期望接收到完整帧的 TCP 数据包,其中包含 TLS 记录作为有效负载。网卡会将明文替换为密文,并填充认证标签,同时仅保存加密下一个预期数据包所需的上下文(如预期的 TCP 序列号和加密状态)。
增加对动态接收队列中断调节(DIM)的支持:动态中断调节指硬件和/或软件在运行时采取的措施,以控制系统中断频率。这种调节本身不应干扰系统运行,也无需人工干预。在网络场景中,动态中断调节用于控制硬件在多种流量条件下产生的中断速率。
增强自愈机制支持:在极少情况下(例如因固件 Bug 导致),Mellanox 网络适配器可能发生故障,此时驱动会感知到灾难性错误,并触发对设备的固件重置,以便设备能够恢复正常运行,而无需重启整个主机。
增加对驱动内固件更新的支持:通过使用 mlx5tool 实现驱动内固件更新。
该项目由 Mellanox Technologies 赞助。
联系方式:Konstantin Belousov <konstantinb@mellanox.com>
有时系统需要重置某个设备。理想情况下,设备重置应在不重启整台机器的前提下完成。对于 USB 设备,如果有物理接入,可以简单地重新插拔设备;而对于机箱内部、内建或附加卡上的设备,除非设备支持热插拔,否则无法通过物理操作实现重置。不过,对于典型的现代 PCIe 设备以及大多数内置的 PCI 模拟设备,均可通过软件操作发起重置。
如果设备是真正插入的 PCIe 设备,则可以通过禁用设备后再由上游端口控制重新训练 PCIe 链路来启动重置。对于大多数支持 PCI 电源管理规范的 PCI 设备,经过验证的重置方法是将设备置于 D3 状态(关机状态),然后恢复到之前的电源状态。
此前,FreeBSD 缺乏一种便捷的方法来请求用户或驱动程序发起设备重置。虽然用户可以通过 pciconf 手动修改寄存器来实现重置,但这种方法不切实际,并且要求驱动程序编写大量样板代码。
为此,在 newbus 总线接口中新增了 BUS_RESET_CHILD() 方法,并为 PCIe 桥和 PCI 设备提供了相应实现。libdevctl(3) 库调用和 devctl(8) 命令为应用程序和系统管理员提供了便捷的用户空间接口。
在重置过程中,设备驱动必须停止对设备的操作。一种实现方法是在重置前卸载驱动,重置后再重新加载驱动。对于网络接口来说这种方式基本可行,但其他设备则可能需要更多协调。例如,对于 NVMe 磁盘设备来说,卸载驱动意味着所有挂载卷会突然从 VFS 中消失。因此,BUS_RESET_CHILD() 方法允许调用者在重置前后选择“卸载/重新加载”或“挂起/恢复”驱动操作。
Mellanox 利用这一机制,在固件重置后对 mlx(5) 卡进行重置,而无需重启服务器。人们相信,“devctl reset” 将会更广泛地被应用。
该项目由 Mellanox Technologies 赞助。
联系方式:Konstantin Belousov <kib@freebsd.org>
来自 review D5603 的 ASLR(地址空间布局随机化)补丁已被提交至 svn。尽管对于 ASLR 目前及未来能提供的安全价值仍存在争议,但在 FreeBSD 源码树中实现 ASLR,使其能方便地供那些希望使用它的用户使用,同时也将讨论重点从相对优缺点转向更全面的安全控制措施。
KPTI(内核页表隔离)的实现被设计为使大多数页隔离模式的选择局限于当前地址空间。换句话说,全局控制变量 pti 在大部分代码路径中几乎没有被使用,而是直接将用户/内核的 %cr3 值加载到寄存器中,或通过比较判断用户页表是否已被修剪。部分遗漏的代码由 Isilon 提供,随后修复了相关 Bug,并移除了 pti 的最后直接使用之处。
现在,当系统以启用 pti 模式启动时,root 用户可以使用 proccontrol(1) 有选择地为进程的子进程禁用 KPTI 模式。其动机在于,如果你信任所运行的程序,则可以恢复非 pti 系统调用的速度,同时依然在 PTI 模式下运行常规用户会话。例如,Firefox 就可以得到适当的隔离。
每个 FreeBSD 可执行文件现在都包含一个位掩码,用于启用或禁用对该二进制文件来说合理的安全相关特性。该掩码是加载映像时可执行段的一部分,因此也是验证二进制内容的一种合理手段。
例如,ASLR 兼容性实际上是映像的属性,而非执行映像的进程的属性。掩码中的第一位(即位 0)用于控制 ASLR 的退出。其他操作系统(例如 Solaris)采用了特定于操作系统的动态标志,虽然这些标志在运行时具有相同属性,但在特性控制位中消耗的位更少。
在映像激活过程中,内核和 rtld 都会读取该特性控制掩码。预计未来 FreeBSD 将会添加更多特性,而该掩码可用于启用或禁用这些新特性。
预计不久将提供一个用于操作该掩码的工具,详见 review D19290。
该项目由 FreeBSD 基金会赞助。
更新平台相关的特性,并引入对新硬件平台的支持。
联系方式: Ruslan Bukin <br@FreeBSD.org>
Mitchell Horne <mhorne@FreeBSD.org>
Mark Johnston <markj@FreeBSD.org>
在过去的一个季度中,RISC-V 移植工作持续进行。
在 RISC-V 移植中增加了透明超级页提升(transparent superpage promotion)的支持,这意味着应用程序在可能的情况下会自动使用大页映射。新增了每 CPU 的 pmap 激活跟踪功能,从而降低了各类 pmap 操作的开销。这显著提升了 FreeBSD 在多 CPU 虚拟机环境下的响应速度。
同时,RISC-V 的 minidump 实现已完成。对 RISC-V 内核转储的调试支持将在下一次 GDB 版本发布后,合并到 devel/gdb 中。
现在,通过在 /etc/src.conf
中设置 WITH_LLVM_TARGET_RISCV=YES
,即可编译内置于源码树中的 LLVM RISC-V 目标。目前使用 LLVM 编译 RISC-V 移植还处于实验阶段,相关工作仍在进一步调查中。
另外,随着一块 SiFive 的 HiFive Unleashed 开发板已被一位 FreeBSD 开发者获得,对在该开发板上运行 FreeBSD 的工作也在进行中。同时,我们还计划对新版 SBI(Supervisor Binary Interface)规范的支持展开工作。
该项目由 FreeBSD 基金会、美国国防高级研究计划局、美国空军研究实验室赞助。
对 Ports 产生影响的变更,无论是涉及整个 Ports 的大范围更新,还是针对个别 ports 的调整。
联系方式: Koop Mast <kwm@FreeBSD.org> Eric Turgeon <ericbsd@FreeBSD.org>
本季度 GNOME 相关 ports 的活动包括:
x11-toolkits/gtk30 port 更新到 3.24.5,随后又更新到 3.24.7。
www/webkit2-gtk3 port 更新到 2.24.0。
旧的、不安全的 webkit-gtk2 和 webkit-gtk3 最终被移除。
正在进行中的工作(各分支均已在 GNOME 开发仓库中提供,请参见上方链接):
Eric Turgeon 正在 mate-1.22 分支上进行 MATE 1.22 的工作,目前已接近完成。
Charlie Li(IRC: vishwin)正在对 Cinnamon 桌面进行一次长期拖延的更新,目前该更新也已接近完成,唯一真正的障碍是屏幕保护程序激活后无法解锁。相关工作在 cinnamon 分支中。
Koop Mast 正在推进 GNOME 3.32 的更新。除了当前无法正常工作的 gdm 外,桌面环境基本可用。由于时间有限,该项工作进展较慢,目前可在 gnome-3.32 分支中查看进展。
欢迎有意贡献的朋友加入我们的讨论,你可以在 Freenode 上的 #freebsd-gnome 频道找到我们。
联系方式: Adriaan de Groot <adridg@FreeBSD.org> Tobias C. Berner <tcberner@FreeBSD.org>
本季度 KDE 相关的两项最大成就为:
从 Ports 中移除了 Qt4 及其所有依赖者。
由 kai@ 完成了 www/qt5-webengine 的更新,将版本从老旧的 5.9.4 更新至 5.12.x。
此外,我们还保持 KDE Frameworks、Plasma 以及 Applications 等 ports 与上游版本同步更新,由于上游的 FreeBSD-CI,使用的补丁也越来越少。
所有由 kde@ 维护的 ports(包括 cmake)均已与其上游版本保持同步更新。
下个季度的计划(无特定顺序)包括:
清理 PyQt ports 以及 pyqt.mk 文件
改进 qt.mk 组件
更新 sddm 至 0.18.x 版本
在系统设置中实现用户管理功能(编写非 logind 后端)
欢迎有意贡献的朋友通过 Freenode 上的 #kde-freebsd 频道或 kde@FreeBSD.org 邮件列表联系我们。我们也欢迎通过 GitHub(github.com/freebsd/freebsd-ports-kde)提交 pull request 以及贡献代码。
许多项目基于 FreeBSD 构建,或者将 FreeBSD 的组件整合进自己的项目中。由于这些项目可能会引起更广泛的 FreeBSD 社区的兴趣,我们有时会在季度报告中包含这些项目提交的简要更新。FreeBSD 项目对于这些提交中所涉及内容的准确性或真实性不作任何保证。
联系方式:Trevor Roydhouse <fbsdwiki@gmx.net>
过去一个季度中,关于 Apple Intel Mac mini 的 FreeBSD Wiki 页面已得到全面更新,将其信息从 2009 年更新到 2019 年。
现在,页面中包含了针对 2007 年至 2014 年机型安装 FreeBSD 作为唯一操作系统的详细说明,以及针对各具体机型的 FreeBSD 支持的详细条目。
如果有人愿意参与,我们需要更多针对 macmini 1,1 以及 6,1 至 8,1 机型的具体信息,并需要有人测试 asmc(4) 驱动的补丁,以便获得温度传感器反馈和设置风扇转速的功能。如果你愿意提供帮助且有这些 Mac mini 的使用条件,请与我联系。
未来的任务包括:
为所有 Intel Mac mini 制作并测试更多 asmc(4) 的补丁
提供关于 2006、2012、2014 及 2018 机型 Mac mini 的更多信息
制作双系统(macOS/FreeBSD)安装的说明
联系方式: Mark Johnston <markj@FreeBSD.org> Andrew Turner <andrew@FreeBSD.org> Michael Tuexen <tuexen@FreeBSD.org> Ed Maste <emaste@FreeBSD.org>
Syzkaller 是一款基于覆盖率引导的系统调用模糊测试工具,最初为 Linux 开发。它能够以程序化方式生成由随机系统调用序列构成的测试程序,并在虚拟机 (VM) 中运行这些程序。通过利用名为 kcov 的内核代码覆盖率设施提供的反馈,syzkaller 会对生成的测试程序进行变异,旨在扩展内核中被执行的代码路径覆盖率。有时,执行某个很少或不常用的代码路径可能会导致内核崩溃。当 syzkaller 成功在虚拟机中使内核崩溃后,它会尝试生成一个最小的测试用例来重现该崩溃,从而简化调试过程。Syzkaller 在查找内核 Bug 方面非常有效,在 Linux 中已经发现了数百个问题。过去几年中,syzkaller 的作者 Dmitry Vyukov 已为其添加了对其他操作系统(包括 FreeBSD)的支持。
最近,许多 FreeBSD 开发者使用 syzkaller 来查找和修复 FreeBSD 内核中的 Bug。如果有兴趣,可以在提交日志中搜索 “syzkaller” 以查看相关示例。Syzkaller 可以在 FreeBSD 或 Linux 主机上运行,用于对在 QEMU 实例中运行的 FreeBSD 进行模糊测试,也可以对运行在 GCE(Google Compute Engine)上的 FreeBSD 进行测试。此外,Google 还维护了一个专门的 GCE 主机集群,用于持续模糊测试多个操作系统内核的最新构建版本。最近添加了一个 FreeBSD 目标。你可以订阅谷歌群组 syzkaller-freebsd-bugs ,以接收新发现 Bug 的通知。
目前正在改进 syzkaller 对 FreeBSD 系统调用覆盖的工作。特别是,为了使其发挥作用,需要让 syzkaller 了解目标内核所有的入口点及其参数类型。许多标准 POSIX 系统调用已被覆盖,但大多数 FreeBSD 特有的系统调用尚未支持。同样,许多 ioctl(2) 的定义也缺失。
部分正在进行的工作旨在为 syzkaller 添加对 bhyve 作为 VM 后端的支持,从而简化在 FreeBSD 上对 FreeBSD 虚拟机进行模糊测试。目前可以使用 QEMU 完成此工作,但在 FreeBSD 上 QEMU 缺乏硬件加速支持。有关实现细节,请参阅 PR。
最后,syzkaller 发现的部分 Bug 尚未被修复。如果你有兴趣参与上述工作,请邮件联系上面列出的联系人。
该项目由 FreeBSD 基金会赞助。
联系方式:Alfonso Sabato Siciliano <alfonso.siciliano@email.com>
系统调用 sysctl()
可以获取或设置系统中某个“属性”的值。一个“属性”还包含其他信息(如描述、类型、标签等),这些信息对于构建诸如 /sbin/sysctl
之类的实用工具是必需的,例如:
首先,sysctlmibinfo 封装了未公开的内核接口,并提供了一个简便的 C API: sysctlmif_name()、sysctlmif_description()、sysctlmif_info()、sysctlmif_label()、sysctlmif_nextnode() 以及 sysctlmif_nextleaf(),用于获取一个“属性”的信息。
此外,sysctlmibinfo 提供了一个高级 API:它定义了一个结构体 struct sysctlmif_object,并提供了一些函数,如 sysctlmif_filterlist()、sysctlmif_grouplist() 和 sysctlmif_tree(),用于构建对象的列表和树。
你可以使用该库快速构建一个定制的 sysctl 实用工具。例如,deskutils/sysctlview
(用于图形浏览 sysctl MIB 树的工具)的核心仅仅是调用 sysctlmif_tree(),然后遍历生成的树来展示其中的 sysctlmif_object 节点。
注意,实际上一个“属性”是 sysctl MIB 的一个 OID,由 sys/sysctl.h 中定义的 struct sysctl_oid 实现。
链接 gitlab.com/alfix/sysctlview 网址: https://www.gitlab.com/alfix/sysctlview 联系方式:Alfonso Sabato Siciliano alfonso.siciliano@email.com
移植: deskutils/sysctlview
FreeBSD 的内核维护着一个管理信息库(Management Information Base,MIB),其中的对象作为属性供 sysctl()
系统调用和 /sbin/sysctl
工具对系统进行调优使用。sysctlview 工具是一款“图形化 sysctl MIB 浏览器”,它依赖于 gtkmm(用于构建图形用户界面)和 sysctlmibinfo(用于从内核中获取信息)。
版本 1.0 提供了两个 “TreeView” 视图:
“Main”:显示 ‘name’(名称)、‘description’(描述)、‘type’(类型)、‘format’(格式)和 ‘value’(值)。
“Flags”:显示 ‘name’(名称)以及每个在 sys/sysctl.h 中定义的 ‘flag’ 对应的一列。
各行均可“点击”以显示其他信息(例如,‘label’ 标签)。目前,sysctlview 能够显示数值和字符串类型的值,对某些不透明类型值的支持将在未来添加。
联系方式:Ed Maste emaste@freebsd.org
在 2019 年 1 月至 4 月学期,FreeBSD 基金会再次从滑铁卢大学聘请了两名合作教育(co-op)学生。
Gerald Aryeetey 是一名二年级的计算机工程专业学生。Gerald 起初研究了 FreeBSD 工具链中的一个问题——我们的静态库归档工具(ar)无法读取或写入 64 位格式的归档文件。为此,Gerald 提交了对 libarchive 的修改以支持 64 位归档,随后又对 FreeBSD 的 ar 工具进行了修改,增加了对 64 位格式的支持。
之后,Gerald 查阅了 FreeBSD Bugzilla 数据库中与 freebsd-update 相关的多个问题,并提交了许多修复补丁。目前,大约有十几项修复已被合并入 FreeBSD,还有更多补丁正在审核中。
此外,Gerald 还参与了 FreeBSD 基金会的硬件持续集成工作。该原型系统能基于每次提交构建 FreeBSD,并在 BeagleBone Black 和 Pine64 LTS 上进行测试。该原型将在不久的将来转变为一个永久、公开的安装系统,届时还会增加更多的测试设备。
作为他的最终项目,Gerald 打算为 Microchip LAN743x PCIe 网卡编写一个设备驱动程序。
Bora Özarslan 是一名三年级的计算与金融管理专业学生。Bora 最初也关注 FreeBSD 工具链问题,他的工作从对 FreeBSD 的 readelf(来自 ELF 工具链项目)的改进和 Bug 修复开始。
Bora 开发了一个工具,用于修改 ELF 二进制文件中的特性控制位——例如,允许与 ASLR(地址空间布局随机化)不兼容的二进制文件申请退出 ASLR。作为其 readelf 工作的一部分,Bora 还增加了报告特性控制位状态的功能支持。
随后,Bora 继续研究安全相关主题,尝试将 Capsicum 沙盒技术应用于 Kristaps 的 BSD 许可 rsync 实现——openrsync。此项工作首先需要在 cap_fileargs 中实现 fileargs_lstat 支持(现已提交),以及对 fts 目录层次例程进行必要的修改(这些修改尚未提交至 FreeBSD)。
在接下来的工作学期中,Bora 将研究并测试未经修改的 Linux Docker 容器在 FreeBSD 上的运行情况,以评估 Linux 兼容层支持的现状。
该项目由 FreeBSD 基金会赞助。