我已经使用这个服务器一周了。全新 Ubuntu 20.04 安装,所有软件包都通过 apt 安装。我可以在我的 IP 之外接收和发送邮件就好了。突然间,再也无法接收电子邮件了。
我检查了日志,很快就注意到了这error: unsupported dictionary type: mysql
条消息,这意味着 postfix 无法根据我的数据库检查收件人。我检查了我的apt list --installed
输出,但安装了 postfix-mysql,所以这不是问题。我很快发现我需要添加以下行:
mysql /usr/lib/postfix/postfix-mysql.so.1.0.1 dict_mysql_open
to/etc/postfix/dynamicmaps.cf
并执行postfix reload
.
我的问题是:这怎么可能发生?我确实有一个apt update && apt upgrade
运行自动更新服务器的 cron。
更新
我看到的最后一个更新是这个:
2021-09-28 23:01:31 upgrade postfix:amd64 3.4.13-0ubuntu1.1 3.4.13-0ubuntu1.2
问题在那之后就开始了。dynamicmaps.cf
除了顶部的注释指令行之外是空的。我添加了 mysql 行,现在这是文件中唯一的功能行。
更新 2
杀死所有发现的进程后,ps -Af | grep -E 'dpkg|debconf|apt|unatt'
我跑了:
sudo apt update
sudo apt-get install --fix-broken
sudo dpkg --configure -a -D223
在尝试配置后缀时,这给了我以下错误:
D000001: process queue pkg postfix-mysql:amd64 queue.len 54 progress 1, try 1
dpkg: dependency problems prevent configuration of postfix-mysql:
postfix-mysql depends on postfix (= 3.4.13-0ubuntu1.2); however:
Package postfix is not installed.
dpkg: error processing package postfix-mysql (--configure):
dependency problems - leaving unconfigured
我对 dpkg 了解不多,无法理解这一点。这里发生了什么事?
更新 3
dpkg-query --show --showformat='${package} ${status}\n' 'postfix*'
产量:
postfix install ok installed postfix-cdb unknown ok not-installed
postfix-doc unknown ok not-installed
postfix-ldap unknown ok not-installed
postfix-lmdb unknown ok not-installed
postfix-mysql install ok installed
postfix-pcre unknown ok not-installed
postfix-pgsql unknown ok not-installed
postfix-sqlite unknown ok not-installed
因此,两个请求的软件包都处于正常且已安装的状态。据我所见,apt 命令并没有提出修复建议(我仔细阅读了输出)。看来你的建议奏效了。
我不喜欢的是不知道自己在做什么,但那是由于我自己的 apt 和 dpkg 缺乏知识。
每次升级后缀地图包时,它将首先从中删除其各自的地图类型,
/etc/postfix/dynamicmaps.cf
并且仅在以后添加它(返回)。您可以通过强制重新配置手动查看这是否有效dpkg-reconfigure postfix-mysql
。如果升级后文件为空,则可能意味着升级被中断 - 甚至仍然挂起,等待从未出现的用户输入。如果您正在应用所有 SRU,那么您将已将 Postfix 升级到
3.4.13-0ubuntu1.2
Ubuntu 20.04。我建议您确认当前没有应用升级:您的 cron 作业存在缺陷,因为它无法告诉 apt 这是一个非交互式调用,这可能是它挂起的原因。
如有必要,请确保正确安装所有软件包。在此步骤中,您可能会看到有助于确定cron 作业失败原因的警告或问题。
不要忘记删除有问题的 cron 作业,因为它设置了一些可靠的东西。当没有管理员待命时,该程序
unattended-upgrade
通常是在 Ubuntu 系统上应用升级的首选方法。它将跳过或使用默认值来处理 apt 以交互方式要求的内容。