lima-vm/lima · error
%s daemon for %#q network failed to start after %d attempts:
Error message
%s daemon for %#q network failed to start after %d attempts: %w%s
What it means
The network daemon exited before writing its PID file on every one of the 5 retry attempts (with 1s/2s/4s/8s backoff). This retry loop exists specifically for the transient macOS VMNET_FAILURE XPC race with com.apple.NetworkSharing at boot; exhausting all attempts means the daemon is deterministically failing. The daemon's stderr (or log path) is appended to explain why it exits.
Source
Thrown at pkg/networks/reconcile/reconcile.go:318
return err // infrastructure failure (sudo/exec) — not transient
}
err = waitForDaemon(ctx, cmd, pidFile, startTimeout)
if err == nil {
return nil
}
// Only an early exit (the transient XPC race) is retried; everything else
// is surfaced immediately.
if _, ok := errors.AsType[*daemonExitedError](err); !ok {
// A stuck (still-running) daemon gets its stderr appended; PID-read and
// context errors propagate as-is.
if _, ok := errors.AsType[*daemonStuckError](err); ok {
return fmt.Errorf("%s daemon for %#q network %w%s", daemon, name, err, stderrHint(stderrLog))
}
return err
}
lastErr = err // process exited early — retry
}
return fmt.Errorf("%s daemon for %#q network failed to start after %d attempts: %w%s",
daemon, name, maxAttempts, lastErr, stderrHint(stderrLog))
}
// waitForDaemon waits until the daemon writes its PID file (success), exits without
// one (returns *daemonExitedError so the caller can retry), or stays alive past
// timeout without a PID file (returns *daemonStuckError). A stuck or cancelled
// process is killed and reaped.
func waitForDaemon(ctx context.Context, cmd *exec.Cmd, pidFile string, timeout time.Duration) error {
waitCh := make(chan error, 1)
go func() { waitCh <- cmd.Wait() }()
timer := time.NewTimer(timeout)
defer timer.Stop()
ticker := time.NewTicker(500 * time.Millisecond)
defer ticker.Stop()
for {
ready, err := pidFileWritten(pidFile)View on GitHub (pinned to dd909d0973)
Solutions
- Inspect the daemon stderr in the message (or the log file under ~/.lima/networks) for the concrete exit reason
- Verify socket_vmnet is installed and current: brew install/reinstall socket_vmnet
- Check networks.yaml: socketVMNet path and the network switch device must exist on this host
- Reboot the Mac so com.apple.NetworkSharing is fully initialized, then retry
- Regenerate the sudoers file if socket_vmnet was upgraded: limactl sudoers | sudo tee /etc/sudoers.d/lima
Example fix
// before limactl start # fails after 5 attempts: socket_vmnet VMNET_FAILURE // after brew reinstall socket_vmnet limactl sudoers | sudo tee /etc/sudoers.d/lima limactl start
Defensive patterns
Strategy: retry
Validate before calling
if _, err := os.Stat(socketVMNetPath); err != nil {
return fmt.Errorf("socket_vmnet not installed at %s: %w", socketVMNetPath, err)
}
if err := exec.Command(socketVMNetPath, "--version").Run(); err != nil {
return fmt.Errorf("socket_vmnet binary broken: %w", err)
} Type guard
func isDaemonExitedError(err error) bool {
var e *daemonExitedError
return errors.As(err, &e)
} Try / catch
if err := startNetwork(); err != nil {
if strings.Contains(err.Error(), "failed to start after") {
// deterministic daemon failure: check stderr hint, reinstall socket_vmnet
}
return err
} Prevention
- Reinstall socket_vmnet after Homebrew upgrades and regenerate the sudoers file
- Reboot after macOS upgrades so com.apple.NetworkSharing is healthy
- Verify the network device in networks.yaml exists on the host
- Read the appended stderr hint in the error for the real exit reason
When it happens
Trigger: startDaemonWithRetry observes *daemonExitedError five consecutive times — the daemon binary starts and exits each time before creating its PID file, e.g. socket_vmnet crashing on VMNET_FAILURE, bad arguments, missing network device, or a genuinely broken install.
Common situations: macOS right after boot when the race is not transient (broken socket_vmnet), socket_vmnet version mismatch with the generated sudoers config, the configured switch device (e.g. bridge100) not existing, or the daemon lacking permission to open the VMNET interface.
Related errors
- %s daemon for %#q network %w%s
- socket_vmnet is not installed
- failed to build network arguments: %w
- invalid network spec %+v
- no socket_vmnet networks defined
AI-assisted analysis of lima-vm/lima@dd909d0973 (2026-09-01).
Data as JSON: /api/errors/c61218cc072b1abe.
Report an issue: GitHub.