如何在macos上实现虚拟文件系统?
我已经看到一些应用程序能够在 MacOS 上的 Finder 中将自己表示为外部磁盘。通常,这些是云存储应用程序,例如PCloud Drive和WD Discovery。我想知道他们是如何做到这一点的。
我意识到云存储可能只是实现了一些远程文件系统协议,例如 Samba 或 AFP。但是我仍然不太明白应用程序如何将文件系统直接挂载到 Finder 中。另外,如果不依赖网络存储,是否有更有效的方法来挂载虚拟文件系统?
回答
这是一个相当高层次的问题,所以我会给出一个高层次的答案。我不知道你列出的具体例子是如何实现的,但这应该不难找到。
据我所知,选项如下:
- 从根本上讲,您可以创建 VFS kext。这就是如何在 macOS 中首先实现对 HFS+、APFS、FAT、SMB、AFP 等的支持。在Kernel.framework这个头主要是
<sys/vnode.h>,<sys/vnode_if.h>和<vfs/vfs_support.h>。这给了你最大的力量,但也很困难,安装kexts的用户体验不断恶化。(除非用户执行一些相当复杂的特技操作,否则它们根本不会加载到 ARM64 Mac 上。) - MacFUSE 可以为您完成一些繁重的工作。一些许可问题,它又通过 kext 实现,因此 UX 问题也适用于此。
- 使用
NSFileProvider. 这适用于云风格的虚拟文件系统,但在某种程度上可以用于不同但相关的场景。 - 实现一个网络文件系统服务器,然后使用 API 进行挂载。
- 通过另一种方法(例如通过 DriverKit SCSI 控制器驱动程序或通过 iSCSI 目标)实现托管常规文件系统的块设备。只有当数据源可以合理地表示为块设备时,这才真正有意义。
- If I remember correctly, `NSFileProviderExtension` was supposed to ship with macOS 10.15 but they removed it again late in the beta phase. It seems to have resurfaced in macOS 11 in the form of [`NSFileProviderReplicatedExtension`](https://developer.apple.com/documentation/fileprovider/nsfileproviderreplicatedextension?language=objc) - I don't have any practical experience implementing this protocol, unfortunately, but I think this is what you're after.