Postfixのパッケージ作成手順 for Solaris 10

最終更新日:2006年04月19日

パッケージ作成

準備するもの

準備ができたら作業開始

Postfixを展開して展開したディレクトリに移動
(2005年06月17日時点での最新版は、2.2 Patchlevel 3)
$ cd /usr/local/src/mail
$ gtar zxf postfix-2.2.2.tar.gz
$ cd postfix-2.2.2
日本語のページが http://www.postfix-jp.info/ にあるのでそこを参考にして、
まずは、付属のドキュメントに従ってPostfixの make まで実施
そして、必要なユーザとグループを登録(UID, GID は環境に合わせて決める)

・作成するグループ:postfix, postdrop
・作成するユーザ :postfix(グループは postfix)
# groupadd postfix
# groupadd postdrop
# useradd -d /dev/null -g postfix -s /bin/false postfix
その後、/usr/local/src/mail/postfix-pkg にパッケージ作成用のファイルを展開(場所は任意)
※ ドキュメントに特権ユーザで行うなと書いてあるので一般ユーザで実行
$ gmake non-interactive-package install_root=/usr/local/src/mail/postfix-pkg
ファイルの所有者を root:root に変更
# cd /usr/local/src/mail/postfix-pkg
# chown -R root:root *
ファイルのパーミッションを変更するために設定ファイル一式をコピー
# cp -pR etc/postfix ../postfix-conf
コピーした main.cf(../postfix-conf/main.cf) を編集して以下の行を変更
queue_directory = /usr/local/src/mail/postfix-pkg/var/spool/postfix
command_directory = /usr/local/src/mail/postfix-pkg/usr/sbin
daemon_directory = /usr/local/src/mail/postfix-pkg/usr/libexec/postfix
sendmail_path = /usr/local/src/mail/postfix-pkg/usr/lib/sendmail
newaliases_path = /usr/local/src/mail/postfix-pkg/usr/bin/newaliases
mailq_path = /usr/local/src/mail/postfix-pkg/usr/bin/mailq
manpage_directory = /usr/local/src/mail/postfix-pkg/usr/local/man
sample_directory = /usr/local/src/mail/postfix-pkg/etc/postfix
ファイルのパーミッション設定変更実施
# usr/sbin/postfix -c /usr/local/src/mail/postfix-conf set-permissions
aliasesファイルのコピーとリンク作成
# cd etc
# mkdir mail
# cp postfix/aliases mail
# ln -s ./mail/aliases aliases
# cd ..

SMF(Service Management Facility)用の設定

SUNWsndmrパッケージ内のファイルを参考に以下のファイルを作成
var/svc/manifest/network/smtp-postfix.xml
lib/svc/method/smtp-postfix
etc/init.d/postfix
作成した各ファイル:smtp-postfix.xml, smtp-postfix, postfix

※ lib/svc/method/smtp-sendmail ファイルの内容は、SUNWsndmr内の archive/none.bz2 を展開したファイルの中に記述されている。

prototypeファイルの作成と編集

prototypeファイル作成(/usr/local/src/mail/postfix-pkg で作業)
# pkgproto . > prototype
作成したprototypeファイルの編集

・以下の行を追加
i pkginfo
i depend
i i.initd
i i.manifest
i i.preserve
i i.renamenew
i i.renameold
i r.manifest
i preinstall
・prototypeの定義を削除
f none prototype 0644 root root
・SUNWsndmrの pkgmap を参考に形式やクラスの設定などを変更
(詳細は割愛)
出来上がったprototypeファイル

各定義ファイルの準備と編集

SUNWsndmrから以下のファイルを /usr/local/src/mail/postfix-pkg にコピー
pkginfo
depend
i.initd
i.manifest
i.preserve
i.renamenew
i.renameold
r.manifest
pkginfoファイルを編集(内容は参考程度に)
PKG=SYpostfix
NAME=Postfix 2.2.2
ARCH=i86pc
VERSION=2.2.2
CATEGORY=application
DESC=Postfix Mail system
VENDOR=SY
CLASSES=none initd preserve renamenew renameold manifest
BASEDIR=/

preinstallファイル作成

ユーザとグループを自動作成するために以下のpreinstallファイルを作成した。
#!/bin/sh

# This script exists for the sole purpose of making sure the required user
# accounts "postfix" and groups "postfix", "postdrop" exist already.
# based on the CSWpostfix preinstall

HOMEDIR=/dev/null

if [ "$PKG_ROOT_DIR" = "" ] ; then
	PKG_ROOT_DIR="/"
fi

# First check target machines password file, THEN check
# NIS/NIS+/whatever

NEEDGROUP=0
grep '^postfix:' $PKG_ROOT_DIR/etc/group >/dev/null
if [ $? -ne 0 ] ; then
	getent group postfix >/dev/null
	if [ $? -ne 0 ] ; then
		NEEDGROUP=1
	fi
fi

if [ "$NEEDGROUP" = 1 ] ; then
	echo adding postfix group
	chroot $PKG_ROOT_DIR /usr/sbin/groupadd postfix
else
	echo postfix group detected
fi

NEEDGROUP=0
grep '^postdrop:' $PKG_ROOT_DIR/etc/group >/dev/null
if [ $? -ne 0 ] ; then
	getent group postdrop >/dev/null
	if [ $? -ne 0 ] ; then
		NEEDGROUP=1
	fi
fi

if [ "$NEEDGROUP" = 1 ] ; then
	echo adding postdrop group
	chroot $PKG_ROOT_DIR /usr/sbin/groupadd postdrop
else
	echo postdrop group detected
fi

NEEDUSER=0
grep '^postfix:' $PKG_ROOT_DIR/etc/passwd >/dev/null
if [ $? -ne 0 ] ; then
	getent passwd postfix >/dev/null
	if [ $? -ne 0 ] ; then
		NEEDUSER=1
	fi
fi

if [ "$NEEDUSER" = 1 ] ; then
	echo adding postfix user
	chroot $PKG_ROOT_DIR /usr/sbin/useradd -g postfix postfix
	chroot $PKG_ROOT_DIR /usr/sbin/usermod -s /bin/false -d $HOMEDIR postfix
else
	echo postfix user detected
fi

exit 0

パッケージ作成

# pkgmk -r `pwd`
# cd /var/spool/pkg/
# pkgtrans -s . SYpostfix.pkg

以上でパッケージの完成

パッケージのインストール

Sendmailパッケージ削除

Solaris 10 標準のSendmailパッケージ(SUNWsndmr, SUNWsndmu)がインストールされている場合は、Postfixをインストールする前に削除しておく
# pkgrm SUNWsndmu
# pkgrm SUNWsndmr
※ aliasesファイル等も削除されてしまうので、必要に応じて設定ファイル(/etc/mail 配下)をコピーしておく

インストール

Postfixのパッケージ(SYpostfix.pkg)が置いてあるディレクトリに移動して以下のコマンドを実行
# pkgadd -d SYpostfix.pkg

注1:Postfixのインストール先のディレクトリ(デフォルトでは、/usr/sbin)を共有するような zone が存在する場合、postdropグループは global zone と同じ GID にする必要がある(postdropグループで SGID を設定しているコマンドがあるため)。
既にpostdropグループが存在する場合は GID を変更する。
# groupmod -g <postdropのGID> postdrop

postdropグループが存在しない場合はpostdropグループを作成する。
# groupadd -g <postdropのGID> postdrop

注2:インストール後に新たに zone を作成した場合は、その zone でPostfix用のユーザ/グループを作成する。
(UID, GID は、global zone と同じにすることを推奨)
・グループ:postfix, postdrop
・ユーザ :postfix(グループは postfix)
# groupadd -g <postfixのGID> postfix
# groupadd -g <postdropのGID> postdrop
# useradd -d /dev/null -g postfix -u <postfixのUID> -s /bin/false postfix

注3:キューディレクトリのパーミッションが正しく設定されていない時は、キューディレクトリの再作成を行う。

・チェック方法
# /usr/sbin/postfix check
postsuper: fatal: scan_dir_push: open directory defer: Permission denied
# 

上のようなメッセージが表示されたら問題あり。キューディレクトリの再作成を行う。
何も表示されなければ正常(もしくは、見つからなかったディレクトリが作成された)。
・キューディレクトリの再作成
# rm -rf /var/spool/postfix/
# /etc/postfix/post-install create-missing

インストールの自動化

インストール(pkgadd)時に確認を行わないようにして、インストールを自動化する方法

以下のようなインストール管理ファイルを作成し、/var/sadm/install/admin/fullauto として保存
mail=
instance=overwrite
partial=nocheck
runlevel=nocheck
idepend=nocheck
rdepend=nocheck
space=nocheck
setuid=nocheck
conflict=nocheck
action=nocheck
basedir=default
自動インストールの実行
# pkgadd -a fullauto -d SYpostfix.pkg

起動/停止の方法

ブート時に自動起動

# svcadm enable postfix

ブート時の自動起動停止

# svcadm disable postfix

一時的に起動

# svcadm enable -t postfix
または
# /etc/init.d/postfix start

一時的に停止

# svcadm disable -t postfix
または
# /etc/init.d/postfix stop

設定ファイルの再読み込み

# svcadm refresh postfix
または
# /etc/init.d/postfix restart

状態の確認

# svcs -l postfix