升级到Mac OSX Lion之后,我发现/ etc / hosts不会在名字解析的第一位被查找了。这会导致一些副作用,如:
这种行为是否有意?它有意义吗?最重要的是,我怎样才能回到原来的行为。
答案 0 :(得分:78)
我认为重要的是Lion处理。本地TLD的方式不同,因为它保留了一些多播DNS功能(由Bonjour使用)。我发现解决此问题的唯一方法是为开发主机使用不同的TLD(即:.dev)。它对我来说很好,希望它对别人有用!
答案 1 :(得分:50)
关于覆盖hosts文件中的域名,我发现在某些情况下,如果某个域感知到域名无法通过IPv4网络访问,则Lion会查询该域名的IPv6地址。
当我发现一些我之前从未见过的关于Snow Leopard的广告时,我发现了这一点,因为我已将广告域重定向到127.0.0.1
。我在IPv4 AAAA
查询(IPv4)之后启动了wireshark并注意到A
(IPv6 DNS记录)查询。广告服务器确实有IPv6广告,并能够为我提供他们的内容。
解决方法是
::1 mydomain.com
每个
的条目127.0.0.1 mydomain.com
在您的主机文件中输入。
有趣的是,如果您碰巧在127.0.0.1:80
上运行了本地网络服务器并且您的浏览器收到来自网络服务器的响应(错误或其他),则不会发出AAAA
个查询,因为它似乎是确信TCP连接至少是可能的。
在相关说明中,如果您大量使用hosts文件(用于广告拦截,本地Web开发等),您可能需要考虑运行自己的本地DNS解析程序。每次请求都必须读取/etc/hosts
,因此会有相当大的磁盘/ CPU损失,因此保持该文件非常轻便符合您的最佳利益。
在本地运行dnsmasq
之类的功能(除了显着的性能提升之外)的一个优点是,您可以将整个顶级域重定向回本地计算机。这允许您拥有整个* .dev命名空间用于开发(例如),而无需将您想要在本地解析的每个域单独输入/etc/hosts
答案 2 :(得分:17)
问题是我在符号链接/ etc / hosts文件。如果/ etc / hosts是普通文件,一切正常。
答案 3 :(得分:14)
更新(2):OSX 10.10.5返回mDNSResponder
。
更新:OSX 10.10 Yosemite已将mDNSResponder替换为“discoveryd”。我没有升级所以我不确定发现行为w / r / t DNS查找和/etc/hosts
。
Lion上的系统DNS解析器是mDNSResponder
进程。
你可能会想“但是mDNSResponder是多播dns响应者。”你是对的;这就是它最初的用途,它仍然实现了这个功能。但是,在较新的MacOS版本上,它还会执行标准主机查找。
在Lion中,它似乎不会在更改时自动重新读取/etc/hosts
,至少并非总是如此。杀死mDNSResponder
(并允许它自动重启)似乎可以解决问题。
sudo killall mDNSResponder
应该做的伎俩。
下面是我对后代的原始答案。我想在某些情况下它可能仍然是一个问题。
确保您的/etc/hosts
文件是unix样式的文本文件,其中换行符为结尾而不是cr。
使用TextWrangler或unix文本编辑器进行编辑应该保留文件。
如果您的文件已经搞砸了,请尝试按此方法修复
tr '\015' '\012' < /etc/hosts > /tmp/hosts.$$
mv /etc/hosts /etc/hosts.bad
mv /tmp/hosts.$$ /etc/hosts
# fix up permissions while we are at it
chown root:wheel /etc/hosts
chmod 644 /etc/hosts
将此修复程序归功于:
http://techpatio.com/2011/guides-how-to/fixed-mac-osx-lion-etc-hosts-bugs-dns
答案 4 :(得分:4)
iTand.me - Lion local domains and etc hosts..
总结;
但是如果你必须使用.local,我发现的最优雅的解决方案是dscl实用程序。使用它非常简单。要添加名为mydev.local的主机并将其指向localhost,请执行以下操作:
sudo dscl localhost -create /Local/Default/Hosts/mydev.local IPAddress 127.0.0.1
查看所有当前定义的主机及其IP
sudo dscl localhost -list /Local/Default/Hosts IPAddress
删除主持人:
sudo dscl localhost -delete /Local/Default/Hosts/mydev.local
总体而言,非常简单并且运作良好。我仍然希望能够编辑/ etc / hosts,但这是重命名所有.local服务器的更好选择。
答案 5 :(得分:3)
在从Snow Leopard迁移到Lion之前,我在/etc/hosts
中有几个特定于应用的条目,如下所示:
127.0.0.1 foo.bar.local
更新后,加载我的本地应用程序非常慢。我注意到延迟发生在请求出现在日志文件之前,一旦它发生,应用程序本身就像平常一样快。
现在每个应用程序有两行,如下所示:
127.0.0.1 foo.bar.local
::1 foo.bar.local
......一切都很快。
显然这会增加IPv6地址?我真的不太明白,但它确实有用。
答案 6 :(得分:3)
我的情况类似,但延迟时间恰好是5秒,只发生在以“.local”结尾的网址上。查看以'.dev'结尾的网站时,没有延迟。
我办公室的其他一些开发人员遇到了这个问题,而有些则没有。我希望有一个简单的解决方案,我不想因为其他依赖关系而将网站重命名为'.local'。
我在终端中运行了以下命令,并将我的输出与办公室中的其他几个用户进行了差异化。
scutil --dns
这部分是唯一的区别:
resolver #2
domain : 00000000.members.btmm.icloud.com
options : pdns
timeout : 5
order : 150000
我的Mac与我的iCloud帐户相关联,并启用了“回到我的Mac”。一旦我禁用了Back To My Mac,额外的解析器就会消失,5秒的延迟消失了。
答案 7 :(得分:1)
我想出了原因。
与其他人不同,我没有使用/ etc / hosts来设置本地域。我的/ etc / hosts文件是stock,只包含loopback接口和广播主机所需的条目。而且,它是一个正确编码的unix文件,因为我是那种只使用emacs从命令行编辑它的人。而且,谢天谢地,我没有必要像DNSmasq一样运行我自己的DNS服务器来解决这个问题。
(要清楚的是,让我来到这个问题的症状是emacs花了大约10秒钟开始,但只有当我在wifi上时。如果我关闭了wifi,emacs会按预期立即启动。)
我的解决方案:我的笔记本电脑有一个名字,“终结者”。 (是的,它闪亮的铝制外观让我想起了阿诺德施瓦辛格的角色。)我只需要在/ etc / hosts中添加条目以获取机器本身的名称:
127.0.0.1 terminator
::1 terminator
我通过在终端中运行一个简单的命令找到了我的主机的名称:
hostname
...带回输出:“终结者”。更改/ etc / hosts以包含这两个条目后,emacs现在可以快速解析我的笔记本电脑的名称。
我希望这有助于某人。
答案 8 :(得分:0)
我使用OSX Lion作为Web开发框时遇到了速度问题...使用了一些建议,我使用了禁用ipv6网络并将ipv6路由到localhost6 ......事情加速了很多......
sudo networksetup -setv6off Ethernet
/ etc / hosts ...
127.0.0.1 localhost
127.0.0.1 dev.aliasdomain.com
...
::1 localhost6
答案 9 :(得分:0)
我认为已经修复了一些错误。我已经看到了很多提到的问题,而且这些问题似乎都没有适用(例如,将多个别名放在一行上现在对我来说很好)。
无论如何,似乎与Lion一起,Apple对mDNSResponder进行了一些重大更改,mDNSResponder处理所有DNS查找,并且(至少Lion)还处理/ etc / hosts缓存。对我来说,正向查找现在也可以。但是反向查找(例如查找1.2.3.4而不是google.com)不起作用。
经过很多痛苦之后,看起来mDNSResponder将此查找转换为4.3.2.1.in-addr.arpa并进行名称查找。这可能是DNS更喜欢操作的方式,但它与/ etc / hosts完全不兼容。
除非您为每个主机添加别名4.3.2.1.in-addr.arpa,其中4.3.2.1是您用于查看它的相反顺序的IP地址。这为我解决了一切。这是一个/ etc / hosts条目的例子:
1.2.3.4 foo foo.example.com alias.example.com 4.3.2.1.in-addr.arpa