(Raspian) DHCP 启动竞争条件 - 启动时出现大量服务失败(约 5-10 秒没有 DNS)

(Raspian) DHCP 启动竞争条件 - 启动时出现大量服务失败(约 5-10 秒没有 DNS)

(编辑:这不仅仅适用于后缀;这正是我注意到/调试它的地方)

我已经安装了 postfix,但是当它启动并创建其 chroot 时,它会得到一个空副本,/etc/resolv.conf这意味着它无法解析任何域。

我在各种网络脚本中添加了一些日志记录,以查看resolve.conf何时被擦除/重新填充以及postfix何时启动...

这是启动时的日志:

Sun Mar 27 19:12:30 UTC 2016
  EXECUTE: root + /sbin/resolvconf2 -d eth0 -f

Sun 27 Mar 19:12:31 UTC 2016
  Postfix startup script

Sun Mar 27 19:12:37 UTC 2016
  EXECUTE: root + /sbin/resolvconf2 -a eth0

请注意,调用 resolvconf 来擦除配置然后重新填充它之间有 7 秒的时间。在此期间,/etc/resolv.conf 实际上是空的。 postfix(和许多其他服务)就是在这些调用之间启动的。

在清除/重新创建 resolvconf 之间的巨大间隙中启动服务似乎很奇怪。

这是 Raspbian 的全新安装,安装了 Postfix,没有其他更改。

编辑:查看系统日志,实际上有大量的事情由于在 dhcpcd 启动和完成之间没有 DNS 而失败。其他服务试图同时启动似乎有缺陷?

答案1

好吧,在浪费了很多时间之后,我在 raspi-conf 中找到了这个......

raspi会议

所以这似乎是设计上的问题。默认的“快速启动”是以随机故障为代价的。在干净的 Raspian 安装中,即使没有安装 postfix,我的系统日志也包含 DHCP 过程中来自各种脚本的大量 DNS 错误。

因此,解决方法是将其设置为“慢速”启动,这会创建一个在启动时等待网络的脚本。编辑raspi-config:您可以像这样编写调用脚本:

sudo raspi-config nonint do_wait_for_network Slow

这修复了我注意到的后缀问题,并且还清除了通常在启动时写入系统日志的大量与 DNS 相关的错误。

我认为作为默认行为,这是疯狂的。我已经发帖了GitHub 上的反馈

答案2

处理此问题的另一种方法是在网络完全启动后重新复制 resolv.conf。您可以使用 systemd 来完成此操作,方法是将以下内容放入 /etc/systemd/system 中的文件中,并命名为类似 的文件fixpostfix.service,然后运行sudo systemctl fixpostfix.service​​。现在,每次重新启动后,一旦网络完全在线,这将复制正确填写的 resolv.conf

[Unit]
Description=Fix poorly copied resolv.conf for postfix
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
ExecStart=/bin/cp /etc/resolv.conf /var/spool/postfix/etc/resolv.conf

[Install]
WantedBy=multi-user.target

答案3

还必须考虑另一件事,即优先将服务分配给具有 DHCP 指定 IP 地址的服务器。

dhcpclient 默认情况下不等待 IP 地址。虽然您可能对在工作站中更改它不感兴趣,但在会产生优先级问题的服务器中。

默认情况下,使用 -nw 选项调用So dhclient,根据手动的:

-nw 立即(不等待)成为守护进程,而不是等到获取 IP 地址。

这种优先顺序给我带来了一些问题(例如,即使在 DHCP 退出挂钩中重新启动,BIND 也无法正确启动)

我已将 eth0 更改为:

iface eth0 inet dhcp

iface eth0 inet manual
   pre-up /sbin/dhclient -v -pf /run/dhclient.eth0.pid -lf /var/lib/dhcp/dhclient.eth0.leases eth0

相关内容