Installing ZFSFSKit.appex ? /Library/ExtensionKit/Extensions/
Substituting real Mach-O (libtool wrapper ? .libs/ZFSFSKit)
Installing zfs.fs ? /Library/Filesystems/
mount_zfs: Mach-O 64-bit executable arm64
Done.
Signing (before pluginkit, so it sees a valid signature)...
Re-signing /Library/ExtensionKit/Extensions/ZFSFSKit.appex ad-hoc (no identity).
Note: requires amfi_get_out_of_my_way=1 in boot-args.
Team ID: ADHOC
/Library/ExtensionKit/Extensions/ZFSFSKit.appex: replacing existing signature
Done. Signature:
Identifier=org.openzfsonosx.filesystems.zfs.fsext
Signature=adhoc
TeamIdentifier=not set
Entitlements:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "https://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict><key>com.apple.application-identifier</key><string>ADHOC.org.openzfsonosx.filesystems.zfs.fsext</string><key>com.apple.developer.fskit.fsmodule</key><true/><key>com.apple.developer.team-identifier</key><string>ADHOC</string><key>com.apple.security.app-sandbox</key><true/></dict></plist>
Registering with pluginkit...
pluginkit -a done.
Restarting fskitd...
# sudo pluginkit -v -m -p com.apple.fskit.fsmodule
+ org.openzfsonosx.filesystems.zfs.fsext((null)) 6A12A41280FB-4190-B957-FA94DC89BB1E 2026-05-29 01:17:58 +0000 /Library/ExtensionKit/Extensions/ZFSFSKit.appex
# sudo mkdir /Volumes/tank
# sudo mount -F -t zfs /dev/disk4 /Volumes/tank
# ls -la /Volumes/tank
total 3
drwxr-xr-x 3 lundman staff 4 May 29 09:21 .
drwxr-xr-x 4 root wheel 128 May 29 10:18 ..
-rw-r--r-- 1 lundman staff 11 May 29 09:21 file.txt
drwxr-xr-x 2 lundman staff 2 May 29 09:21 HelloWorld
# cat /Volumes/tank/file.txt
HelloWorld
Even though FSKit isn't quite ready, I built a proof-of-concept FSKit extension to understand what the migration path looks like. This post shares what we got working, specific technical findings that weren't documented, and the gaps we hit that would need Apple's attention for a production implementation.
Luckily, OpenZFS already compiles in userland for the "zdb" utility so not much work was required on that side.
There were certain amount of desperation applied when we came across hurdles, so possibly some assumptions we formed are not correct. (We didn't go back and confirm the problem after it started working).