lima-vm/lima · error

failed to apply DNS configuration: %w

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".

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)

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.