文件/etc/resolv.conf 的更改是否立即生效?

Sug*_*rma 1 linux-kernel

我正在更改文件 /etc/resolv.conf。但是 DNS 正在再次解析为旧 IP,而不是我更新的 IP,我希望避免重新启动服务器。有人可以建议一个解决方法吗?

小智 7

配置文件

因为resolv.conf是普通文件,所以对您的问题的正确但不太有用的答案很简单,是的,当任何进程写入该文件时,该文件会立即更改(与系统中的任何其他普通文件完全相同)。

系统解析器

尽管如此,您的实际问题可能是您想知道解析域名的进程是否会立即使用resolv.conf文件中的新数据。

任何进程都可以按照自己的意愿读取和解释此文件,但在绝对大多数情况下(让我们将专门的 DNS 实用程序放在一边),它只是通过使用例如getaddrinfo()gethostname()函数来调用系统解析器。

所以你需要找出系统解析器如何处理这些文件(它实际上不仅影响整个过程,resolv.conf而且nsswitch.conf影响整个过程)。可以开始查看各自的联机帮助页(resolv.confnsswitch.conf)。有一个声明,相应的文件在第一次被进程调用时被解析器例程读取。因此,更改不会传播到已经运行的进程。

但是这个声明隐含地假设,程序只是调用getaddrinfo()而不关心其他任何事情。对于大多数简单的实用程序等来说都是如此,但如果认为合适,有一些方法可以改变这种行为。

有一个res_init()函数,它通常在第一次调用getaddrinfo()或类似的时候被隐式调用,但应用程序也可以自由地显式调用它。可以读取res_init() 函数读取配置文件(参见 resolv.conf(5))以获取默认域名、搜索顺序和名称服务器地址。因此,应用程序有一个工具可以复制系统解析器的状态以重新读取这些文件。但它必须是明确的要求。

所以,最后,唯一可能的答案是它取决于。对于小型实用程序,解析器文件只能读取一次,您必须重新启动此实用程序才能更新数据。较大的、长时间运行的应用程序(例如 Web 浏览器)可以有自己的观看方式,resolv.conf并且可以res_init()在认为合适的时候调用。无论如何,这是依赖于应用程序的,它与网络管理器或填充resolv.conf新数据的任何其他系统无关。