为什么 dhclient + systemd-resolved 频繁重启?

为什么 dhclient + systemd-resolved 频繁重启?

我在 aws 上运行 ubuntu 服务器,版本为“18.10 (Cosmic Cuttlefish)”

我们一直遇到间歇性的 DNS 解析问题,在调查过程中,我发现每隔 20 分钟左右我就会在系统日志中看到以下内容

Mar 19 00:17:03 localhost dhclient[815]: DHCPREQUEST of 172.31.26.85 on eth0 to 172.31.16.1 port 67 (xid=0x7d329bb3)
Mar 19 00:17:03 localhost dhclient[815]: DHCPACK of 172.31.26.85 from 172.31.16.1
Mar 19 00:17:03 localhost systemd[1]: Stopping Network Name Resolution...
Mar 19 00:17:03 localhost systemd[1]: Stopped Network Name Resolution.
Mar 19 00:17:03 localhost systemd[1]: Starting Network Name Resolution...
Mar 19 00:17:04 localhost dhclient[815]: bound to 172.31.26.85 -- renewal in 1747 seconds.

似乎每次 dhclient 进行更新过程时,都会导致 systemd-resolved 重新启动,这会暂时导致 dns 解析无法工作。因此,如果当时有某个进程正在运行,解析可能会失败。

我真的不知道从哪里开始。dhclient 导致 systemd-resolved 如此频繁地重启是正常的吗?这个问题的正确解决方案是什么?我是否应该强制 dhclient 减少更新频率,这会产生负面影响吗?还有其他建议吗?

答案1

我不确定究竟是什么导致了dhclient续订(特别是因为默认租赁时间/etc/dhcp/dhclient.conf#send dhcp-lease-time 3600;1 小时),但DNS解析错误似乎是此续订触发重启的结果systemd-resolved

我通过运行确认了这一点

sudo grep -Pi '(renewal|started network name)' /var/log/syslog | tail

这表明systemd在更新时间过后将重新启动。此外,我注意到,这ps -ef | grep [r]esolv表明该systemd-resolved过程从未运行超过 30 分钟,而其他服务器的该过程一次运行数周。

经过大量的谷歌搜索和困惑之后,我偶然发现了一个补丁这里

--- /etc/dhcp/dhclient-enter-hooks.d/resolved.orig  2018-12-20 22:16:45.914466953 +0000
+++ /etc/dhcp/dhclient-enter-hooks.d/resolved   2018-12-20 23:15:03.861114407 +0000
@@ -26,10 +26,13 @@
               if [ ! "$interface" ] ; then
                   return
               fi
               statedir="/run/systemd/resolved.conf.d"
               mkdir -p $statedir
+
+              oldstate="$(mktemp)"
+              md5sum $statedir/isc-dhcp-v4-$interface.conf $statedir/isc-dhcp-v6-$interface.conf > $oldstate 2>&1
               if [ -n "$new_domain_name_servers" ] ; then
                   cat <<EOF >$statedir/isc-dhcp-v4-$interface.conf
 [Resolve]
 DNS=$new_domain_name_servers
 EOF
@@ -48,11 +51,19 @@
                       cat <<EOF >>$statedir/isc-dhcp-v6-$interface.conf
 Domains=$new_dhcp6_domain_search
 EOF
                   fi
               fi
-              systemctl try-reload-or-restart systemd-resolved.service
+
+              newstate="$(mktemp)"
+              md5sum $statedir/isc-dhcp-v4-$interface.conf $statedir/isc-dhcp-v6-$interface.conf > $newstate 2>&1
+              if ! cmp --quiet $oldstate $newstate; then
+                  systemctl try-reload-or-restart systemd-resolved.service
+              fi
+
+              rm $oldstate
+         rm $newstate
           }
                 ;;

           EXPIRE|FAIL|RELEASE|STOP)
               if [ ! "$interface" ] ; then

然后我将其保存到我的服务器上,some-file然后运行sudo patch <some-file

为了保险起见,我重新启动了服务器,但不确定是否有必要。

相关内容