How to implement a virtual filesystem on macos?
Asked Answered
B

1

8

I have seen that some applications are able to represent themselves as external disks within Finder on MacOS. Typically, these are cloud storage applications such as PCloud Drive and WD Discovery. I'm wondering how they do this.

I realize that cloud storage might just implement some remote filesystem protocol such as Samba or AFP. But I still don't quite understand how an app mounts the filesystem directly into Finder. Also, is there a more efficient way to mount a virtual filesystem if it doesn't rely on network storage?

Buzz answered 23/1, 2021 at 6:27 Comment(0)
N
11

This is a fairly high-level question, so I'll give a high-level answer. I don't know how the specific examples you list implement it, but this shouldn't be too hard to find out.

As far as I'm aware, the options are as follows:

  • At a fundamental level, you can create a VFS kext. This is how support for HFS+, APFS, FAT*, SMB, AFP, etc. is implemented in macOS in the first place. The headers for this in the Kernel.framework are primarily <sys/vnode.h>, <sys/vnode_if.h>, and <vfs/vfs_support.h>. This gives you the most power, but it's also difficult, and the user experience for installing kexts continues to deteriorate. (They won't load at all on ARM64 Macs unless the user does some fairly complicated acrobatics.)
  • There's MacFUSE, which does some of the heavy lifting for you. Some licensing issues and it's in turn implemented via a kext so the UX issues apply here too.
  • Use NSFileProvider. This is intended for cloud-style virtual file systems but can to some extent be used for different but related scenarios.
  • Implement a network file system server, then use APIs to mount.
  • Implement a block device hosting a regular file system via another method, such through a DriverKit SCSI controller driver, or via a iSCSI target. This only really makes sense if the data source is sensibly representable as a block device.

*since macOS 13, the FAT file system is implemented in user space via a not-(yet)-public file system API.

Nitroglycerin answered 24/1, 2021 at 15:39 Comment(2)
High-level answer is very appropriate. It seems like NSFileProvider would be my favorite of these, but the docs give the availability as "iOS 8.0+", implying that it's not available for macOS. Is that option for iOS only?Buzz
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 - I don't have any practical experience implementing this protocol, unfortunately, but I think this is what you're after.Nitroglycerin

© 2022 - 2024 — McMap. All rights reserved.