Archive for the Compile Postfix Category
Posted by mike Filed Under Compile Postfix with Comments Off
The environmental variables in CCARGS for instance, provide the options that Postfix needs.
AUXLIBS – If you build support for any additional applications you may need to tell the linker where to look for the additional libraries for those programs. The standard location for system libraries is /usr/lib. If you want the linker to look for additional libraries you must indicate that with the -L option.
CentOS Example
AUXLIBS=’-L/usr/lib’
However, that is not enough because you must also indicate the specific library to link to with the -l option. Library files start with lib and will have an extension of .a for static libraries, .so for a shared object or .sl for a shared library. If the -l is used the library is referred to without the lib and without the file extension. So if you were going to add MySQL and mysqlclient it would look like this:
CentOS Example
AUXLIBS=’-L/usr/lib/mysql -L/usr/lib -lmysqlclient -lz -lm’
CC – Postfix will use the gcc compiler, If you want to use a different one you will need to indicate that specifically. If you look in the makedefs file you will see this text indicating the default is gcc, “${CC-gcc}”.
CCARGS – This will supply any additional arguments you want to make to the compiler. This is used to indicate files that you need that are not in default locations.
DEBUG – This will provide debugging levels that you may want to use. Typically you will want to increase debugging levels when you initially build Postfix for testing and then eliminate it when you build the final version for your production server.
OPT – These are optimization levels that you can set if you need your Postfix Mail Server to function at higher levels.
The compiler options can be set up in using the CCARGS. The standard location for the header files that you need are in /usr/include. If you need to indicate an alternative location for header files you would use the CCARGS to indicate that. The “I” options are used for each additional directory the compiler should use.
CCARGS=’-I/usr/local/include/’
The -D option gives you a method of defining a macro to include support for a particular program you want to include. So that you could tell Postfix to include support for the MySQL macro, HAS_MYSQL like this:
CCARGS=’DHAS_MYSQL’
If you want to change the location of directories you will need to include the Macro Name and the location where you want to place the directory.
Make makefiles CCARGS=’-DEF_CONFIG_DIR=\”a/location\”’
Parameters whose defaults can be specified in this way are:
Macro name default value for typical default
DEF_COMMAND_DIR command_directory /usr/sbin
DEF_CONFIG_DIR config_directory /etc/postfix
DEF_DAEMON_DIR daemon_directory /usr/libexec/postfix
DEF_DATA_DIR data_directory /var/lib/postfix
DEF_MAILQ_PATH mailq_path /usr/bin/mailq
DEF_HTML_DIR html_directory no
DEF_MANPAGE_DIR manpage_directory /usr/local/man
DEF_NEWALIAS_PATH newaliases_path /usr/bin/newaliases
DEF_QUEUE_DIR queue_directory /var/spool/postfix
DEF_README_DIR readme_directory no
DEF_SENDMAIL_PATH sendmail_path /usr/sbin/sendmail
Parameter Changes for the Environment
When you want to make changes to the parameters you will need to execute the build with two steps so that you can modify the Makefile. Here is an example of some changes you could make.
make makefiles CCARGS=’-DDEF_COMMAND_DIR=\”/usr/local/sbin\” \
-DDEF_DAEMON_DIR=\”/usr/local/libexec/postfix\” \
-DDEF_MAILQ_PATH=\”/usr/local/bin/mailq\” \
-DDEF_NEWALIAS_PATH=\”/usr/local/bin/newaliases\” \
-DHAS_MYSQL -I/usr/src/mysql/include/mysql’ \
AUXLIBS=’-L/usr/src/mysql/lib/mysql -lmysqlclient’
On any server that you are compiling Postfix on, you need to take into account where the additional programs are that you want to compile with Postfix. These directories will be in different locations depending upon the distro that you are using.
One application you may want to compile with Postifx is SASL support. The illustration using CentOS but you can see how you would change directories for Ubuntu or Debian and it can work that way also. Use yum to find out information on your version as you may have to make changes based on version. Here you can see cyrus-sasl is version 2.1.22.
yum info cyrus-sasl
Name : cyrus-sasl
Arch : i386
Version : 2.1.22
Release : 4
Size : 4.6 M
Repo : installed
Summary : The Cyrus SASL library.
URL : http://asg.web.cmu.edu/sasl/sasl-library.html
License : Freely Distributable
Description: The cyrus-sasl package contains the Cyrus implementation of SASL. SASL is the Simple Authentication and Security Layer, a method for adding
: authentication support to connection-based protocols.
The following assumes that the Cyrus SASL include files are in /usr/local/
include, and that the Cyrus SASL libraries are in /usr/local/lib.
On some systems this generates the necessary Makefile definitions:
% make tidy # if you have left-over files from a previous build
% make makefiles CCARGS=”-DUSE_SASL_AUTH -DUSE_CYRUS_SASL \
-I/usr/local/include/sasl” AUXLIBS=”-L/usr/local/lib -lsasl2″
(for Cyrus SASL version 2.1.x):
% make tidy # if you have left-over files from a previous build
% make makefiles CCARGS=”-DUSE_SASL_AUTH -DUSE_CYRUS_SASL \
-I/usr/local/include/sasl” AUXLIBS=”-L/usr/local/lib \
-R/usr/local/lib -lsasl2″
Why this won’t work.
ls /usr/include/sasl
hmac-md5.h md5global.h md5.h prop.h sasl.h saslplug.h saslutil.h
Modified
make makefiles CCARGS=”-DUSE_SASL_AUTH -DUSE_CYRUS_SASL \
-I/usr/include/sasl” AUXLIBS=”-L/usr/lib -lsasl2″
make upgrade
ldd `postconf -h daemon_directory`/smtpd
linux-gate.so.1 => (0x00bfc000)
libsasl2.so.2 => /usr/lib/libsasl2.so.2 (0×00464000)
libdb-4.3.so => /lib/libdb-4.3.so (0×00110000)
libnsl.so.1 => /lib/libnsl.so.1 (0×00207000)
libresolv.so.2 => /lib/libresolv.so.2 (0x003fc000)
libc.so.6 => /lib/libc.so.6 (0x0021e000)
libdl.so.2 => /lib/libdl.so.2 (0x00d22000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0×00362000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00d28000)
/lib/ld-linux.so.2 (0x00bb9000)
Posted by mike Filed Under Compile Postfix with Comments Off
CentOs MySQL Support
You may want to use MySQL to store passwords of accounts, especially when you are working with virtual mailboxes. One thing to note when you do compile Postfix is to make good use of the READMEs are they are very helpful. Be sure that the paths are correct for your distro. Here you can see the changes necessary for CentOS.
This is in the README
make -f Makefile.init makefiles \
‘CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include’ \
‘AUXLIBS=-L/usr/local/mysql/lib -lmysqlclient -lz -lm’
Modified
make -f Makefile.init makefiles \
‘CCARGS=-DHAS_MYSQL -I/usr/include/mysql -I/usr/include’ \
‘AUXLIBS=-L/usr/lib/mysql -L/usr/lib -lmysqlclient -lz -lm’
ldd `postconf -h daemon_directory`/smtpd
linux-gate.so.1 => (0×00940000)
libmysqlclient.so.15 => /usr/lib/mysql/libmysqlclient.so.15 (0×00748000)
libz.so.1 => /usr/lib/libz.so.1 (0x00dd7000)
libm.so.6 => /lib/libm.so.6 (0x00d41000)
libdb-4.3.so => /lib/libdb-4.3.so (0×00411000)
libnsl.so.1 => /lib/libnsl.so.1 (0x001a1000)
libresolv.so.2 => /lib/libresolv.so.2 (0x003fc000)
libc.so.6 => /lib/libc.so.6 (0x00bdc000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x001ba000)
libssl.so.6 => /lib/libssl.so.6 (0×00110000)
libcrypto.so.6 => /lib/libcrypto.so.6 (0x0050a000)
/lib/ld-linux.so.2 (0x00bb9000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00d28000)
libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0x0064d000)
libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0x006b0000)
libcom_err.so.2 => /lib/libcom_err.so.2 (0×00157000)
libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0×00688000)
libdl.so.2 => /lib/libdl.so.2 (0x00d22000)
libkrb5support.so.0 => /usr/lib/libkrb5support.so.0 (0x0067d000)
libkeyutils.so.1 => /lib/libkeyutils.so.1 (0x00df8000)
libselinux.so.1 => /lib/libselinux.so.1 (0x00db2000)
libsepol.so.1 => /lib/libsepol.so.1 (0x00d6a000)
Posted by mike Filed Under Compile Postfix with Comments Off
Building Postfix from source can be a rewarding experience with great results. This tutorial will show you how to do a basic build and then following tutorials will show you how to build in additional features.
Download Source Code From Here:
http://www.postfix.org/download.html

When you download the source and unpack it you will find a README_FILES directory that contains instructions for the aspects of compiling Postfix. This is very valuable information that you must read. All of the Postfix source files have their own manual page.
AAAREADME NFS_README
ADDRESS_CLASS_README OVERVIEW
ADDRESS_REWRITING_README PACKAGE_README
ADDRESS_VERIFICATION_README PCRE_README
BACKSCATTER_README PGSQL_README
BASIC_CONFIGURATION_README QMQP_README
BUILTIN_FILTER_README QSHAPE_README
CDB_README RELEASE_NOTES
CONNECTION_CACHE_README RESTRICTION_CLASS_README
CONTENT_INSPECTION_README SASL_README
CYRUS_README SCHEDULER_README
DATABASE_README SMTPD_ACCESS_README
DB_README SMTPD_POLICY_README
DEBUG_README SMTPD_PROXY_README
DSN_README SOHO_README
ETRN_README STANDARD_CONFIGURATION_README
FILTER_README STRESS_README
INSTALL TLS_LEGACY_README
IPV6_README TLS_README
LDAP_README TUNING_README
LINUX_README ULTRIX_README
LOCAL_RECIPIENT_README UUCP_README
MAILDROP_README VERP_README
MILTER_README VIRTUAL_README
MULTI_INSTANCE_README XCLIENT_README
MYSQL_README XFORWARD_README
Compile a Basic Postfix
CentOS
Once you have downloaded the source code, move it into the /usr/src directory, other options are available.
mv postfix-2.6.5.tar.gz /usr/lsrc/
Untar the file which will create a directory.
tar zxvf postfix-2.6.5.tar.gz
Move into the new postfix directory.
cd postfix-2.6.5
Install the prerequisites
CentOS
yum install db*-devel
Postfix is built in C so you will be compiling C code. Usually the options that you want to create for a project are contained in a Makefile. The make utility creates this Makefile which is used to determine dependencies, any requirements needed or changes you want to create like adding programs or locations of files. The compiler then takes this information and creates object files and links them together into executables.
However, since Postfix creates its own Makefile, you do not need to edit it at all. In fact, the problem with editing the Makefile for Postfix is that your edits will get written over. So, the way to make changes is to use the CCARGS.
Tools You will need
gcc
make
CentOS
yum install gcc make
When you start the dependencies will be located and installed for you.
Installing:
gcc i386 4.1.2-44.el5 base 5.2 M
Updating:
glibc i686 2.5-34.el5_3.1 updates 5.2 M
glibc-common i386 2.5-34.el5_3.1 updates 16 M
nscd i386 2.5-34.el5_3.1 updates 159 k
Installing for dependencies:
cpp i386 4.1.2-44.el5 base 2.7 M
glibc-devel i386 2.5-34.el5_3.1 updates 2.0 M
glibc-headers i386 2.5-34.el5_3.1 updates 598 k
kernel-headers i386 2.6.18-164.el5 updates 993 k
libgomp i386 4.3.2-7.el5 base 67 k
Since Postfix does not use GNU autotools and so does not have the configure script that you may be used to. Postfix will actually do this work for you by creating it’s own Makefile. Run make as a normal user.
make
Once the compile is complete you will need to create the user and groups for Postfix.
groupadd postfix
groupadd postdrop
The user postfix needs to have an account that cannot log in and be a part of the postfix group that was created.
CentOS
useradd postfix -c postfix -d /tmp -s /bin/false
postfix:x:500:500:postfix:/tmp:/bin/false
Now run the final command which will allow you to choose directories and locations that you want to use with your installation. Read each option closely so that when you run the command you have an idea on what you want to change, if anything. You can take the default settings by choosing ENTER. Note you will need to run this as root so you have permissions to write to these directories.
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.
install_root: [/]
Please specify a directory for scratch files while installing Postfix. You must have write permission in this directory.
tempdir: [/usr/local/src/postfix-2.5.5]
Please specify the final destination directory for installed Postfix configuration files.
config_directory: [/etc/postfix]
Please specify the final destination directory for installed Postfix administrative commands. This directory should be in the command search path of administrative users.
command_directory: [/usr/sbin]
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: [/usr/libexec/postfix]
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: [/var/lib/postfix]
Please specify the destination directory for the Postfix HTML files. Specify “no” if you do not want to install these files.
html_directory: [no]
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: [postfix]
Please specify the final destination pathname for the installed Postfix mailq command. This is the Sendmail-compatible mail queue listing command.
mailq_path: [/usr/bin/mailq]
Please specify the destination directory for the Postfix on-line manual pages. You can no longer specify “no” here.
manpage_directory: [/usr/local/man]
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: [/usr/bin/newaliases]
Please specify the final destination directory for Postfix queues.
queue_directory: [/var/spool/postfix]
Please specify the destination directory for the Postfix README files. Specify “no” if you do not want to install these files.
readme_directory: [no]
Please specify the final destination pathname for the installed Postfix sendmail command. This is the Sendmail-compatible mail posting interface.
sendmail_path: [/usr/sbin/sendmail]
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: [postdrop]
This should complete a basic setup for Postfix and you can then start postfix with:
/usr/sbin/postfix start
You should see port 25 listening when you run netstat.
netstat -aunt
Default Postfix Install
Here are the basic features compiled in the default Postfix. You can see several features missing that you may want to compile into Postfix, SASL and MySQL are two that come up often.
ldd `postconf -h daemon_directory`/smtpd
linux-gate.so.1 => (0×00601000)
libdb-4.3.so => /lib/libdb-4.3.so (0×00411000)
libnsl.so.1 => /lib/libnsl.so.1 (0x001a1000)
libresolv.so.2 => /lib/libresolv.so.2 (0x003fc000)
libc.so.6 => /lib/libc.so.6 (0x00bdc000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00d28000)
/lib/ld-linux.so.2 (0x00bb9000)
Posted by mike Filed Under Compile Postfix with Comments Off
Postfix is built in C so you will be compiling C code. Usually the options that you want to create for a project are contained in a Makefile. The make utility creates this Makefile which is used to determine dependencies, any requirements needed or changes you want to create like adding programs or locations of files. The compiler then takes this information and creates object files and links them together into executables.
However, since Postfix creates its own Makefile, you do not need to edit it at all. In fact, the problem with editing the Makefile for Postfix is that your edits will get written over. So, the way to make changes is to use the CCARGS.
Prerequsites to Install
apt-get install db*-devel
apt-get install libdb-dev
Tools You will need
Usually when you install these basic tools the requirements for those tools will be installed as well.
gcc
make
Posted by mike Filed Under Compile Postfix with Comments Off
Using strace to Find Problems
The strace command allows you to view the activities of a process. The first thing you will need to do is locate the process ID that you want to trace.
ps aux | grep postfix
Here is partiial output of what this command will provide:
root 5049 0.0 0.6 5396 1736 ? Ss 06:25 0:00 /usr/lib/postfix/master
postfix 5050 0.0 0.6 5404 1652 ? S 06:25 0:00 pickup -l -t fifo -u -c
postfix 5052 0.0 0.7 5444 1832 ? S 06:25 0:00 qmgr -l -t fifo -u
postfix 5065 0.0 0.9 5772 2460 ? S 06:30 0:00 tlsmgr -l -t unix -u -c
postfix 5092 0.0 0.9 5544 2316 ? S 06:40 0:00 smtp -t unix -u -c
Now you can select a process ID, like 5050 and use strace on that PID.
Now as root, use strace.
strace -p 5050
Process 5050 attached – interrupt to quit
alarm(333) = 274
time(NULL) = 1222519411
epoll_wait(8, {{EPOLLIN, {u32=6, u64=577892986457686022}}}, 100, 41000) = 1
time(NULL) = 1222519412
write(5, “\272\23\0\0\1\0\0\0\0\0\0\0″, 12) = 12
read(6, “W”, 1024) = 1
open(“maildrop”, O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|0×80000) = 9
fstat64(9, {st_mode=S_IFDIR|S_ISVTX|0730, st_size=4096, …}) = 0
getdents64(9, /* 2 entries */, 4096) = 48
getdents64(9, /* 0 entries */, 4096) = 0
close(9) = 0
write(5, “\272\23\0\0\1\0\0\0\1\0\0\0″, 12) = 12
time(NULL) = 1222519412
alarm(333) = 332
time(NULL) = 1222519412
Running a Debugger for Postfix
If you are having continual problems with Postfix you can runs the gdb debugger which does not require a graphical interface. This is a non-interactive debugger that will print a stack trace if the process crashes. Edit the main.cf file and add this information.
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin; export PATH; (echo cont; echo
where; sleep 8640000) | gdb $daemon_directory/$process_name
$process_id 2>&1
>$config_directory/$process_name.$process_id.log & sleep 5
Now edit the master.cf and add the “-D” at the end of the line. This will run each daemon under the control of the debugger as described in your main.cf file.
smtp inet n - - - - smtpd -D
Save and restart Postfix. Now when the process is started an output file will be created and named after the daemon and the process ID. If the process crashes a stack trace will be written to the logfile.
Posted by mike Filed Under Compile Postfix with Comments Off
Before making the decision on whether to build from source or not, it may be best to review a few of the advantages and disadvantages.
Disadvantages
1. Time
It takes time and effort to compile from source. There are things you will need to learn and problems you will need to fix. It is just more work to compile from source.
2. Transfer of Knowledge
If your organization does not have a plan to transfer the information on how the compilation was done and a transfer of the skills needed to compile and to maintain Postfix, then do not go down this road. Company after company starts the process but finds themselves with applications that no one on staff can manage, with no documentation and no staff to solve the problems of updates. When you compile a program transfer the knowledge through clear documentation and training of subordinates.
Advantages
1. Specific Build Options
When you build from source you can specify each of the options that go into the build process, eliminating options you do not need and adding those options that are most important. This provides a much smaller and more secure product.
2. Version Freedom
You can download and install any version of Postfix you want to use, you are not tied to the version that is in the repository.
Posted by mike Filed Under Compile Postfix with Comments Off
Compile a Basic Postfix
Once you have downloaded the source code, move it into the /usr/local/src directory, other options are available.
Download Source Code From Here:
http://www.postfix.org/download.html
mv postfix-2.5.5.tar.gz /usr/local/src/
Untar the file which will create a directory.
tar zxvf postfix-2.5.5.tar.gz
Move into the new postfix directory.
cd postfix-2.5.5
Install the prerequisites. These were required on an Ubuntu 8.04 server.
apt-get install db*-devel
apt-get install libdb-dev
Since Postfix does not use GNU autotools and so does not have the configure script that you may be used to. Typically the make utility will use a Makefile that will determine the options you want, dependencies and prerequisites. Postfix will actually do this work for you by creating it’s own Makefile.
make
Once the compile is complete you will need to create the user and groups for Postfix.
groupadd postfix
groupadd postdrop
The user postfix needs to have an account that cannot log in and be a part of the postfix group that was created.
useradd -c postfix -d /tmp -g postfix -s /bin/false postfix
Now run the final command which will allow you to choose directories and locations that you want to use with your installation. Read each option closely so that when you run the command you have an idea on what you want to change, if anything. You can take the default settings by choosing ENTER.
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.
install_root: [/]
Please specify a directory for scratch files while installing Postfix. You must have write permission in this directory.
tempdir: [/usr/local/src/postfix-2.5.5]
Please specify the final destination directory for installed Postfix configuration files.
config_directory: [/etc/postfix]
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: [/usr/sbin]
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: [/usr/libexec/postfix]
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: [/var/lib/postfix]
Please specify the destination directory for the Postfix HTML files. Specify “no” if you do not want to install these files.
html_directory: [no]
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: [postfix]
Please specify the final destination pathname for the installed Postfix mailq command. This is the Sendmail-compatible mail queue listing command.
mailq_path: [/usr/bin/mailq]
Please specify the destination directory for the Postfix on-line manual pages. You can no longer specify “no” here.
manpage_directory: [/usr/local/man]
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: [/usr/bin/newaliases]
Please specify the final destination directory for Postfix queues.
queue_directory: [/var/spool/postfix]
Please specify the destination directory for the Postfix README files. Specify “no” if you do not want to install these files.
readme_directory: [no]
Please specify the final destination pathname for the installed Postfix sendmail command. This is the Sendmail-compatible mail posting interface.
sendmail_path: [/usr/sbin/sendmail]
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: [postdrop]
This should complete a basic setup for Postfix and you can then start postfix with:
/usr/sbin/postfix start
You should see port 25 listening when you run netstat.
netstat -aunt