Debian

在存在 init.d 和 systemctl 腳本的情況下配置 Debian 的 opendkim 包的 init 腳本參數

  • July 4, 2017

在我配置 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文件和​​socket都放在了錯誤的位置:

/usr/sbin/opendkim -P /var/run/opendkim/opendkim.pid -p local:/var/run/opendkim/opendkim.sock

我讀到這是因為 /etc/init.d/opendkim 文件(與所有其他 debian 初始化文件一樣)在 /lib/lsb/init-functions 中包含 LSB 初始化函式,該函式在 /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的正確方法是什麼?

一種。我還應該編輯 /etc/default/opendkim 並將 _SYSTEMCTL_SKIP_REDIRECT 添加到 /etc/init.d/opendkim 嗎?

灣。/etc/systemd/system/multi-user.target.wants/opendkim.service 中的 systemctl 單元文件是如何生成的,它是否應該足夠聰明以包含我的配置?即我沒有什麼問題嗎?

C。或者我應該直接編輯 ExecStart 行嗎?

以上都不是。

  • 不要胡鬧_SYSTEMCTL_SKIP_REDIRECT。這是一個與您無關的內部機制。
  • 單元文件不在該位置。那是一個符號連結。systemd 單元文件是/lib/systemd/system/opendkim.service.
  • 不要編輯 systemd 單元文件。它由 Debian 的 OpenDKIM 軟體包提供,不應修改。
  • 一般來說,一個很好的經驗法則是,一個錯誤的答案作為對該問題的評論將是糟糕的建議;它就在這裡。

OpenDKIM 人員為 systemd 提供了一個opendkim.service文件。它面向 RedHat 及其/etc/sysconfig係統,而不是面向 Debian 及其/etc/default係統,因此根本不注意/etc/default/opendkim

Debian 人員並沒有修復它,而是為 systemd提供了另一個 opendkim.service文件,用於代替 Debian 軟體包中 OpenDKIM 提供的文件。該服務單元不讀取/etc/sysconfig/opendkim/etc/default/opendkim硬連線AF_LOCALOpenDKIM 使用的套接字的位置。這就是一個人得到的/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覆蓋UserGroupExecStart

問題是 Debian 的人沒有把這個生成器正確地連接到 systemd 中。它不是一個真正的systemd生成器,它具有特定的形式並具有該程序沒有的特定類型的輸出。它也沒有與 Debian 軟體包安裝和刪除過程掛鉤。您需要/lib/opendkim/opendkim.service.generate手動執行,然後是顯式的systemctl daemon-reload.

進一步閱讀

引用自:https://unix.stackexchange.com/questions/375152