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.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…