lima-vm/lima · critical
daemon %#q is not available
Error message
daemon %#q is not available
What it means
Config.StartCmd builds the shell command that launches the network daemon. If IsDaemonInstalled reports the daemon is missing, it panics with 'daemon %#q is not available' because StartCmd returns only a string (no error) and cannot proceed sensibly. Unlike User(), this is a panic, not a returned error.
Source
Thrown at pkg/networks/commands.go:100
if ok, _ := c.IsDaemonInstalled(daemon); !ok {
daemonPath, _ := c.DaemonPath(daemon)
return osutil.User{}, fmt.Errorf("daemon %#q (path=%#q) is not available", daemon, daemonPath)
}
//nolint:gocritic // singleCaseSwitch: should rewrite switch statement to if statement
switch daemon {
case SocketVMNet:
return osutil.LookupUser("root")
}
return osutil.User{}, fmt.Errorf("daemon %#q not defined", daemon)
}
func (c *Config) MkdirCmd() string {
return fmt.Sprintf("/bin/mkdir -m 775 -p %s", c.Paths.VarRun)
}
func (c *Config) StartCmd(name, daemon string) string {
if ok, _ := c.IsDaemonInstalled(daemon); !ok {
panic(fmt.Errorf("daemon %#q is not available", daemon))
}
var cmd string
switch daemon {
case SocketVMNet:
nw := c.Networks[name]
if c.Paths.SocketVMNet == "" {
panic("c.Paths.SocketVMNet is empty")
}
cmd = fmt.Sprintf("%s --pidfile=%s --socket-group=%s --vmnet-mode=%s",
c.Paths.SocketVMNet, c.PIDFile(name, SocketVMNet), c.Group, nw.Mode)
switch nw.Mode {
case ModeBridged:
cmd += fmt.Sprintf(" --vmnet-interface=%s", nw.Interface)
case ModeHost, ModeShared:
cmd += fmt.Sprintf(" --vmnet-gateway=%s --vmnet-dhcp-end=%s --vmnet-mask=%s",
nw.Gateway, nw.DHCPEnd, nw.NetMask)
}
cmd += " " + c.Sock(name)View on GitHub (pinned to dd909d0973)
Solutions
- Install socket_vmnet and point paths.socketVMNet at the real binary
- Call IsDaemonInstalled(daemon) and abort before invoking StartCmd
- Prefer using the higher-level startDaemon flow that performs the check via User()
Example fix
// before
cmd := cfg.StartCmd(net, networks.SocketVMNet) // panics if missing
// after
if ok, _ := cfg.IsDaemonInstalled(networks.SocketVMNet); !ok {
return fmt.Errorf("socket_vmnet not installed")
}
cmd := cfg.StartCmd(net, networks.SocketVMNet) Defensive patterns
Strategy: validation
Validate before calling
ok, _ := cfg.IsDaemonInstalled(networks.SocketVMNet)
if !ok {
return fmt.Errorf("refusing to build start command: socket_vmnet is not installed")
}
cmd := cfg.StartCmd(name, networks.SocketVMNet) Try / catch
// StartCmd panics rather than returning an error — guard with recover()
func safeStartCmd(cfg *networks.Config, name, daemon string) (cmd string, err error) {
defer func() { if r := recover(); r != nil { err = fmt.Errorf("%v", r) } }()
return cfg.StartCmd(name, daemon), nil
} Prevention
- Always call IsDaemonInstalled before StartCmd — StartCmd panics, it does not return errors
- Wrap StartCmd in recover() when daemon installation cannot be guaranteed
- Install socket_vmnet and configure paths.socketVMNet before network operations
When it happens
Trigger: startDaemon calls StartCmd(name, daemon) when Paths.SocketVMNet is empty or the configured binary does not exist — the same precondition that makes User() return its error.
Common situations: socket_vmnet not installed; networks.yaml missing the paths.socketVMNet entry; calling StartCmd from custom tooling without first verifying installation via IsDaemonInstalled.
Related errors
- unexpected daemon %#q
- unknown daemon type %#q
- daemon %#q (path=%#q) is not available
- c.Paths.SocketVMNet is empty
- daemon %#q not defined
AI-assisted analysis of lima-vm/lima@dd909d0973 (2026-09-01).
Data as JSON: /api/errors/a1b1d89219ff189b.
Report an issue: GitHub.