(编辑:这不仅仅适用于后缀;这正是我注意到/调试它的地方)
我已经安装了 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 中找到了这个......
所以这似乎是设计上的问题。默认的“快速启动”是以随机故障为代价的。在干净的 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