CentOS Stream9の環境でnotqmailのインストール、tcpserverとdaemontoolsを使って実行・制御する設定、systemdによるOS起動時の自動起動の設定を行いました。備忘として手順をまとめました。
※目次をクリックすると目次の下部にコンテンツが表示されます。
1)ソースの入手、解凍、配置
①入手先
https://github.com/notqmail/notqmail/releases/download/notqmail-1.08/notqmail-1.08.tar.gz
②ソースの解凍、配置
# cd /usr/local/src
# gunzip notqmail-1.08.tar.gz
# tar xvf notqmail-1.08.tar
③qmailのホームディレクトリの作成
# mkdir /var/qmail
2)qmail実行用のユーザー、グループの作成
# groupadd nofiles
# useradd -g nofiles -d /var/qmail/alias -s /bin/false alias
# useradd -g nofiles -d /var/qmail -s /bin/false qmaild
# useradd -g nofiles -d /var/qmail -s /bin/false qmaill
# useradd -g nofiles -d /var/qmail -s /bin/false qmailp
# groupadd qmail
# useradd -g qmail -d /var/qmail -s /bin/false qmailq
# useradd -g qmail -d /var/qmail -s /bin/false qmailr
# useradd -g qmail -d /var/qmail -s /bin/false qmails
3)qmailのビルド
①makeパッケージのインストール(未導入の場合)
# dnf install make
②make実行
# cd /usr/local/src/notqmail-1.08
# make setup check
③config実行
・DNSにMXレコードで登録されているホスト名を指定してconfigを実行。
例)ホスト名がmail.example.comの場合
# ./config-fast mail.example.com
Your fully qualified host name is mail.example.com.
Putting mail.example.com into control/me…
Putting example.com into control/defaultdomain…
Putting example.com into control/plusdomain…
Putting mail.example.com into control/locals…
Putting mail.example.com into control/rcpthosts…
Now qmail will refuse to accept SMTP messages except to mail.example.com.
Make sure to change rcpthosts if you add hosts to locals or virtualdomains!
4)qmailの起動スクリプトの仮作成
実際にはucspi-tcpをインストールして、tcpserverを使ってqmailの起動を行いますが、動作確認のため、qmail単体で起動・動作確認するため、qmail単体の起動スクリプトを作成します。
①起動スクリプトのテンプレートの確認
・/var/qmail/bootディレクトリ内に様々な設定内容のテンプレートが保管。
# ls /var/qmail/boot
binm1 binm1+df binm2 binm2+df binm3 binm3+df home home+df proc proc+df
②qmailの起動スクリプトの仮作成
ここでは、homeのテンプレートを使用しています。
#cp /var/qmail/boot/home /var/qmail/rc
(home)テンプレートの内容
#!/bin/sh # Using splogger to send the log through syslog. # Using qmail-local to deliver messages to ~/Mailbox by default. exec env - PATH="/var/qmail/bin:$PATH" \ qmail-start ./Mailbox splogger qmail
※Maildirの設定
ユーザーごとにmboxかMaildirかを選択せず、Maildirをデフォルトで対応するように設定したい場合は、”qmail-start ./Maildir/ splogger qmail”に指定しますが、現段階の設定内容ではMaildirを指定すると正常に起動できませんでした。Maildirの設定は、tcpserverを導入し、構築が完了した後に別途設定変更する手順としています。
5)インストール後の動作確認
①起動スクリプト実行
# sh /var/qmail/rc &
②起動したプロセスの確認
# ps -ef | grep qmail qmails 954069 949541 0 10:45 pts/0 00:00:00 qmail-send qmaill 954070 954069 0 10:45 pts/0 00:00:00 splogger qmail root 954071 954069 0 10:45 pts/0 00:00:00 qmail-lspawn ./Mailbox qmailr 954072 954069 0 10:45 pts/0 00:00:00 qmail-rspawn qmailq 954073 954069 0 10:45 pts/0 00:00:00 qmail-clean root 954075 949541 0 10:45 pts/0 00:00:00 grep --color=auto qmail
③メールの送信テスト
・自端末宛てに空メールを送信して、動作確認
echo to: myuser@mayhome.example.jp | /var/qmail/bin/qmail-inject
smtp通信(25番ポート)をリッスンして、プロセスを起動するデーモンとしての働きをするtcpserver(ucspi-tcp)をインストールします。
①ソースの入手
https://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz
②ソースの解凍、配置
# cd /usr/local/src
# gunzip ucspi-tcp-0.88.tar.gz
# tar xvf ucspi-tcp-0.88.tar
③confの修正
make実行時にエラーが発生するため以下のように修正しました。
# cd /usr/local/src/ucspi-tcp-0.88
# vi /usr/local/src/ucspi-tcp-0.88/conf-cc
訂正前 gcc -O2
↓
訂正後 gcc -O2 -include /usr/include/errno.h
④make実行
# make setup check ./install ./instcheck
2)daemontoolsをインストール
qmailのサービスやログを管理・制御するdaemontoolsをインストール。
①ソースの入手
http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
②packageディレクトリの作成
展開したディレクトリが実行ファイルの置き場になり/command/からのsymlinkとなる
# mkdir -p /package
# chmod 1755 /package
③ソースの解凍、配置
# mv daemontools-0.76.tar.gz /package
# cd /package
# gunzip daemontools-0.76.tar.gz
# tar -xpf daemontools-0.76.tar
# rm -f daemontools-0.76.tar
④インストール時のエラーを回避するためconf-cc修正
# cd /package/admin/daemontools-0.76/src
# vi conf-cc
訂正前 gcc -O2 -Wimplicit -Wunused -Wcomment -Wchar-subscripts -Wuninitialized -Wshadow -Wcast-qual -Wcast-align -Wwrite-strings
↓
訂正後 gcc -O2 -Wimplicit -Wunused -Wcomment -Wchar-subscripts -Wuninitialized -Wshadow -Wcast-qual -Wcast-align -Wwrite-strings -include /usr/include/errno.h
⑤インストール実行
# cd /package/admin/daemontools-0.76 # package/install : Copying commands into ./command... Creating symlink daemontools -> daemontools-0.76... Making command links in /command... Making compatibility links in /usr/local/bin... Creating /service... Adding svscanboot to inittab... init should start svscan now.
⑥インストールの確認
・/etc/inittabに下記設定が追加(CentOS6まではこの設定によってサーバー起動時に自動でsvscanbootが実行されていたが、CentOS7以降ではこのinittabは使われていない)
SV:123456:respawn:/command/svscanboot
・/serviceディレクトリ作成
・/commandディレクトリを作成し、/package/admin/daemontools/command/配下の各種実行プログアムがリンク
3)qmailの起動スクリプト(qmailctl)作成
①参照スクリプトの入手
http://lifewithqmail.org/qmailctl-script-dt70
②qmailctlの作成
# vi /var/qmail/bin/qmailctl
# chmod 755 /var/qmail/bin/qmailctl
# ln -s /var/qmail/bin/qmailctl /usr/bin
4)superviseスクリプト作成
①ディレクトリ作成
# mkdir -p /var/qmail/supervise/qmail-send/log
# mkdir -p /var/qmail/supervise/qmail-smtpd/log
②qmail-send(配送)の起動スクリプト作成
# vi /var/qmail/supervise/qmail-send/run
(ファイルの中身)
#!/bin/sh
exec /var/qmail/rc
③qmail-send(配送)のログ制御スクリプト
# vi /var/qmail/supervise/qmail-send/log/run
(ファイルの中身)
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail
・ログを記録するプログラムが、/usr/local/bin/multilog
・ログの作成は”qmaill”ユーザーが行うようにし、タイムスタンプの指定をするためのオプション、”t”、ログの出力先ディレクトリが、/var/log/qmail、としていまる。
④qmail-smtpdの起動スクリプト作成
# vi /var/qmail/supervise/qmail-smtpd/run
(ファイルの中身)
#!/bin/sh
PATH=/var/qmail/bin:/usr/local/bin:/bin:/usr/bin
tcpserver -v -u 1006 -g 1005 -x /etc/tcp.smtp.cdb \
-c 20 0 smtp /var/qmail/bin/qmail-smtpd 2>&1
※1006:qmaildのUID]、1005:nofilesの[GID]
⑤qmail-smtpdのログ制御スクリプト
# vi /var/qmail/supervise/qmail-smtpd/log/run
(ファイルの中身)
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail/smtpd
⑥起動スクリプトに権限設定
chmod 755 /var/qmail/supervise/qmail-send/run
chmod 755 /var/qmail/supervise/qmail-send/log/run
chmod 755 /var/qmail/supervise/qmail-smtpd/run
chmod 755 /var/qmail/supervise/qmail-smtpd/log/run
⑦ログのディレクトリ作成
# mkdir -p /var/log/qmail/smtpd
# chown qmaill /var/log/qmail /var/log/qmail/smtpd
⑧/serviceにシンボリックリンクを作成
# ln -s /var/qmail/supervise/qmail-send /var/qmail/supervise/qmail-smtpd /service
・作成すると、svscanが/serviceディレクトリを5秒置きに監視しているのでsuperviceプロセスが自動で起動する。
・superviceプロセスは、/superviseディレクトリ内のサブディレクトリ内にあるrunスクリプトを開始するので、qmail-smtpd、qmail-sendの起動スクリプトが実行される。
5)システム管理アカウントへの配信の設定
postmaseter、MAILER-DEAMON、rootに対する配信の設定を行います。
# cd /var/qmail/alias
# touch .qmail-postmaster .qmail-mailer-daemon .qmail-root
# chmod 644 .qmail*
# echo -n ‘myuser@mayhome.example.jp’ > .qmail-root
# echo -n ‘myuser@mayhome.example.jp’ > .qmail-postmaster
# echo -n ‘myuser@mayhome.example.jp’ > .qmail-mailer-daemon
6)データベースファイルの作成
①データベースファイル(cdb)の基になるファイルを準備
# vi /etc/tcp.smtp
127.:allow,RELAYCLIENT=””
②データベースファイルの作成
# /usr/local/bin/tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
# ls -al /etc/tcp.*
-rw-r--r-- 1 root root 62 Feb 19 14:01 /etc/tcp.smtp
-rw-r--r-- 1 root root 2142 Feb 19 14:02 /etc/tcp.smtp.cdb
7)動作確認
①svscanbootを手動で開始
/command/svscanboot &
②qmailctlで停止、確認
# qmailctl stop Stopping qmail... qmail-smtpd qmail-send # qmailctl stat /service/qmail-send: down 6 seconds, normally up /service/qmail-send/log: down 6 seconds, normally up /service/qmail-smtpd: down 6 seconds, normally up /service/qmail-smtpd/log: down 6 seconds, normally up messages in queue: 0 messages in queue but not yet preprocessed: 0
③qmailctlで開始、確認
# qmailctl start Starting qmail # qmailctl stat /service/qmail-send: up (pid 957004) 9 seconds /service/qmail-send/log: up (pid 957005) 9 seconds /service/qmail-smtpd: up (pid 957041) 0 seconds /service/qmail-smtpd/log: up (pid 957040) 0 seconds messages in queue: 0 messages in queue but not yet preprocessed: 0
④起動したプロセスの確認
# ps -ef | grep qmail root 1031253 1031251 0 09:55 pts/0 00:00:00 supervise qmail-send root 1031255 1031251 0 09:55 pts/0 00:00:00 supervise qmail-smtpd qmaill 1031259 1031254 0 09:55 pts/0 00:00:00 /usr/local/bin/multilog t /var/log/qmail qmails 1031260 1031253 0 09:55 pts/0 00:00:00 qmail-send qmaild 1031262 1031258 0 09:55 pts/0 00:00:00 tcpserver -v -u 1006 -g 1005 -x /etc/tcp.smtp.cdb -c 20 0 smtp /var/qmail/bin/qmail-smtpd qmaill 1031263 1031260 0 09:55 pts/0 00:00:00 splogger qmail root 1031264 1031260 0 09:55 pts/0 00:00:00 qmail-lspawn ./Mailbox qmailr 1031265 1031260 0 09:55 pts/0 00:00:00 qmail-rspawn qmailq 1031266 1031260 0 09:55 pts/0 00:00:00 qmail-clean root 1031275 1030925 0 09:55 pts/0 00:00:00 grep --color=auto qmail # ps -ef | grep svscan root 1031249 1030925 0 09:55 pts/0 00:00:00 sh /command/svscanboot root 1031251 1031249 0 09:55 pts/0 00:00:00 svscan /service root 1031523 1030925 0 09:57 pts/0 00:00:00 grep --color=auto svscan
⑤メールの送信テスト
・自端末宛てに空メールを送信して、動作確認
echo to: myuser@mayhome.example.jp | /var/qmail/bin/qmail-inject
①空のユニットファイル作成、権限の設定
# touch /etc/systemd/system/daemontools.service
# chmod 664 /etc/systemd/system/daemontools.service
②ユニットファイル内でサービス設定オプションを記述
# vi /etc/systemd/system/daemontools.service
[Unit] Description=daemontools for qmail After=network.target [Service] Type=simple ExecStart=/command/svscanboot Restart=on-abnormal [Install] WantedBy=multi-user.target
●設定項目
〇Description
・ジャーナルログファイルおよび systemctl status コマンドの出力に表示される有用な説明
〇After=network.target
・このサービスは、ネットワークの実行後にのみ開始。
〇Type
・ExecStart および関連オプションの機能に影響を与えるユニットプロセスの起動タイプを設定。
・”simple”:デフォルト値。ExecStartで起動するプロセスは、サービスのメインプロセス。
〇ExecStart
・ユニットの開始時に実行するコマンドまたはスクリプトを指定。
〇Restart=on-abnormal
・the service will be restarted when the process is terminated by a signal (including on core dump, excluding the aforementioned four signals), when an operation times out, or when the watchdog timeout is triggered
・For services that shall be able to terminate on their own choice (and avoid immediate restarting), on-abnormal is an alternative choice.
〇WantedBy
・サービスを開始する必要があるターゲットを指定。
・ターゲットは、従来のランレベルの概念に代わるもの。
2)ブート時のシステムサービス起動の有効化
①systemdをリロード
# systemctl daemon-reload
・新しいユニットファイルを作成したり、既存のユニットファイルを修正したら常に systemctl daemon-reload コマンドを実行する。
・このコマンドを実行しないと、systemd のステータスと、ディスクの実際のサービスユニットファイルのステータスが一致しなくなるため、systemctl start コマンドや systemctl enable コマンドが失敗する可能性がある。
②ブート時のシステムサービス起動の有効化
# systemctl enable daemontools Created symlink /etc/systemd/system/multi-user.target.wants/daemontools.service → /etc/systemd/system/daemontools.service.
③ステータス確認
# systemctl status daemontools ○ daemontools.service - daemontools for qmail Loaded: loaded (/etc/systemd/system/daemontools.service; enabled; preset: disabled)
3)動作確認
①systemctlコマンドでdaemontoolsを起動
# systemctl start daemontools # systemctl status daemontools daemontools.service - daemontools for qmail Loaded: loaded (/etc/systemd/system/daemontools.service; enabled; preset: disabled) Active: active (running) since Wed 2024-02-21 13:38:03 JST; 2min 33s ago Main PID: 1047785 (svscanboot) Tasks: 16 (limit: 11124) Memory: 3.2M CPU: 191ms CGroup: /system.slice/daemontools.service tq1047785 /bin/sh /command/svscanboot tq1047787 svscan /service tq1047788 readproctitle service errors: "...art log/run: exec format error\nsupervise: fatal: unable to start log/run: exec form> tq1047789 supervise qmail-send tq1047790 supervise log tq1047791 supervise qmail-smtpd tq1047792 supervise log tq1047794 /usr/local/bin/multilog t /var/log/qmail tq1047795 qmail-send tq1047796 /bin/sh ./run tq1047797 splogger qmail tq1047798 qmail-lspawn ./Mailbox tq1047799 qmail-rspawn tq1047800 qmail-clean mq1047801 tcpserver -v -u 1006 -g 1005 -x /etc/tcp.smtp.cdb -c 20 0 smtp /var/qmail/bin/qmail-smtpd Feb 21 13:38:03 v133-18-246-190.vir.kagoya.net systemd[1]: Started daemontools for qmail. Feb 21 13:38:03 v133-18-246-190.vir.kagoya.net qmail[1047797]: 1708490283.199998 status: local 0/10 remote 0/20
②systemctlコマンドでdaemontoolsを停止
# systemctl stop daemontools # systemctl status daemontools daemontools.service - daemontools for qmail Loaded: loaded (/etc/systemd/system/daemontools.service; enabled; preset: disabled) Active: inactive (dead) since Wed 2024-02-21 13:44:16 JST; 9s ago Duration: 6min 12.985s Process: 1047785 ExecStart=/command/svscanboot (code=killed, signal=TERM) Main PID: 1047785 (code=killed, signal=TERM) CPU: 432ms