用户现在可以通过利用系统的 Linux 兼容层和特定的内核补丁来修复目录读取错误,从而在 FreeBSD 上运行 Zed 编辑器的远程开发服务器。此变通方法解决了 Zed 远程服务器无法识别 FreeBSD 为支持平台的问题,该问题会导致项目树为空或出现“Invalid argument”错误。
伪造主机平台
由于 Zed 目前不提供原生的 FreeBSD 远程服务器,用户可以使用 Zed 团队提供的 Linux 二进制文件。这需要启用 FreeBSD 主机的 Linux 兼容性,并使用包装脚本来拦截 `uname` 命令。
包装脚本将平台识别为“Linux x86_64”,同时将所有其他参数传递给真实的 `uname` 工具。这个“小谎言”允许 Zed 成功发起连接并将 Linux 服务器二进制文件上传到主机。

此脚本允许 Zed 编辑器相信它正运行在 Linux 主机上,从而能够在 FreeBSD 上使用官方 Linux 远程服务器二进制文件。
“这是一个小谎言,但它是受控的,也是我希望能废除的部分。”
— Lying to Zed to get its remote server running on FreeBSD | Hayzam
768 字节缓冲区退化
即使伪造了平台,用户在尝试查看项目文件时仍可能遇到“Invalid argument (os error 22)”错误。这是由于 FreeBSD 内核的 Linux 模拟层(Linuxulator)中的一个退化引起的,该退化影响了目录条目的尺寸计算。
通俗地说,Zed 请求一批文件名,但 Linuxulator 将这些批次的尺寸向上舍入到 512 字节块。如果总大小超过调用者分配的 768 字节缓冲区,模拟层将返回错误,导致 Zed 报告文件夹为空。
由 HN Digest 根据 hayzam.com 报告的数据绘制;数值按源文件显示。
内核修复与实现
该问题通过应用内核补丁 ec6629628cb 得到解决,该补丁已合并到 FreeBSD 15.2-RELEASE 分支中。此补丁确保如果请求的数量小于标准的 512 字节块,读取大小将被正确向上舍入,且不会超过最大缓冲区大小。

该补丁确保目录读取大小被正确舍入并限制,以防止在访问文件系统时出现“os error 22”故障。
对于寻求原生体验的用户,`editors/zed` 端口也会构建远程服务器,但它可能会落后于官方发布版本。Linux 路径通常更受青睐,因为它可以保持与编辑器最新功能的同步。
Hacker News 读者的反应
- 替代方案: 一位评论者建议,只需简单使用 SSH 即可实现远程编辑而无需专门的服务器,并指出这种方法对许多用户来说通常已经足够。 评论 ↗
- 疑问: 另一位用户质疑为什么远程服务器不能为 FreeBSD 原生编译,并指出编辑器本身仅在音频调用方面面临微小问题。 评论 ↗
以上为 Hacker News 讨论中观点的摘要,并非经过核实的事实。 阅读完整讨论 ↗