lima-vm/lima · error

failed to apply DNS configuration

Error message

failed to apply DNS configuration: %w

What it means

Raised by processUserData when `manage_resolv_conf: true` with a `resolv_conf` block is set, but the macOS `networksetup -setdnsservers Ethernet ...` command fails in setResolvConf. The command output is wrapped into the underlying error. Note the primary network interface is hardcoded to "Ethernet".

Solutions

  1. Check the wrapped networksetup output in the error message.
  2. Verify the network service list in the VM (`networksetup -listallnetworkservices`); the implementation hardcodes "Ethernet".
  3. Remove `manage_resolv_conf` from user-data if DNS is already configured correctly by the image.
  4. Use plain IP addresses for nameservers entries.
  5. Rename or create an "Ethernet" network service in the guest as a workaround.

Example fix

// before (user-data)
manage_resolv_conf: true
resolv_conf:
  nameservers: ["dns.example.internal"]
// after
manage_resolv_conf: true
resolv_conf:
  nameservers: ["10.0.2.3"]
Defensive patterns

Strategy: fallback

Validate before calling

func validateResolvConf(rc *cloudinittypes.ResolvConf) error {
  if rc == nil { return nil }
  for _, ns := range rc.Nameservers {
    if net.ParseIP(ns) == nil { return fmt.Errorf("nameserver %q is not an IP", ns) }
  }
  return nil
}

Type guard

func isIPNameservers(rc *cloudinittypes.ResolvConf) bool {
  if rc == nil { return true }
  for _, ns := range rc.Nameservers { if net.ParseIP(ns) == nil { return false } }
  return true
}

Try / catch

if userData.ManageResolvConf && userData.ResolvConf != nil {
  if err := setResolvConf(ctx, userData.ResolvConf); err != nil {
    log.Warnf("DNS not applied; falling back to image defaults: %v", err)
  }
}

Prevention

When it happens

Trigger: The user-data sets manage_resolv_conf/resolv_conf and the networksetup command returns non-zero: the service named "Ethernet" does not exist on the guest, DNS server entries are malformed, or networksetup lacks privileges.

Common situations: A macOS guest whose primary network service is named differently (e.g. "Wi-Fi", "USB 10/100/1000 LAN"), which is common with custom or newer images; or invalid nameserver values in the resolv_conf block.

Related errors


AI-assisted analysis of lima-vm/lima@dd909d0973 (2026-09-01). Data as JSON: /api/errors/788971632ba22650. Report an issue: GitHub.

Appendix: source

Thrown at pkg/guestagent/fakecloudinit/fakecloudinit_darwin.go:131

	}
	if userData.Timezone != "" {
		if err = setTimezone(ctx, userData.Timezone); err != nil {
			errs = append(errs, fmt.Errorf("failed to set timezone: %w", err))
		}
	}
	for _, u := range userData.Users {
		if err := createUser(ctx, &u); err != nil {
			errs = append(errs, fmt.Errorf("failed to create user %#q: %w", u.Name, err))
		}
	}
	for _, entry := range userData.WriteFiles {
		if err := writeFiles(ctx, entry); err != nil {
			errs = append(errs, fmt.Errorf("failed to write file for path %#q: %w", entry.Path, err))
		}
	}
	if userData.ManageResolvConf && userData.ResolvConf != nil {
		if err = setResolvConf(ctx, userData.ResolvConf); err != nil {
			errs = append(errs, fmt.Errorf("failed to apply DNS configuration: %w", err))
		}
	}
	if userData.CACerts != nil {
		logrus.Warn("ca_certs is not implemented")
	}
	if len(userData.BootCmd) > 0 {
		logrus.Warn("bootcmd is not implemented")
	}
	return errors.Join(errs...)
}

// mountFSTabEntry mounts a filesystem based on the given fstab entry.
// The format mimics Linux's convention.
// The entries are not written to /etc/fstab.
func mountFSTabEntry(m []string) error {
	if len(m) != 6 {
		return fmt.Errorf("invalid fstab entry: expected 6 fields, got %d: %v", len(m), m)
	}

View on GitHub (pinned to dd909d0973)