(这个问题在 10.7.1 更新后消失了 - /etc/hosts 现在对我来说可以像往常一样工作了)
我已经将 Mac 更新到 Lion,现在我注意到 /etc/hosts 是最后才被查询的,甚至在 DNS 之后也是如此。这非常烦人,因为我有很多用于开发的主机名。
名称解析顺序在哪里配置?我可以使用 dscacheutil 检查它,以下是 Snow Leopard 机器告诉我的内容:
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
以下是 Lion 告诉我的内容
pilif@kosmos ~ % dscacheutil -configuration
DirectoryService Cache search policy:
/Local/Default
Unable to get details from the cache node
Unable to get cache configuration information
除了这两个错误之外,我认为 /BSD/Local 是导致它更早读取 /etc/hosts 的原因。
有人知道这个“缓存搜索策略”存储在哪里以及如何将其改回来吗?
我知道我可以使用 dcsl 创建主机名条目,但我真的很想保留我在各个机器上使用的 /etc/hosts。
更新:解析顺序显然可以在目录实用程序中配置。不幸的是,此安装的 Directroy Utility 不再在服务选项卡中列出 BSD 文件。
Lion 是否取消了该功能?或者该安装是否已失败?
答案1
我解决了这个问题(因此将其作为答案发布而不是修改问题):
BSD 文件确实没有在目录实用程序中列出,也没有在 dscacheutil 中列出,但至少 /etc/hosts 仍在读取,但存在一个问题,即每个 IP 地址的多个主机名似乎不再受支持,或至少,它们目前不能正常工作。
当你的旧 /etc/hosts 看起来像这样
127.0.0.1 localhost foo foobar
这将导致约 10 秒的等待时间来解析任何这些主机名。
但如果你使用
127.0.0.1 localhost
127.0.0.1 foo
127.0.0.1 foobar
解决方案将立即得到解决。
RedGrittyBrick 的答案也是有效的,但我特别想继续使用 hosts 文件而不是修改本地目录,因为它在我的各种开发机器之间共享。
回答我其余的问题(现在我一切都清楚了):
- 您可以在目录实用程序中配置缓存解析顺序,您可以告诉它您想要以何种顺序查看哪些启用的目录。
- 要配置目录,还可以使用目录实用程序
- 进入系统偏好设置 > 帐户 > 登录选项 > 加入目录 > 目录实用程序,即可启动目录实用程序
- 在 Lion 中,BSD 文件“目录”不再可用,尽管帮助文件仍然引用它
- 正如我所说,/etc/hosts 仍然被读取,但是存在我上面描述的错误。
答案2
问题在于 Lion 对 .local TLD 的处理方式不同,因为它是为某些多播 DNS 功能保留的(Bonjour 使用)。我发现解决此问题的唯一方法是为开发主机使用不同的 TLD(即:.dev)。对我来说,它工作得很好,希望它对其他人有帮助!
答案3
我想您知道,处理此问题的传统 Unix 方式是使用hostresorder
或order
指令/etc/resolv.conf
。OS X 确实(或可以使其)读取和使用这些文件,但 OS X 有一个通过网络偏好设置管理的单独系统,我相信它会在启动时覆盖这些配置文件。
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
这并不能回答您的问题,但信息和链接可能有助于找到答案。如果我可以将其压缩到合适的大小,我会将其放在评论中。
答案4
我在 Snow Leopard 中尝试设置透明的软件更新服务器时遇到了这个问题。现在我也在 Lion 上让它工作了。软件更新服务器本身介于黑客和临时解决方案之间,但这个问题得到了相当优雅的解决。以下是我所知道的:
- /etc/hosts 确实存在于 Lion 中,并且与最近的 OS X 版本一样设置为在 DNS 之后读取。
- /etc/resolv.conf 存在于 Lion 中但它是 /var/run/resolv.conf 的符号链接。
- 每次更新网络配置时,都会重写 /var/run/resolv.conf。这可能是由于重新启动、DHCP 租约续订等。
我创建了以下脚本。/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
这将备份当前的主要 resolv.conf 文件,在 BIND 之前创建一个具有所需主机顺序的新文件,并将前一个文件连接到末尾。
我通过观察主 resolv.conf 文件来调用此脚本,并在 /Library/LaunchDaemons/com.domain.hostsBind.plist 中启动以下作业(您可以更改com.域名对你来说有意义的事情):
<?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>
我们的组织一直使用 Lion 软件更新服务器来解决这个问题。
最后要注意的是,如果您将 resolv.conf 的路径更改为 /etc/resolv.conf,这在 Snow Leopard 上也能很好地工作。Lion 只是将符号链接的路径改为 /var/run/,而不是 /etc/。
-b
PS:脚本来源:http://forums.macrumors.com/showthread.php?p=6742920