为什么对 /etc/hosts 的更改会立即生效?

为什么对 /etc/hosts 的更改会立即生效?

对文件的更改/etc/hosts似乎立即生效。我对实施感到好奇。到底用了什么魔法来实现这个功能呢?

  1. 问Ubuntu:修改/etc/hosts后哪个服务需要重启?
  2. NetApp 支持:/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到混合中的更复杂的应用程序(例如dnsmasqDNS 服务器)可能会用来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 查询,如果没有找到,则尝试本地配置的系统主机名”。

这就是它这么快的原因。请注意,它不依赖于计算机上的网络服务,因此无需重新启动或重新加载服务。

相关内容