Edited at

CentOS 7にPostfix 3.5をソースから躓きながらインストールする

今まで VPS に yum で nginx とかを入れたことはありましたが、メールサーバーを入れたことがないなということで勉強のために入れてみます。

せっかくなのでソースから入れてみます。


環境


  • さくらの VPS

  • CentOS Linux release 7.6.1810 (Core)

  • postfix(mail_version = 3.5-20190724)


いざやってみる

最初から入っていた postfix は

yum remove postfix

で雑に削除しておく。


とりあえず postfix を持ってくる

$ cd ~/.local/src

$ git clone https://github.com/vdukhovni/postfix
$ ls
postfix


とりあえず make してみる

$ cd ~/.local/src/postfix/postfix

$ make
(echo "# Do not edit -- this file documents how Postfix was built for your machine."; /bin/sh makedefs) >makedefs.tmp
No <db.h> include file found.
Install the appropriate db*-devel package first.
make: *** [Makefiles] Error 1
make: *** [makefiles] Error 2

エラー出た

Install the appropriate db*-devel package first.

ってあるからとりあえずこれを入れてみる

$ sudo yum install -y db*-devel

もう一回 make してみる。

$ cd ~/.local/src/postfix/postfix

$ make
(echo "# Do not edit -- this file documents how Postfix was built for your machine."; /bin/sh makedefs) >makedefs.tmp
No <db.h> include file found.
Install the appropriate db*-devel package first.
make: *** [Makefiles] Error 1
make: *** [makefiles] Error 2

うーん。。。

No <db.h> include file found.

db.h/usr/includeにあればいけるっぽい


db.h を調べる

Berkely DB を入れれば良いらしい。

yumで入れられると思ってyum berkeley dbって調べてもパッとしない。

ようわからんので

Berkeley DB 6.2 インストール手順

こちらを参考に Berkely DB を入れる

Oracle Berkely DB Downloads

Previous Releases の 12cR1 Release

Berkeley DB 6.2.38.tar.gz をダウンロード。

Oracle の会員登録を求められたので登録してダウンロード、scp でサーバー(~/.local/src)へ送る。

解凍してインストールしてみる

$ cd ~/.local/src

$ ls
postfix db-6.2.38.tar.gz
$ tar vzxf db-6.2.38.tar.gz
$ ls
postfix db-6.2.38.tar.gz postfix db-6.2.38
$ cd db-6.2.38/build_unix
$ ../dist/configure --prefix=/home/kotazuck/.local
$ make
$ make install

~/home/kotazuck/.local/includeの中にdb.hdb_cxx.hができた。

これを/usr/includeでも見えるようにシンボリックリンクを貼ってみる

$ sudo /home/kotazuck/.local/include/* /usr/include/

/usr/includeの中に

db.h -> /home/kotazuck/.local/include/db.h

db_cxx.h -> /home/kotazuck/.local/include/db_cxx.h

ができた。


postfix を改めて make

$ cd ~/.local/src/postfix/postfix

$ make clean # 念の為
$ make
なんかいっぱい出てきた

さっきよりは前に進めたっぽい。


じゃあさっそく make install してみる

$ sudo make install


Please specify the prefix for installed file names. Specify this ONLY
if you are building ready-to-install packages for distribution to OTHER
machines. See PACKAGE_README for instructions.
install_root: [/]

なんか対話が始まった。

とりあえず Enter 押しまくる。

Please specify the prefix for installed file names. Specify this ONLY

if you are building ready-to-install packages for distribution to OTHER
machines. See PACKAGE_README for instructions.
install_root: [/]

Please specify a directory for scratch files while installing Postfix. You
must have write permission in this directory.
tempdir: [/home/kotazuck/.local/src/postfix/postfix]

Please specify the final destination directory for installed Postfix
configuration files.
config_directory: []
bin/postconf: error while loading shared libraries: libdb-6.2.so: cannot open shared object file: No such file or directory
bin/postconf: error while loading shared libraries: libdb-6.2.so: cannot open shared object file: No such file or directory
bin/postconf: error while loading shared libraries: libdb-6.2.so: cannot open shared object file: No such file or directory
bin/postconf: error while loading shared libraries: libdb-6.2.so: cannot open shared object file: No such file or directory
bin/postconf: error while loading shared libraries: libdb-6.2.so: cannot open shared object file: No such file or directory
bin/postconf: error while loading shared libraries: libdb-6.2.so: cannot open shared object file: No such file or directory
bin/postconf: error while loading shared libraries: libdb-6.2.so: cannot open shared object file: No such file or directory
bin/postconf: error while loading shared libraries: libdb-6.2.so: cannot open shared object file: No such file or directory
bin/postconf: error while loading shared libraries: libdb-6.2.so: cannot open shared object file: No such file or directory
bin/postconf: error while loading shared libraries: libdb-6.2.so: cannot open shared object file: No such file or directory
bin/postconf: error while loading shared libraries: libdb-6.2.so: cannot open shared object file: No such file or directory
bin/postconf: error while loading shared libraries: libdb-6.2.so: cannot open shared object file: No such file or directory
bin/postconf: error while loading shared libraries: libdb-6.2.so: cannot open shared object file: No such file or directory
bin/postconf: error while loading shared libraries: libdb-6.2.so: cannot open shared object file: No such file or directory
bin/postconf: error while loading shared libraries: libdb-6.2.so: cannot open shared object file: No such file or directory

Please specify the final destination directory for installed Postfix
administrative commands. This directory should be in the command search
path of adminstrative users.
command_directory: []

Please specify the final destination directory for installed Postfix
daemon programs. This directory should not be in the command search path
of any users.
daemon_directory: []

Please specify the final destination directory for Postfix-writable
data files such as caches or random numbers. This directory should not
be shared with non-Postfix software.
data_directory: []

Please specify the final destination directory for the Postfix HTML
files. Specify "no" if you do not want to install these files.
html_directory: []

Please specify the owner of the Postfix queue. Specify an account with
numerical user ID and group ID values that are not used by any other
accounts on the system.
mail_owner: []

Please specify the final destination pathname for the installed Postfix
mailq command. This is the Sendmail-compatible mail queue listing command.
mailq_path: []

Please specify the final destination directory for the Postfix on-line
manual pages. You can no longer specify "no" here.
manpage_directory: []

Please specify the final destination directory for the Postfix on-line
manual pages. You can no longer specify "no" here.
manpage_directory: []

Please specify the final destination pathname for the installed Postfix
newaliases command. This is the Sendmail-compatible command to build
alias databases for the Postfix local delivery agent.
newaliases_path: []

Please specify the final destination directory for Postfix queues.
queue_directory: []

Please specify the final destination directory for the Postfix README
files. Specify "no" if you do not want to install these files.
readme_directory: []

Please specify the final destination pathname for the installed Postfix
sendmail command. This is the Sendmail-compatible mail posting interface.
sendmail_path: []

Please specify the group for mail submission and for queue management
commands. Specify a group name with a numerical group ID that is
not shared with other accounts, not even with the Postfix mail_owner
account. You can no longer specify "no" here.
setgid_group: []

Please specify the final destination directory for Postfix shared-library
files.
shlib_directory: []

Please specify the final destination directory for non-executable files
that are shared among multiple Postfix instances, such as postfix-files,
dynamicmaps.cf, as well as the multi-instance template files main.cf.proto
and master.cf.proto.
meta_directory: []

postfix-install: Error: "" should be "no" or an absolute path name.
make: *** [install] Error 1

no か絶対パスを設定しないとダメっぽい。

とりあえず推奨されるものがあるはず。

公式のインストールガイドをみる。

Postfix Instration from Source Code

parameter name
typical default

command_directory
/usr/sbin

config_directory
/etc/postfix

default_database_type
hash

daemon_directory
/usr/libexec/postfix

data_directory
/var/lib/postfix

html_directory
no

mail_spool_directory
/var/mail

mailq_path
/usr/bin/mailq

manpage_directory
/usr/local/man

meta_directory
/etc/postfix

newaliases_path
/usr/bin/newaliases

openssl_path
openssl

queue_directory
/var/spool/postfix

readme_directory
no

sendmail_path
/usr/sbin/sendmail

shlib_directory
/usr/lib/postfix

こんな表があった。それぞれの値をこれにすればいける?。

でも今回はお試しで入れているので、間違った時に一発で削除できるよう出来るだけ 1 つのディレクトリに固めたい。

なので今回は/usr/local/postfixの中に固めることにした。

でもこの表全て網羅してるわけじゃなさそう。

mail_ownerとかsetgid_groupは何?


postfix 用のユーザーとグループ

postfix の専用のユーザーとグループを作成する必要があるそうでした。

デフォルトで postfix が入ってたところをみるとあるのでは?

$ cat /etc/passwd | grep postfix

postfix:x:99:99::/var/spool/postfix:/sbin/nologin
$ cat /etc/group | grep post
postdrop:x:90:
postfix:x:99:

あった。

なかったら作らないといけないそうです。

mail_ownerpostfix

setgid_grouppostdropがデフォルトらしい。


オレオレ設定値

対話で聞かれるやつを全て書いた。

parameter name
設定値

command_directory
/usr/local/postfix/sbin

config_directory
/usr/local/postfix/etc/postfix

daemon_directory
/usr/local/postfix/libexec

data_directory
/usr/local/postfix/var/lib

html_directory
no

mail_owner
postfix

mailq_path
/usr/local/postfix/bin/mailq

manpage_directory
/usr/local/postfix/man

newaliases_path
/usr/local/postfix/bin/newaliases

queue_directory
/var/spool/postfix

readme_directory
no

sendmail_path
/usr/local/postfix/sbin/sendmail

setgid_group
postdrop

shlib_directory
/usr/local/postfix/lib

meta_directory
/usr/local/postfix/etc/postfi

dynamicmaps
yes

shared
yes

対話では聞かれないけどdynamicmapssharedを yes にすると

動的リンクライブラリが読み込めるようになるとかならないとか?


今度こそインストール

$ make makefiles command_directory=/usr/local/postfix/sbin ...

みたいに指定できるみたい。

$ make makefiles\

shared=yes\
dynamicmaps=yes\
install_root=/\
config_directory=/usr/local/postfix/etc/postfix\
command_directory=/usr/local/postfix/sbin\
daemon_directory=/usr/local/postfix/libexec\
data_directory=/usr/local/postfix/var/lib\
html_directory=no\
mail_owner=postfix\
mailq_path=/usr/local/postfix/bin/mailq\
manpage_directory=/usr/local/postfix/man\
newaliases_path=/usr/local/postfix/bin/newaliases\
queue_directory=/var/spool/postfix\
readme_directory=no\
sendmail_path=/usr/local/postfix/sbin/sendmail\
setgid_group=postdrop\
shlib_directory=/usr/local/postfix/lib\
meta_directory=/usr/local/postfix/etc/postfix

一応make installの方にも指定しておく

$ sudo make install\

shared=yes\
dynamicmaps=yes\
install_root=/\
config_directory=/usr/local/postfix/etc/postfix\
command_directory=/usr/local/postfix/sbin\
daemon_directory=/usr/local/postfix/libexec\
data_directory=/usr/local/postfix/var/lib\
html_directory=no\
mail_owner=postfix\
mailq_path=/usr/local/postfix/bin/mailq\
manpage_directory=/usr/local/postfix/man\
newaliases_path=/usr/local/postfix/bin/newaliases\
queue_directory=/var/spool/postfix\
readme_directory=no\
sendmail_path=/usr/local/postfix/sbin/sendmail\
setgid_group=postdrop\
shlib_directory=/usr/local/postfix/lib\
meta_directory=/usr/local/postfix/etc/postfix

なんか良いっぽい!

と思ったら

bin/postconf: error while loading shared libraries: libdb-6.2.so: cannot open shared object file: No such file or directory

make: *** [install] Error 1

辛い。

でもあれ?/usr/local/postfixができてる。

中身もbin etc lib libexec man sbinと指定した奴は全部できてる。


postconf で設定をみてみる

/usr/local/postfixへ行きpostconf(設定の表示)をしてみる

$ cd /usr/local/postfix/sbin

$ ls
postalias
postcat
postconf
postdrop
postfix
postkick
postlock
postlog
postmap
postmulti
postqueue
postsuper
sendmail
$ ./postconf
./postconf: error while loading shared libraries: libdb-6.2.so: cannot open shared object file: No such file or directory

さっきと同じやつだ。


libdb-6.2.so をなんとかする

名前からして Berkeley DB のやつっぽい。

~/.local/libの中にあった。

libdb-6.2.a

libdb-6.2.la
libdb-6.2.so
libdb-6.so -> libdb-6.2.so
libdb.a
libdb.so -> libdb-6.2.so

こいつらを読み込ませれば良いっぽい。

error while loading shared librariesって書いてるから、さっき指定したshlib_directoryにシンボリックリンクを貼ってpostconfしてみる

$ sudo ln -s /home/kotazuck/.local/lib/* /usr/local/postfix/lib/

$ cd /usr/local/postfix/sbin
$ ./postconf

なんかいっぱい出たー

バージョンは?

$ ./postconf mail_version

mail_version = 3.5-20190724


一応インストールはできたみたい

/usr/local/postfix/bin/usr/local/postfix/sbinに PATH を通せばとりあえず OK

一応まとめとく


  1. 既存の postfix を削除しちゃう

  2. sudo yum install -y db*-develを入れる

  3. もしかしたら他にも必要なパッケージがあったけど偶然すでに入っていたかもしれないので、ここは適宜調べる

  4. Berkeley DB を入れる



    1. Oracle Berkely DB Downloads
      Previous Releases の 12cR1 Release
      Berkeley DB 6.2.38.tar.gz をダウンロード(このバージョンはその時次第)

    2. Oracle の会員登録を求められたら登録してダウンロード、scp でサーバーへ送る

    3. 解凍してインストールする


    4. db.hdb_cxx.h、とか手に入る。


    5. /usr/includedb.hdb_cxx.hを入れる(シンボリックリンクでも可)




  5. postfix をインストールする



    1. オレオレ設定値で make makefiles

      $ make makefiles\
      
      shared=yes\
      dynamicmaps=yes\
      install_root=/\
      config_directory=/usr/local/postfix/etc/postfix\
      command_directory=/usr/local/postfix/sbin\
      daemon_directory=/usr/local/postfix/libexec\
      data_directory=/usr/local/postfix/var/lib\
      html_directory=no\
      mail_owner=postfix\
      mailq_path=/usr/local/postfix/bin/mailq\
      manpage_directory=/usr/local/postfix/man\
      newaliases_path=/usr/local/postfix/bin/newaliases\
      queue_directory=/var/spool/postfix\
      readme_directory=no\
      sendmail_path=/usr/local/postfix/sbin/sendmail\
      setgid_group=postdrop\
      shlib_directory=/usr/local/postfix/lib\
      meta_directory=/usr/local/postfix/etc/postfix



    2. オレオレ設定値で make install

      $ sudo make install\
      
      shared=yes\
      dynamicmaps=yes\
      install_root=/\
      config_directory=/usr/local/postfix/etc/postfix\
      command_directory=/usr/local/postfix/sbin\
      daemon_directory=/usr/local/postfix/libexec\
      data_directory=/usr/local/postfix/var/lib\
      html_directory=no\
      mail_owner=postfix\
      mailq_path=/usr/local/postfix/bin/mailq\
      manpage_directory=/usr/local/postfix/man\
      newaliases_path=/usr/local/postfix/bin/newaliases\
      queue_directory=/var/spool/postfix\
      readme_directory=no\
      sendmail_path=/usr/local/postfix/sbin/sendmail\
      setgid_group=postdrop\
      shlib_directory=/usr/local/postfix/lib\
      meta_directory=/usr/local/postfix/etc/postfix


    3. libdb-6.2.soがないよーってエラーが出てもビビらない。


    4. Berkeley DB インストール時に手に入れたlibdbほにゃらら.soshlib_directoryで設定したディレクトリ(この例なら/usr/local/postfix/lib)に入れる(シンボリックリンクでも可)




  6. command_directoryとかsendmail_pathで設定した実行ファイルディレクトリを PATH に追加


  7. postconfを叩いてみる。


  8. postconf mail_versionでバージョン情報をみる。


  9. イケてるっぽい!



感想

インストールで精一杯でサーバー動かすとか設定ファイルいじるとかまでたどり着かんかった。(半日かかりました)

このインストールの仕方が悪いせいで、サーバーが起動しないとかだったらどうしよう。

とりあえず今日は寝ます。