对文件的更改/etc/hosts
似乎立即生效。我对实施感到好奇。到底用了什么魔法来实现这个功能呢?
答案1
神奇之处在于打开/etc/hosts
文件并读取它:
strace -e trace=file wget -O /dev/null http://www.google.com http://www.facebook.com http://unix.stackexchange.com 2>&1 | grep hosts
open("/etc/hosts", O_RDONLY|O_CLOEXEC) = 4
open("/etc/hosts", O_RDONLY|O_CLOEXEC) = 5
open("/etc/hosts", O_RDONLY|O_CLOEXEC) = 4
函数getaddrinfo(3)
,即仅有的/etc/hosts
标准名称解析接口,每次调用解析主机名时都会打开并读取。
不使用标准getaddrinfo(3)
但仍以某种方式添加/etc/hosts
到混合中的更复杂的应用程序(例如dnsmasq
DNS 服务器)可能会用来inotify(7)
监视/etc/hosts
文件的更改并仅在需要时重新读取它。
浏览器和其他此类应用程序不会这样做。他们每次需要解析主机名时都会打开并读取/etc/hosts
,即使他们没有直接使用 libc 的解析器,而是通过其他方式复制其工作原理。
答案2
除其他事项外,名称解析由 管理/etc/nsswitch.conf
。以下是摘录:
passwd: files sss
shadow: files sss
group: files sss
hosts: files dns myhostname
(...)
注意该hosts
线。它说:“解析主机名时,首先读取/etc/hosts
文件来查找主机名,如果没有找到,则运行 DNS 查询,如果没有找到,则尝试本地配置的系统主机名”。
这就是它这么快的原因。请注意,它不依赖于计算机上的网络服务,因此无需重新启动或重新加载服务。