如何在 macos 上实现虚拟文件系统?

How to implement a virtual filesystem on macos?

我发现某些应用程序能够在 MacOS 上的 Finder 中将自身表示为外部磁盘。通常,这些是云存储应用程序,例如 PCloud Drive and WD Discovery。我想知道他们是怎么做到的。

我意识到云存储可能只是实现了一些远程文件系统协议,例如 Samba 或 AFP。但我还是不太明白应用程序如何将文件系统直接挂载到 Finder 中。另外,如果不依赖网络存储,是否有更有效的方式来挂载虚拟文件系统?

这是一个相当 high-level 的问题,所以我会给出一个 high-level 的答案。我不知道你列出的具体例子是如何实现的,但这应该不难发现。

据我所知,选项如下:

  • 在基本层面上,您可以创建一个 VFS kext。这就是首先在 macOS 中实现对 HFS+、APFS、FAT、SMB、AFP 等的支持的方式。 Kernel.framework 中的 headers 主要是 <sys/vnode.h><sys/vnode_if.h><vfs/vfs_support.h>。这给了你最大的力量,但也很困难,安装 kexts 的用户体验不断恶化。 (它们根本不会加载到 ARM64 Mac 上,除非用户做一些相当复杂的杂技。)
  • 有 MacFUSE,它可以为您完成一些繁重的工作。一些许可问题,它又通过 kext 实现,因此 UX 问题也适用于此。
  • 使用NSFileProvider。这适用于 cloud-style 虚拟文件系统,但在某种程度上可以用于不同但相关的场景。
  • 实现一个网络文件系统服务器,然后使用API​​s挂载。
  • 通过其他方法实现块设备托管常规文件系统,例如通过 DriverKit SCSI 控制器 driver,或通过 iSCSI 目标。只有当数据源可以合理地表示为块设备时,这才真正有意义。