在存在 init.d 和 systemctl 腳本的情況下配置 Debian 的 opendkim 包的 init 腳本參數
在我配置 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_LOCAL
OpenDKIM 使用的套接字的位置。這就是一個人得到的/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 中。它不是一個真正的systemd生成器,它具有特定的形式並具有該程序沒有的特定類型的輸出。它也沒有與 Debian 軟體包安裝和刪除過程掛鉤。您需要
/lib/opendkim/opendkim.service.generate
手動執行,然後是顯式的systemctl daemon-reload
.進一步閱讀
- 喬治·古里頓 (2017-04-25)。 systemd 服務在 start 覆蓋 opendkim.conf 套接字。Debian 錯誤 #861169。