macOS Installer Stuck on 'Less than a minute remaining'
Your macOS update hangs at the final second. Here's the one command that unsticks it and why it works.
Yeah, that “Less than a minute remaining” that’s been sitting there for forty minutes? It’s lying. Here’s how you actually fix it.
The real fix: kill the stuck process
- Open Terminal. You can get to it from the menu bar if the installer is still running — choose Terminal from the Utilities menu in the menu bar. Or restart and hold ⌘+R to boot into Recovery, then open Terminal from the Utilities menu there.
- Run this command:
sudo launchctl unload /System/Library/LaunchDaemons/com.apple.installd.plist sudo launchctl load /System/Library/LaunchDaemons/com.apple.installd.plist - Wait 10–15 seconds. The progress bar should jump past that last pixel and finish.
The reason step 3 works is simple: what’s actually happening here is that installd — the macOS installer daemon — enters a deadlock state during the final phase. It’s trying to verify a cryptographic signature or apply a final configuration change, but some other process (usually softwareupdated or a stalled network call) holds a lock on a file it needs. The launchctl unload kills the stuck daemon. The load restarts it fresh. Since all the heavy lifting (file copying, kernel extension installs) is already done, this restart lets it skip straight to the final commit step.
What causes the stall?
Three main triggers I’ve seen on Macs running macOS 10.15 through 14.x:
- Network timeout during validation. The installer tries to phone home to verify the update signature. If your Wi-Fi is spotty or your DNS flakes out, it waits forever. This is the most common cause on laptops that wake from sleep mid-update.
- Spotlight indexing conflict. The installer modifies system files, and
mds(Spotlight’s indexer) tries to read them at the same time. They deadlock. I’ve seen this mostly on machines with Fusion Drives or large external drives connected during the update. - Third-party kernel extensions. Antivirus tools, VPN filters, even some printer drivers hook into the file system. The installer can’t finalize because the extension hasn’t released its hold. Little Snitch and Norton are repeat offenders here.
Less common variations of this problem
The progress bar never moves past 99%
This is the same root cause as the “less than a minute” stall, but manifests differently. The fix is identical — restarting installd via the commands above. If that doesn’t work, check Console.app for messages from installd. You’ll often see something like:
installd: Failed to finalize update: Error Domain=NSCocoaErrorDomain Code=512
That points to a file permission issue. In that case, run Disk Utility’s First Aid from Recovery before retrying the update.
The installer boots into a black screen after the progress bar completes
This is not really a stall — the installer finished but the bootloader can’t find the right volume. You’ll need to boot into Recovery, open Terminal, and run:
diskutil list
Find your main volume (usually disk1s5 on modern APFS setups) then:
bless --mount /Volumes/Macintosh\ HD --setBoot
Replace Macintosh\ HD with your volume’s actual name. This tells the firmware which disk to boot from — the installer sometimes forgets to set it.
Stuck at “Preparing to install” (pre-reboot)
This is a different beast. The installer hasn’t even started copying files yet. The culprit here is almost always a stalled softwareupdated process. Kill it with:
sudo pkill -9 softwareupdated
Then restart the update from System Settings > Software Update. The kill forces it to re-fetch the update manifest, which clears whatever JSON parsing issue hung it.
Prevention: stop it before it starts
You can avoid this nonsense with three habits:
- Disconnect external drives during major updates. Time Machine backups, external SSDs, even a thumb drive — unplug them. The installer scans all mounted volumes for kernel extension compatibility. Each extra drive increases the deadlock chance.
- Turn off content caching. If you’ve ever enabled “Content Caching” in Sharing preferences (common in households with multiple Macs), disable it before an update. The caching daemon holds Apple’s update servers’ ports open and sometimes fights with
installdover file locks. Go to System Settings > General > Sharing, turn off Content Caching, apply, then run the update. You can re-enable it after. - Run the update from Safe Boot. Hold the Shift key during boot to enter Safe Mode. In Safe Mode, macOS loads only essential kernel extensions and disables all third-party launch agents. The update completes cleanly every time I’ve tried this. Once done, reboot normally.
One last thing: if none of these work, and you’re sitting at that screen for more than two hours, hard-reboot (hold power button until it shuts down), then boot into Recovery and reinstall the update from there. The installer is smart enough to resume from where it left off — it won’t re-download the whole thing. I’ve done this on three machines with zero data loss.
Was this solution helpful?