How to change nameserver in resolv.conf in Recovery Mode?

How can I change the nameserver in /etc/resolv.conf while the MacBook is in recovery mode?


Solution 1:

The IP-address and other details (e.g. DNS-server) are usually provided by a DHCP-server in your network if your Mac is booted to Recovery Mode.

The DNS config data is temporarily stored to resolv.conf on a RAM disk (union)-mounted to /private/var/run - a directory also containing some other files. The file /etc/resolv.conf is a link to /private/var/run/resolv.conf only! AFAIR the content of resolv.conf is not relevant for DNS resolution (performed by mDNSResponder) in macOS!

The file is non-persistent!


Usually DNS-server setup in the shell is done with sudo networksetup ... - a tool not available in the Base OS X System of the Recovery Mode.

You should still be able to change the DNS server with scutil in Terminal.app:

  1. Open Terminal.app in the menubar > Utilities
  2. Enter scutil --dns to get your current DNS config
  3. Enter scutil to reach interactive mode
  4. Enter list to get a list of all keys in the data store
  5. If you have several interfaces (you've found several State:/Network/Service/SERVICE_ID/IPv4 entries) determine the one connected to the Internet (based on e.g. your router and its internal network IP settings) - example:

    get State:/Network/Service/EB40E2FC-8248-48F2-8567-257D940A31EB/IPv4
    d.show
    

    Example output:

    <dictionary> {
      Addresses : <array> {
        0 : 192.168.0.8
      }
      ConfigMethod : Manual
      SubnetMasks : <array> {
        0 : 255.255.255.0
      }
    }
    

    If your router has the IP-address 192.168.0.1 this should be the proper interface. If your router has e.g. the IP address 192.168.1.1 the interface found above would be the wrong one and you have to search for an interface with an IP in the range 192.168.1.2-192.168.1.254.

  6. Enter get State:/Network/Service/EB40E2FC-8248-48F2-8567-257D940A31EB/DNS use the service ID of the interface connected to the Internet you have found previously (here EB40E2FC-8248-48F2-8567-257D940A31EB)

    Entering d.show should show something like:

    <dictionary> {
      SearchDomains : <array> {
        0 : some.domain
      }
      ServerAddresses : <array> {
        0 : 192.168.0.1
      }
    }
    

    Depending on the DHCP setup of your router the SearchDomains entry and array may be missing.

  7. Enter d.add ServerAddresses * 8.8.8.8 9.9.9.9 - add one or more DNS-server (here Google's 8.8.8.8 and quad9's 9.9.9.9)

  8. Enter set State:/Network/Service/EB40E2FC-8248-48F2-8567-257D940A31EB/DNS
  9. Enter d.show to check the modified dict entry. It should show something like:

    <dictionary> {
      SearchDomains : <array> {
        0 : some.domain
      }
      ServerAddresses : <array> {
        0 : 8.8.8.8
        1 : 9.9.9.9
      }
    }
    
  10. Enter quit to leave the interactive mode of scutil and return to the shell.

  11. Enter scutil --dns or dig to verify your new DNS config.

Tested in macOS 10.12.5 Recovery Mode only!