Post

Replies

Boosts

Views

Activity

Reply to FSKit module mount fails with permission error on physical disks
Same root cause we worked around in TestFS — sharing data and our fix in case it helps We hit this on macOS 26.4.1 in a third-party FSKit V1 block-resource extension shipped via a Sparkle-auto-updated host app (com.sohonet.testfsmount.appex inside TestFS.app). Reproducible cycle: Fresh install: mount works. Auto-update replaces /Applications/TestFS.app. System Settings → Login Items & Extensions → File System Extensions still reads "TestFS — on." mount(8) -F -t testfs /dev/diskN /tmp/foo fails: mount: Loading resource: The operation couldn't be completed. (com.apple.extensionKit.errorDomain error 2.) mount: File system named testfs not found mount(8) exits 69 (EX_UNAVAILABLE). Toggling the System Settings switch off and then back on always fixes it. So does waiting some unspecified amount of time, or invoking mount(8) against a different /dev/diskN after a fresh hdiutil attach cycle (apparently triggers re-resolution). Reading lsd and extensionkitservice logs against the same time window suggests lsd re-registers the appex with a new internal UUID after the bundle replacement, but extensionkitservice keeps a handle to the previous UUID, so the lookup-by-fstype fails until something forces re-adjudication. Workaround that's working for us On every app launch, we compare the running CFBundleVersion against a stored value in UserDefaults. If they differ (i.e. the app was just replaced — first launch in the new bundle), we shell out to: /System/.../LaunchServices.framework/.../lsregister -f /Applications/TestFS.app /usr/bin/pluginkit -a /Applications/TestFS.app/Contents/Extensions/TestFSExtension.appex …then save the new version. Subsequent launches with the same version skip the re-register. Net effect: by the time the user clicks Mount, extensionkitd has already re-resolved the new bundle. This is the same workaround macFUSE 5.2.0 release notes describe shipping for the same class of issue: https://macfuse.github.io/2026/04/09/macfuse-5.2.0.html Things I'd love to know from Apple Is lsregister -f + pluginkit -a from inside the just-launched .app the right approach, or are we masking a deeper bug we should be filing instead? Is there an FSKit / ExtensionKit API we should be calling on launch ("force re-adjudication") rather than shelling to CLI tools? Does Apple have an internal radar already tracking the lsd / extensionkitservice UUID-mismatch story? Happy to add a fresh Feedback Assistant report if helpful — would just rather link to the existing one if one exists. Source repo: https://github.com/sohonetlabs/testfs (workaround in AppEnvironment.reregisterExtensionIfNeeded() if anyone wants to copy the pattern).
Topic: App & System Services SubTopic: Core OS Tags:
1w
Reply to FSKit module mount fails with permission error on physical disks
Same root cause we worked around in TestFS — sharing data and our fix in case it helps We hit this on macOS 26.4.1 in a third-party FSKit V1 block-resource extension shipped via a Sparkle-auto-updated host app (com.sohonet.testfsmount.appex inside TestFS.app). Reproducible cycle: Fresh install: mount works. Auto-update replaces /Applications/TestFS.app. System Settings → Login Items & Extensions → File System Extensions still reads "TestFS — on." mount(8) -F -t testfs /dev/diskN /tmp/foo fails: mount: Loading resource: The operation couldn't be completed. (com.apple.extensionKit.errorDomain error 2.) mount: File system named testfs not found mount(8) exits 69 (EX_UNAVAILABLE). Toggling the System Settings switch off and then back on always fixes it. So does waiting some unspecified amount of time, or invoking mount(8) against a different /dev/diskN after a fresh hdiutil attach cycle (apparently triggers re-resolution). Reading lsd and extensionkitservice logs against the same time window suggests lsd re-registers the appex with a new internal UUID after the bundle replacement, but extensionkitservice keeps a handle to the previous UUID, so the lookup-by-fstype fails until something forces re-adjudication. Workaround that's working for us On every app launch, we compare the running CFBundleVersion against a stored value in UserDefaults. If they differ (i.e. the app was just replaced — first launch in the new bundle), we shell out to: /System/.../LaunchServices.framework/.../lsregister -f /Applications/TestFS.app /usr/bin/pluginkit -a /Applications/TestFS.app/Contents/Extensions/TestFSExtension.appex …then save the new version. Subsequent launches with the same version skip the re-register. Net effect: by the time the user clicks Mount, extensionkitd has already re-resolved the new bundle. This is the same workaround macFUSE 5.2.0 release notes describe shipping for the same class of issue: https://macfuse.github.io/2026/04/09/macfuse-5.2.0.html Things I'd love to know from Apple Is lsregister -f + pluginkit -a from inside the just-launched .app the right approach, or are we masking a deeper bug we should be filing instead? Is there an FSKit / ExtensionKit API we should be calling on launch ("force re-adjudication") rather than shelling to CLI tools? Does Apple have an internal radar already tracking the lsd / extensionkitservice UUID-mismatch story? Happy to add a fresh Feedback Assistant report if helpful — would just rather link to the existing one if one exists. Source repo: https://github.com/sohonetlabs/testfs (workaround in AppEnvironment.reregisterExtensionIfNeeded() if anyone wants to copy the pattern).
Topic: App & System Services SubTopic: Core OS Tags:
Replies
Boosts
Views
Activity
1w