web-dev-qa-db-ja.com

dhclient + systemd-resolvedが頻繁に再起動するのはなぜですか?

VERSION = "18.10(Cosmic Cuttlefish)"のawsでubuntuサーバーを実行しています。

私たちは断続的なDNS解決の問題を抱えていて、それを調べていると、20分ごとに、syslogに次のようになっていることがわかりました

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に更新の頻度を低くするよう強制する必要がありますか?他に何か提案はありますか?

3
user3005200

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分を超えて実行されることはなく、他のサーバーがこのプロセスを一度に数週間実行していることを示していることに気付きました。

多くのグーグルと精練と混乱の後、私はパッチに出くわしました here

--- /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を実行し、サーバーにインストールしました

対策として、サーバーを再起動しましたが、それが必要かどうかはわかりません。

4
dwanderson