본문으로 바로가기

qmail 설치

category 서버&시스템/QMail 2012. 1. 6. 18:27

 

 

CentOS 5.4 서버에 qmail을 설치한 방법을 정리한다. 내용이 길어서 세번에 나누어 포스팅을 하게 되었다.

아래는 설치 파일. vpopmail은 5.4.25 버전을 설치하였는데, 수집한 다른 버전도 들어있음.

pds.zip
4.65MB

 

qmail 설치

saslauthd, dovecot, sendmail, postfix 이것들이 qmail을 제외한 대표적인 메일 발송 프로그램들이다.

qmail은 발송(SMTP)을, vpopmail은 수신(pop3)을 위한 서비스라고 할 수 있다.

 

기존 메일 발송 관련 서비스 삭제

$ ls /etc/rc.d/init.d/이름             # 또는
$ rpm -qa | grep 이름

위 명령어로 해당 프로그램들이 설치되어 있는지 확인하고, 있다면 삭제한다.

$ chkconfig --del 이름          # 자동 실행 불가하도록 설정
$ rpm -e --nodeps 이름          # 아예 프로그램 삭제

 

설치 파일 준비

$ tar zxvf qmail-1.03.tar.gz
$ cd qmail-1.03
$ cp /pds/qmail-103.patch .
$ patch -p1 < qmail-103.patch

qmail 소스의 압축을 푼 디렉토리 안에 패치 파일을 복사한 후 실행.

 

그룹과 유저 추가

$ mkdir /var/qmail
$ groupadd nofiles
$ useradd -g nofiles -d /var/qmail/alias alias
$ useradd -g nofiles -d /var/qmail qmaild
$ useradd -g nofiles -d /var/qmail qmaill
$ useradd -g nofiles -d /var/qmail qmailp
$ groupadd qmail
$ useradd -g qmail -d /var/qmail qmailq
$ useradd -g qmail -d /var/qmail qmailr
$ useradd -g qmail -d /var/qmail qmails

qmail 그룹과 유저를 추가한다. 홈 디렉토리 관련 warning은 무시한다.

 

헤더 파일 추가(수동 패치)

$ vi error.h                   # 열어서
$ include <errno.h>            # 맨 윗줄에 추가

error.h 파일의 맨 위에 errno.h 파일을 include 하도록 추가해야 한다(그렇지 않으면 아래 메시지가 표시).

 

Error Message

/usr/bin/ld: errno: TLS definition in /lib64/libc.so.6 section .tbss mismatches non-TLS reference in tcpserver.o
/lib64/libc.so.6: could not read symbols: Bad value

 

이 작업은 patch 파일로도 제공하고 있는데, 별로 어렵지 않으니 직접 vi로 편집하는게 편하다.
아래에서 설치할 ucspi-tcp 포함 3가지 설치에서도 이 작업을 해야 한다.

 

make, config(마무리)

$ make
$ make setup check
$ ./config
$ ./config-fast mail.com(자신의 도메인명)

config 부분에서 아래 메시지와 함께 오류가 발생할 확률이 높다.

 

Error Message

Sorry, I couldn't find your host's canonical name in DNS

 

DNS 설정에 문제가 있다는 뜻인데,
그래도 서버의 DNS 설정이 제대로 잡혀 있다는 확신이 든다면 아래 명령어로 config한다.

 

ucspi-tcp와 deamontools 설치

위에서 언급 했듯이 각각의 error.h 파일을 수동 패치 해줘야 한다.

 

ucspi-tcp 설치

$ tar xvzf ucspi-tcp-0.84.tar.gz
$ cd ucspi-tcp-0.84     # make 하기 전에 error.h 파일 편집!
$ make
$ make setup check

 

deamontools 설치

$ mkdir -p /package
$ chmod 1755 /package
$ cd /package
$ tar zxvf daemontools-0.76.tar
$ cd admin/daemontools-0.76        # make 하기 전에 error.h 파일 편집!
$ package/install

 

스크립트 생성

세가지 모두 설치는 했고, qmail 프로세스들을 실행하는 여섯가지 스크립트를 만들어야 한다(+ 릴레이 허용 설정 파일 1개).

  • /var/qmail/rc
  • /var/qmail/supervise/qmail-send/run
  • /var/qmail/supervise/qmail-send/log/run
  • /var/qmail/supervise/qmail-smtpd/run
  • /var/qmail/supervise/qmail-smtpd/log/run
  • /etc/tcp.smtp
  • /etc/rc.d/init.d/qmail

 

$ mkdir -p /var/qmail/supervise/qmail-send/log
$ mkdir -p /var/qmail/supervise/qmail-smtpd/log
$ chmod +t /var/qmail/supervise/qmail-send
$ chmod +t /var/qmail/supervise/qmail-smtpd

우선 위와 같이 qmail 데몬을 위한 디렉토리를 생성한 후 각 디렉토리에 스크립트를 만든다.

 

1번 스크립트

$ vi /var/qmail/rc
#!/bin/sh
exec env - PATH="/var/qmail/bin:$PATH" \
qmail-start ./Maildir/
$ chmod 755 /var/qmail/rc

 

2번 스크립트

$ vi /var/qmail/supervise/qmail-send/run
#!/bin/sh
exec /var/qmail/rc

 

3번 스크립트

$ vi /var/qmail/supervise/qmail-send/log/run
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill \
/usr/local/bin/multilog t /var/log/qmail


4번 스크립트

$ vi /var/qmail/supervise/qmail-smtpd/run
#!/bin/sh
ALIAS_UID=`id -u alias`       # vpop 설치 후 Q_UID=`id -u vpopmail` 로 변경
ALIAS_GID=`id -g alias`       # vpop 설치 후 Q_UID=`id -g vpopmail` 로 변경
exec /usr/local/bin/softlimit -m 12000000 \
/usr/local/bin/tcpserver -vRHl 0 \
-x /home/vpopmail/etc/tcp.smtp.cdb \
-u $Q_UID -g $Q_GID 0 25 /var/qmail/bin/qmail-smtpd 2>&1

 

5번 스크립트

$ 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

 

6번 스크립트 : 릴레이 허용 IP 설정

$ mkdir -p /var/log/qmail/smtpd
$ chown qmaill /var/log/qmail /var/log/qmail/smtpd
$ vi /etc/tcp.smtp
127.0.0.1:allow,RELAYCLIENT=""
xxx.xxx.xxx.xxx:allow,RELAYCLIENT=""        # xxx 부분에 서버 IP 지정
$ tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp


qmail은 root 계정으로 메일을 배달하지 않으므로, 알리아스를 만들어야 한다.
위 설정으로 webmaster 앞으로 메일을 오게 할 수 있다.

$ cd ~alias
$ echo webmaster > .qmail-mailer-daemon
$ echo webmaster > .qmail-postmaster
$ echo webmaster > .qmail-root
$ chmod 644 .qmail-mailer-daemon .qmail-postmaster .qmail-root

 

부트 스크립트 생성

이제 서버 부팅 시 qmail 데몬 자동 실행을 위한 부트 스크립트만 작성하면 완료.

$ vi /etc/rc.d/init.d/qmail
#!/bin/sh
# Comments to support chkconfig on RedHat Linux
# chkconfig: 2345 80 80
# description: sendmail을 대체하는 빠르며, 안정적이고, 유연한 MTA
# Source function library.
. /etc/rc.d/init.d/functions # Source networking configuration.
. /etc/sysconfig/network # Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0 PATH=/var/qmail/bin:/usr/local/bin:/usr/bin:/bin
export PATH case "$1" in
start)
echo -n "Starting qmail: svscan"
cd /var/qmail/supervise
env - PATH="$PATH" svscan &
echo $! > /var/run/svscan.pid
echo "."
;; stop)
echo -n "Stopping qmail: svscan"
kill `cat /var/run/svscan.pid`
echo -n " qmail"
svc -dx /var/qmail/supervise/*
echo -n " logging"
svc -dx /var/qmail/supervise/*/log
echo "."
;;
stat)
cd /var/qmail/supervise
svstat * */log
;;
doqueue|alrm)
echo "Sending ALRM signal to qmail-send."
svc -a /var/qmail/supervise/qmail-send
;;
queue)
qmail-qstat
qmail-qread
;;
reload|hup)
echo "Sending HUP signal to qmail-send."
svc -h /var/qmail/supervise/qmail-send
;;
pause)
echo "Pausing qmail-send"
svc -p /var/qmail/supervise/qmail-send
echo "Pausing qmail-smtpd"
svc -p /var/qmail/supervise/qmail-smtpd
;;
cont)
echo "Continuing qmail-send"
svc -c /var/qmail/supervise/qmail-send
echo "Continuing qmail-smtpd"
svc -c /var/qmail/supervise/qmail-smtpd
;; restart)
echo "Restarting qmail:"
echo "* Stopping qmail-smtpd."
svc -d /var/qmail/supervise/qmail-smtpd
echo "* Sending qmail-send SIGTERM and restarting."
svc -t /var/qmail/supervise/qmail-send
echo "* Restarting qmail-smtpd."
svc -u /var/qmail/supervise/qmail-smtpd
;;
cdb)
tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
chmod 644 /etc/tcp.smtp*
echo "Reloaded /etc/tcp.smtp."
;;
help)
cat << HELP
stop -- stops mail service (smtp connections refused, nothing goes out)
start -- starts mail service (smtp connection accepted, mail can go out)
pause -- temporarily stops mail service (connections accepted, nothing leaves)
cont -- continues paused mail service
stat -- displays status of mail service
cdb -- rebuild the tcpserver cdb file for smtp
restart -- stops and restarts smtp, sends qmail-send a TERM & restarts it
doqueue -- sends qmail-send ALRM, scheduling queued messages for delivery
reload -- sends qmail-send HUP, rereading locals and virtualdomains
queue -- shows status of queue
alrm -- same as doqueue
hup -- same as reload
HELP
;;
*)
echo "Usage: $0 {start|stop|restart|doqueue|reload|stat|pause|cont|cdb|queue|help}"
exit 1
;;
esac exit 0

 

재부팅 후 프로세스를 확인해 보자.

$ ps -aux
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
root   456  0.0  0.1  1316  380 ?S    14:25   0:00 svscan
root   457  0.0  0.1  1272  336 ?S    14:25   0:00 supervise qmail-send
root   458  0.0  0.1  1272  336 ?S    14:25   0:00 supervise log
root   459  0.0  0.1  1272  336 ?S    14:25   0:00 supervise qmail-smtpd
root   460  0.0  0.1  1272  336 ?S    14:25   0:00 supervise log
qmails       461  0.0  0.1  1332  412 ?S    14:25   0:00 qmail-send
qmaill462  0.0  0.1  1288  332 ?S    14:25   0:00 /usr/local/bin/multilog t /var/log/qmail
alias  463  0.0  0.1  1300  356 ?S    14:25   0:00 /usr/local/bin/tcpserver -v -p -x/etc/tcp.
qmaill465  0.0  0.1  1288  336 ?S    14:25   0:00 /usr/local/bin/multilog t /var/log/qmail/s

위와 같이 프로세스가 확인된다면 정상.


다음 순서는 vpopmail 설치이고 링크는 여기.

 

'서버&시스템 > QMail' 카테고리의 다른 글

qmail - smtp 포트 추가  (0) 2012.02.21
qmailadmin 설치  (0) 2012.01.12
qmail 설치 후 점검 사항  (0) 2012.01.11
vpopmail 설치  (0) 2012.01.11