Skip to content

fskit_agent / enabledModules.plist In-Memory Cache Desync & Dirty ext4 Superblock Handling #1

Description

@joffcrabtree

Hi, great app - now that I have it working.

OS: Running MacOS 26.6.2
Source: App purchased through App Store
Issue: Could not enable toggle for fskit modules

When attempting to enable and mount ext4 filesystems on macOS 15+ using xlinuxfs (com.huanchuan.xlinuxfs.lklfuse), the extension consistently fails to activate via the standard System Settings UI toggle and results in fskitd: Attempt to start disabled extension errors during Disk Arbitration probes.

While the diagnostic script provided inside the app correctly targets enabledModules.plist in the group.com.apple.fskit.settings container, the fix frequently fails to take effect because macOS’s preference daemon (cfprefsd) and fskitd maintain an in-memory cache that immediately overwrites or ignores on-disk changes unless flushed in a specific order. Additionally, ext4 filesystems marked with (needs journal recovery) silently fail user-space mount requests unless explicitly mounted read-only.

Root Cause Breakdown

  1. cfprefsd & Daemon IPC Desync

The provided fix script appends the bundle ID to $HOME/Library/Group Containers/group.com.apple.fskit.settings/enabledModules.plist and executes pkill -9 fskit_agent.

However, because cfprefsd holds the Group Container preference state in RAM, running pkill -9 fskit_agent alone causes cfprefsd to write back the stale in-memory array (omitting the newly added bundle ID) or causes fskitd (running as uid 0) to continue rejecting the extension based on its un-reloaded policy table.

Resolution: cfprefsd, FSKitModuleManagement, fskitd, and diskarbitrationd must be terminated simultaneously to ensure all layers read directly from disk upon respawning.

2. ext4 Superblock Journal Recovery Block

When an ext4 partition is removed without a clean unmount, the superblock retains the (needs journal recovery) flag.

lklfuse rejects standard read-write mount requests via fskitd because user-space LKL cannot safely replay the journal on a raw block device without risk of corruption.

Standard GUI mount attempts simply fail with no direct feedback explaining that an unplayed journal is blocking the driver.

Recommended Fixes for Future Releases

  1. Update the In-App Diagnostic / Fix Script
    Update the troubleshooting helper script to terminate cfprefsd and the associated system daemons alongside fskit_agent:

Bash
#!/bin/zsh
PLIST="$HOME/Library/Group Containers/group.com.apple.fskit.settings/enabledModules.plist"
BID="com.huanchuan.xlinuxfs.lklfuse"

mkdir -p "$HOME/Library/Group Containers/group.com.apple.fskit.settings"

Ensure array structure and inject bundle ID

if [ ! -f "$PLIST" ]; then
/usr/libexec/PlistBuddy -c "Add : array" "$PLIST"
fi

/usr/libexec/PlistBuddy -c "Print" "$PLIST" | grep -qF "$BID" || /usr/libexec/PlistBuddy -c "Add :0 string $BID" "$PLIST"

Flush the in-memory preference caching layer and reload daemons simultaneously

killall "System Settings" FSKitModuleManagement 2>/dev/null
killall cfprefsd 2>/dev/null
sudo killall -9 fskitd fskit_agent diskarbitrationd 2>/dev/null
2. UI Fallback for Dirty ext4 Superblocks

Implement an automated pre-mount inspection (or detect status code 0x00000001 / probe failures).

If the superblock has (needs journal recovery) set, offer a 1-click fallback in the UI: "Mount as Read-Only (Unclean Journal Detected)" passing diskutil mount readOnly / -o ro,noload directly to the fskitd mount handler.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions