Repository navigation
install: report stock macFUSE status and mount KBFS only on Finder opt-in - #29775
Draft
chrisnojima wants to merge 7 commits into
Draft
chrisnojima wants to merge 7 commits into
chrisnojima wants to merge 7 commits into
Conversation
chrisnojima
force-pushed
the
nojima/macfuse-02-fuse-status
branch
from
October 20, 2026 13:47
79ebb9f to
2169421
Compare
chrisnojima
force-pushed
the
nojima/macfuse-02-fuse-status
branch
from
October 20, 2026 18:45
2169421 to
6e866fa
Compare
`keybase fuse status` and the service's FuseStatus now describe the user-installed macFUSE (5 or later) instead of the bundled kbfuse: not installed, outdated, unreadable, kext error, or ready (with whether its kext is loaded). Mount infos are filtered to this user's KBFS mount dir, since other apps mount with fstype macfuse too. A leftover kbfuse install is flagged in the status fields. - The `fuse` install component no longer installs anything: it checks macFUSE and loads its kext with the setuid load_macfuse. It exits 5 when macOS has not allowed the kext yet, so the app can show the approval help. - Finder access is a per-user opt-in marker in the config dir. KBFS is always started (chat and the in-app Files tab need it) but mounts only when the user opted in and macFUSE is ready. Turning Finder access off unmounts and restarts KBFS unmounted; it no longer removes the driver. - Nothing installs the helper, kbfuse, the mount dir or the redirector any more: install-auto and the default `keybase install` components need no privileges, and `keybase install` prints failed components on stderr.
…er's MountInfos now comes from getfsstat(MNT_NOWAIT) instead of parsing /sbin/mount, holds only mounts the current user owns, and is matched against the cleaned mount dir.
The kernel reports a mount at its real path, so a mount dir whose parent is a link, or that ends in a slash, now still finds its mount.
install_darwin.go also builds for iOS, so listMounts, mountInfosOwnedBy and resolveMountDir move from fuse_status_darwin.go (not built for iOS) to mounts_darwin.go.
… needing an update macFUSE ships one kext per macOS major version, so after a macOS update an older macFUSE has none to load. The status now reports it as an upgrade (status name MACOS_UNSUPPORTED, field macosVersion) instead of ready, so nothing tries to mount and the app asks for a macFUSE update rather than kext approval. A loaded kext is still used as is.
…ss on The service adds a finderAccess=on status field, so the GUI knows to wait for the KBFS mount after a connect.
chrisnojima
force-pushed
the
nojima/macfuse-02-fuse-status
branch
from
October 20, 2026 21:30
6e866fa to
309c973
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Second of seven PRs moving macOS from the bundled kbfuse to user-installed macFUSE.
keybase fuse statusand the service'sFuseStatusdescribe stock macFUSE: not installed, outdated (< 5), unreadable version, kext info error, no kext for the running macOS, or ready (with whether its kext is loaded). A leftover kbfuse install is flagged in the status fields. The--bundle-versionflag goes away.INSTALLED/UPGRADEwith status nameMACOS_UNSUPPORTEDand amacosVersionfield, so nothing mounts and the app can ask for a macFUSE update instead of kext approval (D57). A loaded kext is used whatever the macOS.getfsstat(MNT_NOWAIT)(no/sbin/mountparsing, and no waiting on an unresponsive file system), keep only KBFS fstypes the current user owns, and the service keeps only the one at this user's mount dir, matched with its parent dir resolved, since other apps mount with fstypemacfusetoo.FuseStatusadds afinderAccess=onfield while the user has Finder access turned on, so the app knows to wait for the mount after KBFS connects.fuseinstall component no longer installs anything: it checks macFUSE and loads its kext with the setuidload_macfuse. It exits 5 when macOS has not allowed the kext yet, so the app can show approval help; it fails with the status message when macFUSE is missing, outdated or does not support the running macOS.keybase installcomponents need no privileges or macFUSE, andkeybase installprints failed components on stderr.install_darwin.go.Why
Keybase no longer installs a FUSE driver, so status has to describe the user's macFUSE, and mounting has to be something the user turns on rather than a side effect of installing the driver.
Testing
go vetclean on this branch;golangci-lint --new-from-rev masterclean on the stack tip;go test ./install/..., including table tests of the status derivation (deriveFuseStatus, the macOS-unsupported case among them),macosMajor, the owner and fstype filter overgetfsstatresults,listMounts, mount dir resolution and the KBFS mount filter,shouldMountKBFS, the install-auto component list and the opt-in marker round trip.keybase fuse statusunmounted → 5.4.0, the…macfuse.25kext ID, kext started, no mounts; mounted → only/Volumes/Keybase (<user>), path with spaces intact.keybase install --components=fuse→ exit 0 with macFUSE ready. With macFUSE removed: status NOT_INSTALLED with the macfuse.io message; after reinstalling, the next status read is ready again with no click.Not verified yet
MACOS_UNSUPPORTEDpaths live (unit-tested only), andkeybase install; echo $?without macFUSE (exit 0 is by reading the code only).Judgment calls
appcomponent and--source-pathstay: the updater's rename fallback still uses them.