qmail を daemontools で走らせる
SERVER
ふと思い立って、既にインストールしていた qmail を、daemontools から起動するようにしてみました。
qmail と daemontools
qmail とは、http://www.jp.qmail.org/ でも歌われている通り、「安全確実で、信頼できて、高性能で、簡潔なメイル配送エージェント」 が売り文句になっているメールサーバです。
今回は、既にインストールして、rc.d から起動スクリプトを使用して動かしている qmail を、daemontools を使用して起動できるようにしてみます。
この daemontools というのは、qmail とおなじ作者さまが作成したプログラムセットで、どうやらサーバプロセス周りの安定化を目指して作成されたプログラムのようです。
以前に EZ-NET: ネームサーバ djbdns 1.05 のインストール にて djbdns をインストールした際にもこれを使用したのですけど、何かと便利だった気がするので、今回 qmail もこれで起動するように変更してみることにしました。
なお、それぞれの細かなインストール方法には触れませんので、qmail に関しては EZ-NET: qmail 1.03 のインストール を、daemontools に関しましては EZ-NET: ネームサーバ djbdns 1.05 のインストール を参考にしてみてください。
以下では既に qmail と daemonntools がインストールされていて、svscan が稼動中であるものとして話を進めます。
qmail 本体の設定の変更
まず、qmail のプロセスを停止しましょう。
ps -e として qmail-send のプロセス番号を確認したら、kill nnn というような感じにして qmail のプロセスを停止させます。(注: nnn はプロセス番号)
それと、/etc/rc.d の起動スクリプトなどに qmail を起動するような記載をしている場合にはそれも削除しておきましょう。
そうしたら、既にインストール済みの /var/qmail/ ディレクトリへ移動して、svscan 用の起動スクリプトを作成します。
起動スクリプトは run という名前で、内部では exec 命令によってプロセスを生成させる必要があるそうです。また、このスクリプトは実行可能にしておく必要があります。
内容は次のようにします。
#!/bin/sh
exec env - PATH="/var/qmail/bin:/usr/local/bin:/usr/bin:/bin" \
qmail-start ./Maildir/
この内容で run ファイルを作成して、chmod +x run とやれば、実行可能な起動スクリプトの完成です。
さて、ログの収集には multilog というのを使用することにします。これも daemontools のセットです。
これを使用するためには、/var/qmail/ ディレクトリ内に、新たに log/ ディレクトリを作成する必要があります。また、このディレクトリは qmaill アカウントで操作することにするため、このアカウントで操作ができるように chown 命令で所有権を変更します。
さらに親ディレクトリである /var/qmail/ ディレクトリには sticky bit がたっている必要があるとのことなので、chmod +t でフラグも立てます。
cd /var/qmail/
chmod +t .
mkdir log/
chown qmaill.nofiles log/
あとは、ログプロセス用の起動スクリプトの作成です。
次のようなスクリプトを、/var/qmail/log/ ディレクトリの run ファイルとして作成します。こちらも実行可能の権限を与えておく必要があります。
#!/bin/sh
exec \
multilog t ./main \
-'* status: *' \
-'* starting delivery *' \
-'* delivery * success*' \
-'* delivery * failure*' \
-'* new msg *' \
-'* info msg *' \
-'* end msg *' \
-'* bounce msg *' \
-'* delivery * deferral: Sorry,_I_couldn't_find_any_host_by_that_name*' \
-'* delivery * deferral: Sorry,_I_wasn't_able_to_establish_an_SMTP_*' \
./alert \
'-*' '+* status: *' =status
これで準備は完了です。あとは次のようにして /service ディレクトリに /var/qmail へのシンボリックリンクを張れば、数秒以内に qmail が起動します。
ln -s /var/qmail /service/
SMTP サービスや POP サービスを設定する
既に稼動中の qmail 用 SMTP や POP を、daemontools で起動するように変更してみます。なお、既に tcpserver をつかって起動ができているものとします。
とりあえず、SMTP と POP がらみの tcpserver を kill したら、とりあえず、/var/ ディレクトリに移ります。
そして、そこで qmail-smtpd/ と qmail-pop3d というディレクトリでも作成しましょう。ログも収集するので、属性の変更も行います。また log/ ディレクトリの作成と、そのディレクトリの所有者の変更も行います。
cd /var/
mkdir qmail-smtpd/
mkdir qmail-pop3d/
chmod +t qmail-smtpd
chmod +t qmail-pop3d
mkdir qmail-smtpd/log/
chown qmaill.nofiles qmail-smtpd/log
mkdir qmail-pop3d/log/
chown qmaill.nofiles qmail-pop3d/log
そうしたら起動スクリプトの作成です。
まずは SMTP 用の起動スクリプトを作成してみることにします。既にある rc.d スクリプト内の SMTP 起動のものを参考に、次のような感じで qmail-smtpd/run スクリプトを作成します。
#!/bin/sh
exec env - PATH="/var/qmail/bin:$PATH" \
tcpserver -v -R -H -l0 -x /var/tcprules/smtp.cdb -u1002 -g500 0 smtp qmail-smtpd 2>&1
また、qmail-smtpd/log ディレクトリの run ファイルは次のような感じになります。
#!/bin/sh
exec \
multilog t ./main '-*' '+* * status: *' =status
つづいて POP 用のものを作成します。qmail-pop3d/run スクリプトを次のような感じで作成します。
#!/bin/sh
exec env - PATH="/var/qmail/bin:$PATH" \
tcpserver -v -R -H -l0 -x /var/tcprules/pop3.cdb 0 pop3 qmail-popup mail.ez-net.jp /bin/checkpassword qmail-pop3d Maildir 2>&1
qmail-pop3d/log/ ディレクトリ用の run スクリプトは、qmail-smtp 用に用意したものをそのまま利用することにします。ので、コピーするなどして用意します。
あとはこれらの run ファイルに実行権限を与えて、/service ディレクトリにシンボリックリンクを張れば起動できます。
chmod +x /var/qmail-smtpd/run
chmod +x /var/qmail-smtpd/log/run
chmod +x /var/qmail-pop3d/run
chmod +x /var/qmail-pop3d/log/run
ln -s /var/qmail-smtpd /service/
ln -s /var/qmail-pop3d /service/
うまく動いていないような感じのときは、run スクリプトの実行権限がちゃんと設定されているか、また、run スクリプトに記述ミス (先頭行の #!/bin/sh など) がないかを確認しましょう。
svscan の簡単な使い方
ごくごく簡単にですけど、svscan で起動したサービスの操作方法に触れておきます。
サービスのコントロールには svc というプログラムを使用します。それにオプションと、対象となるサービスを指定することで、そのサービスに対してメッセージを送ることができます。
-u サービスを開始します。既に稼動中の場合は再起動します。 -d サービスを停止します。TERM -> CONT -o サービスを開始します。既に稼動中の場合はそのままです。 -p サービスに STOP シグナルを送ります。 -c サービスに CONT シグナルを送ります。 -h サービスに HUP シグナルを送ります。 -a サービスに ALRM シグナルを送ります。 -i サービスに INT シグナルを送ります。 -t サービスに TERM シグナルを送ります。 -k サービスに KILL シグナルを送ります。 -x サービスがダウンしたらすぐに supervise を終了します。
これらのオプションと合わせて、たとえば qmail サービスを開始したい場合には次のようにします。
svc -u /service/qmail