rudwna Asked: 2019-06-26 00:42:17 +0800 CST2019-06-26 00:42:17 +0800 CST 2019-06-26 00:42:17 +0800 CST 为什么对 /etc/hosts 的更改会立即生效? 772 对/etc/hosts文件的更改似乎立即生效。我对实现感到好奇。使用什么魔法来实现这个功能? 问Ubuntu:修改/etc/hosts后需要重启哪个服务? NetApp 支持:/etc/hosts 文件的工作原理 networking hosts 2 个回答 Voted Best Answer mosvy 2019-06-26T00:55:00+08:002019-06-26T00:55:00+08:00 神奇的是打开/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 的解析器,而是通过其他方式复制其工作原理。 dr_ 2019-06-26T02:05:05+08:002019-06-26T02:05:05+08:00 除其他外,名称解析由/etc/nsswitch.conf. 这是一段摘录: passwd: files sss shadow: files sss group: files sss hosts: files dns myhostname (...) 注意hosts线。它说:“解析主机名时,首先读取/etc/hosts文件以查找主机名,如果找不到则运行 DNS 查询,如果找不到则尝试本地配置的系统主机名”。 所以这就是为什么它如此之快。请注意,它不依赖于机器上的网络服务,因此没有服务可以重新启动或重新加载。
神奇的是打开
/etc/hosts
文件并读取它:该
getaddrinfo(3)
函数是唯一/etc/hosts
的标准名称解析接口,每次调用它来解析主机名时都会打开并读取。不使用标准
getaddrinfo(3)
但仍以某种方式添加/etc/hosts
到混合中的更复杂的应用程序(例如dnsmasq
DNS 服务器)可能会inotify(7)
用于监视文件的更改/etc/hosts
并仅在需要时重新读取它。浏览器和其他此类应用程序不会这样做。
/etc/hosts
他们将在每次需要解析主机名时打开并读取,即使他们没有直接使用 libc 的解析器,而是通过其他方式复制其工作原理。除其他外,名称解析由
/etc/nsswitch.conf
. 这是一段摘录:注意
hosts
线。它说:“解析主机名时,首先读取/etc/hosts
文件以查找主机名,如果找不到则运行 DNS 查询,如果找不到则尝试本地配置的系统主机名”。所以这就是为什么它如此之快。请注意,它不依赖于机器上的网络服务,因此没有服务可以重新启动或重新加载。