在配置 postfix 和 opendkim 的过程中,我决定升级 Debian jessie (oldstable) 以进行扩展。从那时起,我就无法让 opendkim 正常启动。
我期望的是 /etc/default/opendkim 中的配置应该得到尊重,特别是 RUNDIR 和 SOCKET 设置应该放在后缀 chroot 中:
# Command-line options specified here will override the contents of
# /etc/opendkim.conf. See opendkim(8) for a complete list of options.
#DAEMON_OPTS=""
# Change to /var/spool/postfix/var/run/opendkim to use a Unix socket with
# postfix in a chroot:
RUNDIR=/var/spool/postfix/var/run/opendkim
# Uncomment to specify an alternate socket
# Note that setting this will override any Socket value in opendkim.conf
SOCKET=local:$RUNDIR/opendkim.sock
USER=opendkim
GROUP=opendkim
PIDFILE=$RUNDIR/$NAME.pid
EXTRAAFTER=
但是,无论我重新启动,执行“service opendkim start”还是“/etc/init.d/opendkim start”,/var/run/opendkim都会被用作RUNDIR,因此pid文件和套接字都放在错误的位置:
/usr/sbin/opendkim -P /var/run/opendkim/opendkim.pid -p local:/var/run/opendkim/opendkim.sock
我读到这是因为 /etc/init.d/opendkim 文件(与所有其他 debian init 文件一样)包含位于 /lib/lsb/init-functions 的 LSB init 函数,该函数在 /lib 运行 systemd 脚本/lsb/init-functions.d/40-systemd,这又将执行重定向为“systemctl start opendkim”
这意味着读取 /etc/systemd/system/multi-user.target.wants/opendkim.service 中的单元文件,并执行其中的 ExecStart 行
我还读到,我可以通过在包含 lsb init 函数之前设置环境变量 _SYSTEMCTL_SKIP_REDIRECT 来跳过 systemctl 重定向。
我现在配置 opendkim 的正确方法是什么?
A。我还应该编辑 /etc/default/opendkim 并将 _SYSTEMCTL_SKIP_REDIRECT 添加到 /etc/init.d/opendkim 吗?
b. /etc/systemd/system/multi-user.target.wants/opendkim.service 中的 systemctl 单元文件是如何生成的,它是否应该足够智能以包含我的配置?即我没有做错什么吗?
C。或者我应该直接编辑 ExecStart 行?
答案1
以上都不是。
- 不要胡思乱想
_SYSTEMCTL_SKIP_REDIRECT
。这是一个内部机制,不关你的事。 - 单元文件不在该位置。这是一个符号链接。 systemd 单元文件是
/lib/systemd/system/opendkim.service
. - 不要编辑 systemd 单元文件。它由 Debian 的 OpenDKIM 软件包提供,不应进行修改。
- 一般来说,一个很好的经验法则是,错误的答案作为对问题的评论将是糟糕的建议。它就在这里。
OpenDKIM 人们提供opendkim.service
systemd 的文件。它面向 RedHat 及其/etc/sysconfig
系统,而不是面向 Debian 及其系统,因此根本/etc/default
没有注意到。/etc/default/opendkim
Debian 人并没有修复它,而是提供了其他 opendkim.service
系统文件它用于代替 Debian 软件包中 OpenDKIM 提供的版本。该服务单元不读取 或/etc/sysconfig/opendkim
,并且硬连线OpenDKIM 使用的套接字/etc/default/opendkim
的位置。AF_LOCAL
这就是人们所得到的/lib/systemd/system/opendkim.service
。
/lib/systemd/system/opendkim.service
因此,人们可能会认为有人在编辑。一个则不然。 systemd 规则是不编辑软件包提供的服务单元文件/lib/systemd
。 systemd 修改此服务的方法是在/etc/systemd/system/opendkim.service.d/
目录中添加覆盖 INI 文件。其中包含要覆盖的包提供的服务单元部分的片段。
因此,人们可能会认为只需创建这样一个片段即可。一个则不然。 Debian 人提供了名为的“生成器”程序opendkim.service.generate
它会根据文件的内容自动创建这样的代码片段/etc/default/opendkim
,并根据需要覆盖User
、Group
和。ExecStart
问题是 Debian 的人们没有正确地将这个生成器连接到 systemd 中。这其实不是一个系统生成器,它具有特定的形式并具有该程序所没有的特定类型的输出。它也没有与 Debian 软件包安装和删除过程挂钩。您需要/lib/opendkim/opendkim.service.generate
手动运行,然后是显式的systemctl daemon-reload
.
进一步阅读
- 乔治·古里滕 (2017-04-25)。 systemd 服务在启动时覆盖 opendkim.conf 套接字。 Debian 错误 #861169。