如何在不导致停机的情况下更新 DNS 解析器配置?

如何在不导致停机的情况下更新 DNS 解析器配置?

一张纸条

新问题,因为关于这个问题的其他一切都似乎已经过时和/或相互矛盾。请保持投票 :)

问题

在 Ubuntu 12 和 14 Server 的常规安装中,目前的建议似乎是,更改 DNS 的方式是编辑接口文件并在其中添加 dns- 选项。唯一的问题是,在服务器上,正常运行时间是一个问题,似乎强制应用这些更改的唯一方法是使用 反弹受影响的网络接口ifdown/ifup

我需要对大量服务器进行一系列 DNS 更改,并且需要批量更新它们的解析器配置,而无需以这种方式切换网络接口。我还需要确保更改在重启后仍然有效。

问题是所有这些服务器都是用文件中的 dns- 选项构建的interfaces,这意味着如果我更改resolvconfhead文件tail,则重新启动时会出现一堆重复的行。

该过程需要类似于:

  1. 彻底消除解析器配置(目前它无处不在)
  2. 将选项设置为新的、已知的良好值
  3. 保存这些选项,以便应用程序可以立即使用它们,并且它们在重新启动后仍然有效。

总结一下:

什么行不通

  • 编辑行interfaces(需要停机来回收界面)
  • 直接编辑 resolv.conf(不会生效,不会保存)
  • 编辑 resolvconfheadtail文件(不会生效,重启时会有重复的行)

实际问题

有没有办法实现这样的改变,没有中断服务?理想情况下,我可以强制 resolvconf 完成其更新过程,而无需切换界面。

答案1

如果你绝对不能resolv.conf处于不一致的状态,那么我做了以下事情:

  1. dns-从您的行生成的解析器的“状态”/etc/network/interfaces存储在/var/run/resolvconf/interface/(interfacename).inet- 此文件已被截断。

  2. 将相同的数据(search,,nameserver等等,与已完成的中的相同内容resolv.conf)复制到/etc/resolvconf/resolv.conf.d/tailtail必须创建的文件)中,并添加适当的注释,以便后来的任何人都可以看到发生了什么。

  3. dns中的行被/etc/network/interfaces注释掉了

  4. 最后运行从尾部文件resolvconf -u重新生成/etc/resolv.conf

其效果是:

  • 将解析器设置与网络接口分离(如果您使用单个接口盒,则这会产生不必要的烦恼)

  • 将解析器设置放在单一用途的文本文件(tail文件)中

  • 使更改立即生效

  • ..并让它们在重启后继续存在

  • 并重新生成整个系统/etc/resolv.conf,保持resolvconf通知机制完好。

  • ...无停机时间 :D

相关内容