我已经使用这个服务器大约一周了。全新安装 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
and do a 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
当我尝试配置 Postfix 时,出现了以下错误:
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 缺乏了解。
答案1
每次升级 postfix 地图包时,它都会首先从中删除其相应的地图类型/etc/postfix/dynamicmaps.cf
,然后才将其添加回来。您可以通过 强制重新配置来手动查看此功能是否有效dpkg-reconfigure postfix-mysql
。如果升级后文件为空,这可能意味着升级被中断 - 或者仍然挂起,等待从未出现的用户输入。
如果您正在应用所有 SRU,那么您将已将 Postfix 升级到3.4.13-0ubuntu1.2
Ubuntu 20.04。我建议您确认当前没有应用任何升级:
ps -Af | grep -E 'dpkg|debconf|apt|unatt'
dpkg-query --show --showformat='${package} ${status}\n' 'postfix*'
你的 cron 任务有缺陷,它没有告诉 apt 这是一个非交互式调用,这个可能是它悬挂的原因。
如有必要,请确保所有软件包均已正确安装。在此步骤中,您可能会看到警告或问题,以帮助确定为什么你的 cron 作业失败。
sudo apt update
sudo apt-get install --fix-broken
sudo dpkg --configure -a -D223
不要忘记删除有问题的 cron 作业,因为设置了一些可靠的内容。unattended-upgrade
当没有管理员待命时,该程序通常是在 Ubuntu 系统上应用升级的首选方法。它将跳过或使用 apt 以交互方式请求的内容的默认值。