Lion / name resolution order

(this issue went away for me with the 10.7.1 update - /etc/hosts now works as always for me)

I've updated my Mac to Lion and now I notice that /etc/hosts is consulted last, even after DNS. This is very annoying as I have a lot of hostnames in there that I use for development.

Where is the name resolution order configured? I can check it using dscacheutil, so here's what a Snow Leopard machine tells me:

pilif@tali ~ % dscacheutil -configuration
DirectoryService Cache search policy:
    /Local/Default
    /BSD/local

Settings:
AAAA Queries  - Disabled (link-local IPv6 addresses)
Default TTL   - 3600
Policy Flags  - 0

And here is what Lion tells me

pilif@kosmos ~ % dscacheutil -configuration
DirectoryService Cache search policy:
    /Local/Default

Unable to get details from the cache node
Unable to get cache configuration information

aside of the two errors, I would assume that /BSD/Local is what makes it read /etc/hosts earlier.

Does anybody have any idea where this "Cache search policy" is stored and how to change it back?

I know that I can create host name entries using dcsl, but I'd really like to keep my /etc/hosts which I use on various machines.

Update: The resolution order can apparently be configured in the directory Utility. Unfortunately, this installations Directroy Utility doesn't list the BSD files any more in the Services tab.

Is this feature gone from Lion? Or is this installation hosed?


Solution 1:

I solved the problem (and thus posting as an answer instead of amending the question):

The BSD files are indeed not listed in Directory Utility, nor in dscacheutil any more, but at least /etc/hosts is still read, but there is a problem in that multiple host names per IP address don't seem to be supported anymore or at least, they don't work right ATM.

When your old /etc/hosts could have looked like

127.0.0.1 localhost foo foobar

This would cause the ~10 second wait time to resolve any of these host names.

But if you use

127.0.0.1 localhost
127.0.0.1 foo
127.0.0.1 foobar

Resolution will be instant.

RedGrittyBrick's answer is also valid, but I specifically want to continue to use the hosts file over modifying the local directory as it's shared between various development machines of mine.

To answer the rest of my questions too (now all is clear to me):

  • The cache resolution order you configure in the directory utility where you can tell it which of the enabled directories you want to look at in what order.
  • To configure directories, also use the directory utility
  • The directory utility is launched by going to System Preferences > Accounts > Login Options > Join Directory > Directory Utility
  • In Lion, the BSD Files "directory" isn't available any more even though the help file still refers to it
  • As I said, /etc/hosts is still read, but there's the bug I described above.

Solution 2:

The matter is Lion handles .local TLD differently because it's reserved for some Multicast DNS features (used by Bonjour). The only way i found to solve this issue is using a different TLD for development hosts (ie: .dev). It works fine for me, hope it's gonna be helpful to others!

Solution 3:

As I expect you know, the traditional Unix way to handle this is by using a hostresorder or order directive in /etc/resolv.conf. OS X does (or can be made to) read and use these files but OS X has a separate system administered through network preferences which I believe overwrites these configuration files at bootup.

http://hints.macworld.com/article.php?story=20070223050607406

http://docs.info.apple.com/article.html?path=ServerAdmin/10.6/en/od4939886e.html

https://discussions.apple.com/thread/2493759

http://blog.daemon.com.au/go/blog-post/managing-the-host-file-on-leopard

This doesn't answer your question but the info and links may help find one. I'd have put this in a comment if I could condense it down to fit.

Solution 4:

It's possible to work around this problem by using dnsmasq as a local DNS and adding entries there, or use dnsmasq to use /etc/hosts.

It's possible to use a script to set the DNS server order:

Filename: setdsn
-------------------------------------------------
#!/bin/bash

# Script is used to set the Nameserver Lookup under Max OS X 10.4 with the Console
# Script by Stephan Oeste

if [ $# -lt 2 ] ; then
echo "Use: $0 [2.Nameserver]"
echo "Example Use: $0 example.tld 1.2.3.4 1.2.3.5"
exit 1
fi

PSID=$( (scutil | grep PrimaryService | sed -e 's/.*PrimaryService : //')<< EOF
open
get State:/Network/Global/IPv4
d.show
quit
EOF
)

scutil << EOF
open
d.init
d.add ServerAddresses * $2 $3
d.add DomainName $1
set State:/Network/Service/$PSID/DNS
quit
EOF
-------------------------------------------------

Create the file:

chmod +x setdns

And then use ist with (Example): setdns domain.com 12.23.34.45
(Posted by emzy on http://hints.macworld.com/article.php?story=20050621051643993)

If you want the script to automatically load on network change, you should create a .plist, put it in /Library/LaunchDaemons and use:

sudo launchctl load -w /LibraryLaunchDaemons/name.your.plist

Solution 5:

I ran into this issue in Snow Leopard while trying to set up a transparent Software Update Server. I've gotten it working on Lion now as well. The Software Update Server itself is halfway between a hack and a kludge, but this issue was solved pretty elegantly. Here's what I know:

  • /etc/hosts does exist in Lion and like recent OS X versions is set to be read after DNS.
  • /etc/resolv.conf exists in Lion but is a symlink to /var/run/resolv.conf.
  • /var/run/resolv.conf is rewritten anytime your network configuration is updated. That can be due to restarts, DHCP lease renewals, etc..

I created the following script. /usr/local/hostsBind:

mv /var/run/resolv.conf /var/run/resolv.conf.new
echo order hosts, bind > /var/run/resolv.conf
cat /var/run/resolv.conf.new >> /var/run/resolv.conf

this backup the current main resolv.conf file, creates a new one with the desired order of hosts before BIND, and concatenates the previous file to the end.

I call this script by watching main resolv.conf file with the following launched job at /Library/LaunchDaemons/com.domain.hostsBind.plist (you can change com.domain to something that makes sense for you):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.domain.hostsBind</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/hostsBind</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>/var/run/resolv.conf</string>
    </array>
</dict>
</plist>

This has been working for our organization with a Lion Software Update server.

Last thing to note, this works just fine with Snow Leopard as well if you change the path for resolv.conf to /etc/resolv.conf. Lion just threw the curveball of the symlink to /var/run/ instead of /etc/.

-b

P.S.: Source for the script: http://forums.macrumors.com/showthread.php?p=6742920