在使用(debian-9.8.0-amd64-netinst.iso)进行最小 debian stretch 安装后,其中主机名保留为默认值debian
而域保留为空,安装 postfix 会失败,因为检测到的完全限定主机名包含尾随.
字符。
我认为它是在没有网络管理器的最小安装上dhclient
保存文件。即使 DHCP 服务器没有发送任何字符(见下文),它的搜索子句中也有尾随字符。resolv.conf
.
如果hostname --fqdn
为空,postfix 会查找resolv.conf
并sed
尝试使用带有尾随的 FQDN,.
这会导致 postfix 安装失败(见下文)。
错误在哪里?在postfix.postinst
,在dhclient
,按照我的理解还是在其他地方?
实际上,从 Dockerfile 安装 postfix 时会失败,但在极简 Debian 安装中也会出现同样的行为,因此它与 Docker 无关,除了您无法控制“主机”/容器的 FQDN,docker build
所以我们遇到了这个问题。解决方法当然是resolv.conf
在安装 postfix 之前打补丁,但这很像黑客行为。(除非你有更好的主意?)
细节:
在 /etc/hosts 中:
127.0.0.1 localhost
127.0.1.1 debian
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
/etc/resolv.conf
domain capmon.lan
search capmon.lan. capmon.
nameserver 10.10.10.251
现在正在运行apt-get install postfix
:
<snip>
setting myhostname: debian.capmon.lan.
setting alias maps
setting alias database
mailname is not a fully qualified domain name. Not changing /etc/mailname.
setting destinations: $myhostname, debian, localhost.localdomain, , localhost
setting relayhost:
setting mynetworks: 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
setting mailbox_size_limit: 0
setting recipient_delimiter: +
setting inet_interfaces: all
setting inet_protocols: all
Postfix (main.cf) is now set up with a default configuration. If you need to
make changes, edit /etc/postfix/main.cf (and others) as needed. To view
Postfix configuration values, see postconf(1).
After modifying main.cf, be sure to run 'service postfix reload'.
Running newaliases
newaliases: warning: valid_hostname: misplaced delimiter: debian.capmon.lan.
newaliases: fatal: file /etc/postfix/main.cf: parameter myhostname: bad parameter value: debian.capmon.lan.
dpkg: error processing package postfix (--configure):
subprocess installed post-installation script returned error exit status 75
Processing triggers for systemd (232-25+deb9u12) ...
Processing triggers for rsyslog (8.24.0-1) ...
Errors were encountered while processing:
postfix
E: Sub-process /usr/bin/dpkg returned an error code (1)
这是因为后缀myhostname
有一个尾随的.
:
# grep ^myhostname /etc/postfix/main.cf
myhostname = debian.capmon.lan.
这是因为/var/lib/dpkg/info/postfix.postinst
:
# The resolver uses the last one found, and ignores the rest
mydom=$(sed -n 's/^search[[:space:]]*\([^[:space:]]*\).*/\1/p;s/^domain[[:space:]]*\([^[:space:]]*\).*/\1/p' /etc/resolv.conf | tail -1)
myhostname="$myhostname${mydom:+.$mydom}"
果然:
# sed -n 's/^search[[:space:]]*\([^[:space:]]*\).*/\1/p' /etc/resolv.conf
capmon.lan.
我已经检查过(也检查过传输的字节数),DHCP 服务器确实不是发送尾随.
字符:
答案1
问题出在/var/lib/dpkg/info/postfix.postinst
。
考虑 Debian 版本及其各自的后缀版本,以及所有失败安装后脚本中出现相同的错误 75:
它们都具有以下共同的功能myfqdn
:
mydom=$(sed -n 's/^search[[:space:]]*\([^[:space:]]*\).*/\1/p;s/^domain[[:space:]]*\([^[:space:]]*\).*/\1/p' /etc/resolv.conf | tail -1)
myhostname="$myhostname${mydom:+.$mydom}"
另一方面
- 书呆子后缀为 3.6.4-1
不同之处在于myfqdn
:
#