尽管 WinFsp 已经帮助我们将 I/O 请求转换为 FUSE 接口,但我们依然需要面对 Unix 和 Windows 之间的本质性差异。 权限管理差异
例如,Linux 中的文件权限(可读、可写、可执行等)和扩展权限(如 ACL)与 Windows 中的权限模型完全不同。Windows 使用 DACL(Discretionary Access Control List)进行权限定义,同时支持权限继承,这与 Unix 的权限模型有很大差异。因此,虽然 WinFsp 处理了一部分权限的转换,但我们仍需解决如何将这两种
权限体系进行有效映射,以便更好地支持 Windows 应用。 系统特性的差异
Unix 和 Windows 在文件系统特性方面也存在较多的本质差异。诸如硬链接、软链接、挂载方式、目录长度、字符限制等、文件属性等,而我们的 JuiceFS 核心文件系统是基于 Unix 的文件系统设计,因此我们需要解决或者绕开这些差异,以确保在 Windows 平台上也能正常运行。 API 差异
Unix 和 Windows 在系统 API 上也有许多差异,尽管我们使用了 Go 语言来简化部分 API 差异的处理,但依然存在一些需要手动解决的情况。例如,获取 UID 和 GID 等信息,在 Windows 系统中并没有直接的对应方式。虽然 Go 语言在跨平台处理上做了很多优化,但一些特定的系统 API 仍然需要我们自行处理这些差异,确保系统的兼容性和稳定性。
2. Linux FUSE vs WinFsp FUSE
在开发过程中,我们还需要面对一个 黑盒的 Windows 内核。由于 Windows 内核没有开源,且相关文档资料非常有限,调试和观察 Windows 内核的行为变得较为困难。这使得整个开发过程充满了不确定性,对于开发人员来说,Windows 内核的工作机制就像一个封闭的黑盒,需要通过不断的实验和反向工程来理解和适应。
4. 有限的 FSD 文档资源
除了 Windows 内核本身的黑盒特性外,关于文件系统驱动(FSD)的文档资源也非常有限。微软并未公开完整的 Windows 内核开发文档,很多 API 仅由第三方整理,官方文档稀缺。事实上,唯一一本专注于 Windows 文件系统驱动的书籍是 1997 年出版的 《Windows NT File System Internals: A Developer's Guide》。尽管该书中包含大量错误(多数是由于不适用于当前版本),直到今天,Windows 文件系统驱动的开发者仍然只能依赖这本书作为参考。这些有限的文档资源使得我们在排查问题和理解 Windows 文件系统行为时,必须付出更多的时间和精力来收集资料并进行学习。
03 做到了哪些?
POSIX 文件权限映射
在之前的版本中,我们遇到一个与文件权限映射相关的问题,尤其是 0666 权限设置。根据 POSIX 标准,0666 权限意味着文件对于所有用户都是可读可写的。然而,在 Windows 上,即使我们为某个文件设置了 0666 权限,Everyone 组(即所有用户)仍然无法进行覆盖写操作。
这个问题的根本原因在于 WinFsp 目前没有完全处理这些权限映射。即使在 Windows 上设置了类似的权限,实际上它并不会如 POSIX 系统那样让所有用户都能够读取和写入文件。
目前,WinFsp 的版本仍然存在这个问题,我们已经向上游提交 PR 来修复这个问题,期望能够使 Windows 上的行为与 POSIX 系统一致,确保在 Windows 平台上也能正确地处理文件权限。 close to open 一致性
默认情况下,JuiceFS 遵循 close-to-open 一致性模型,这意味着在文件关闭之后,下次打开该文件时,用户能够看到之前写入的数据,即使是在不同的机器上也是如此。
然而,在 WinFsp 及 Windows 系统中,文件关闭的处理方式与此不同。WinFsp 的默认行为并不会在文件关闭时,异步等待 FUSE 应用程序处理完数据。具体来说,当应用程序调用 CloseHandle 关闭文件句柄时,经由 WinFsp 的 Windows 应用程序并不会阻塞在 CloseHandle 的调用处,而是直接返回,哪怕本地还有未上传至云端的数据。这种方式导致了 close-to-open 一致性无法得到保证,甚至本机用户,在下一次打开此文件时,依旧可能读取到的是错误的文件长度信息。
为了解决这个问题,我们已经向 WinFsp 的源代码做出相应调整,以确保在 Windows 平台上也能够维持 close-to-open 一致性,确保数据的同步和一致性不受影响。 内核 cache manager 使用
在 WinFsp 的处理过程中,默认情况下它并未利用内核的 Cache Manager,这直接导致了文件读取性能较差。Cache Manager 通常会负责缓存和预读操作,这有助于提升文件系统的读取效率。然而,在 WinFsp 的默认配置下,Cache Manager 并未得到有效利用,从而影响了系统的性能表现。
为了解决这一问题,我们在 FSD 层面进行了问题定位和修复,并研究了如何在 WinFsp 中正确启用 Cache Manager。我们的目标是通过正确启用和配置缓存管理,显著提升文件读取性能,并优化系统的整体表现。
03 未来计划
我们将持续聚焦 Windows 客户端的可用性,包括 bug 修复、功能扩展以及对软链接(symlink)的支持;性能提升也是我们不断努力的方向。随着使用场景日益复杂,数据规模不断扩大,且涉及的技术点较为广泛,Windows 客户端 的优化将是一个长期过程。
此外,许多用户反馈希望能够与 AD 域账号进行集成。在 Windows 环境下,与 AD 域账号的绑定将是一个非常实用的特性,我们正在研究这一需求。如果大家有相关的建议或希望实现的功能,欢迎与我们讨论。
最后,感谢大家对 Windows 版本的支持,欢迎大家体验和反馈,希望我们能为大家提供更好的使用体验。