{"record":{"id":"3870d0922f6bb25f","repo":"lima-vm/lima","slug":"daemon-q-path-q-is-not-available","errorCode":null,"errorMessage":"daemon %#q (path=%#q) is not available","messagePattern":"daemon %#q \\(path=%#q\\) is not available","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/networks/commands.go","lineNumber":84,"sourceCode":"\n// Sock returns a socket_vmnet socket.\nfunc (c *Config) Sock(name string) string {\n\treturn filepath.Join(c.Paths.VarRun, fmt.Sprintf(\"socket_vmnet.%s\", name))\n}\n\nfunc (c *Config) PIDFile(name, daemon string) string {\n\treturn filepath.Join(c.Paths.VarRun, fmt.Sprintf(\"%s_%s.pid\", name, daemon))\n}\n\nfunc (c *Config) LogFile(name, daemon, stream string) string {\n\tnetworksDir, _ := dirnames.LimaNetworksDir()\n\treturn filepath.Join(networksDir, fmt.Sprintf(\"%s_%s.%s.log\", name, daemon, stream))\n}\n\nfunc (c *Config) User(daemon string) (osutil.User, error) {\n\tif ok, _ := c.IsDaemonInstalled(daemon); !ok {\n\t\tdaemonPath, _ := c.DaemonPath(daemon)\n\t\treturn osutil.User{}, fmt.Errorf(\"daemon %#q (path=%#q) is not available\", daemon, daemonPath)\n\t}\n\t//nolint:gocritic // singleCaseSwitch: should rewrite switch statement to if statement\n\tswitch daemon {\n\tcase SocketVMNet:\n\t\treturn osutil.LookupUser(\"root\")\n\t}\n\treturn osutil.User{}, fmt.Errorf(\"daemon %#q not defined\", daemon)\n}\n\nfunc (c *Config) MkdirCmd() string {\n\treturn fmt.Sprintf(\"/bin/mkdir -m 775 -p %s\", c.Paths.VarRun)\n}\n\nfunc (c *Config) StartCmd(name, daemon string) string {\n\tif ok, _ := c.IsDaemonInstalled(daemon); !ok {\n\t\tpanic(fmt.Errorf(\"daemon %#q is not available\", daemon))\n\t}\n\tvar cmd string","sourceCodeStart":66,"sourceCodeEnd":102,"githubUrl":"https://github.com/lima-vm/lima/blob/dd909d0973cd84fa35f9e1693181b4585ea616c1/pkg/networks/commands.go#L66-L102","documentation":"Config.User resolves the OS user that should run a network daemon. First it checks IsDaemonInstalled; if the daemon binary path is not configured/executable, it returns 'daemon %#q (path=%#q) is not available' instead of attempting a lookup. The embedded path in the message shows exactly which configured path failed.","triggerScenarios":"startDaemon, stopNetwork, or passwordLessSudo calls User(daemon) while Paths.SocketVMNet is empty in networks.yaml or points to a non-existent binary, so IsDaemonInstalled reports false.","commonSituations":"socket_vmnet not installed (e.g. `brew install socket_vmnet` skipped on macOS); networks.yaml paths section pointing at a wrong/old binary location; fresh machine without the post-install setup steps run (limactl sudoers).","solutions":["Install socket_vmnet (on macOS: brew install socket_vmnet) and note the binary path","Set paths.socketVMNet in $LIMA_HOME/_config/networks.yaml to the installed binary path","Re-run `limactl sudoers` setup so the daemon user/permissions are configured"],"exampleFix":"// networks.yaml\n// before\npaths:\n  socketVMNet: \"\"\n// after\npaths:\n  socketVMNet: /opt/homebrew/bin/socket_vmnet","handlingStrategy":"validation","validationCode":"installed, err := cfg.IsDaemonInstalled(networks.SocketVMNet)\nif err != nil || !installed {\n    return fmt.Errorf(\"install socket_vmnet and set paths.socketVMNet in networks.yaml\")\n}","typeGuard":null,"tryCatchPattern":"u, err := cfg.User(networks.SocketVMNet)\nif err != nil {\n    // message includes the failing daemon path; surface it to the user\n    return err\n}","preventionTips":["Install socket_vmnet before starting instances with port forwarding requiring it","Verify the binary path exists with os.Stat after configuring networks.yaml","Run the documented `limactl sudoers` post-install step on macOS"],"tags":["network","daemon","socket-vmnet","installation","go"],"backgroundTag":"daemon-not-installed","analyzedSha":"dd909d0973cd84fa35f9e1693181b4585ea616c1","analyzedAt":"2026-09-01T14:24:59.842Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}