Search code examples
macosfinderkernel-extensionvirtualfilesystem

How to implement a virtual filesystem on macos?


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?


Solution

  • 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.