跳转到主要内容

于 2025年04月22日 摘录自 Postfix Berkeley DB Howto

简介

Postfix 使用各种类型的数据库来存储和检索信息。Postfix 数据库以 "类型:名称" 的形式指定。Berkeley DB 实现了 Postfix 数据库类型 "hash" 和 "btree"。Postfix Berkeley DB 数据库的名称是数据库文件名去除 ".db" 后缀的部分。Berkeley DB 数据库通过 postmap(1) 命令进行维护。

注意:Postfix 2.0 之前的版本不支持 Berkeley DB 4.

本文档描述:

  1. 如何在系统已包含 Berkeley DB 的情况下构建不支持 Berkeley DB 的 Postfix。
  2. 如何在通常不包含 Berkeley DB 库的系统上构建 Postfix。
  3. 如何在 BSD 或 Linux 系统上构建 Postfix,这些系统可能包含多个 Berkeley DB 版本。
  4. 如何调整性能。
  5. 缺少pthread库的问题。

即使系统自带 Berkeley DB,也禁用 Berkeley DB 支持来构建 Postfix

注意:以下说明适用于 Postfix 2.9 及更高版本。

Postfix 通常会在系统已知包含 Berkeley DB 时启用其支持。若要构建不包含 Berkeley DB 支持的 Postfix,请按以下方式构建 makefile:

% make makefiles CCARGS="-DNO_DB"
% make

这将禁用对 "hash" 和 "btree" 文件的支持。

在通常不包含 Berkeley DB 库的系统上构建 Postfix

某些 UNIX 系统默认不包含 Berkeley DB 支持;出于历史原因,这些系统使用 DBM 文件代替。DBM 文件的问题在于它们只能存储有限量的数据。要构建支持 Berkeley DB 的 Postfix,您需要从 http://www.oracle.com/database/berkeley-db/ 下载并安装源代码。

警告:部分 Linux 系统库(如 SASL 等第三方库)使用 Berkeley DB。若您使用不同实现的 Berkeley DB 编译 Postfix,则所有 Postfix 程序都会因系统库、SASL 库或 Postfix 本身使用了错误版本而发生核心转储。

较新的 Berkeley DB 版本提供了一个编译时开关 "--with-uniquename",该开关会重命名符号,从而使同一应用程序中可以同时存在多个 Berkeley DB 版本。尽管这种方法较为浪费,但可能是防止系统崩溃的唯一方法。

在从源代码安装 Berkeley DB 后编译 Postfix,请使用类似以下命令:

% make makefiles CCARGS="-DHAS_DB -I/usr/local/BerkeleyDB/include" \
AUXLIBS="-L/usr/local/BerkeleyDB/lib -ldb"
% make

如果 Berkeley DB 共享库位于运行时链接器未知目录中,请在 "-ldb" 后添加 "-Wl,-R,/path/to/directory" 选项。

Solaris 需要以下内容:

% make makefiles CCARGS="-DHAS_DB -I/usr/local/BerkeleyDB/include" \
AUXLIBS="-R/usr/local/BerkeleyDB/lib -L/usr/local/BerkeleyDB/lib -ldb"
% make

确切的路径名取决于 Berkeley DB 的版本以及其安装方式。

警告:Berkeley DB 版本 1 生成的文件格式与版本 2 和 3 不兼容(版本 2 和 3 采用相同的格式)。若在不同 DB 版本间切换,可能需要重新构建所有 Postfix DB 文件。

警告:如果您使用 Berkeley DB 版本 2 或更高版本,请勿启用 DB 1.85 兼容模式。否则会导致 fcntl 文件锁定功能失效。

警告:如果您使用 Perl 操作 Postfix 的 Berkeley DB 文件,则 Perl 中使用的 Berkeley DB 版本必须与 Postfix 中一致。

在 BSD 系统上使用多个 Berkeley DB 版本构建 Postfix

部分 BSD 系统默认包含多个 Berkeley DB 实现。通常,Postfix 会使用系统默认的 DB 版本进行构建。

若要在 BSD 系统上使用非默认 DB 版本构建 Postfix,请使用以下命令的变体:

% make makefiles CCARGS=-I/usr/include/db3 AUXLIBS=-ldb3
% make

警告:Berkeley DB 版本 1 生成的文件格式与版本 2 和 3 不兼容(版本 2 和 3 具有相同的格式)。如果您在 DB 版本之间切换,可能需要重新构建所有 Postfix DB 文件。

警告:如果您使用 Berkeley DB 版本 2 或更高版本,请勿启用 DB 1.85 兼容模式。这样会破坏 fcntl 文件锁定。

警告:如果您使用 Perl 操作 Postfix 的 Berkeley DB 文件,则 Perl 中使用的 Berkeley DB 版本必须与 Postfix 中使用的版本相同。

在具有多个 Berkeley DB 版本的 Linux 系统上构建 Postfix

某些 Linux 系统自带多个 Berkeley DB 实现。通常,Postfix 会使用系统自带的默认 DB 版本进行构建。

警告:某些 Linux 系统库使用 Berkeley DB。如果您使用非默认 Berkeley DB 实现编译 Postfix,则所有 Postfix 程序都会因系统库或 Postfix 本身使用了错误版本而发生核心转储。

在 Linux 上,您需要编辑 makedefs 脚本以指定非默认的 DB 库。原因是默认的 db.h 包含文件的位置在不同供应商和不同版本之间会随机变化,因此 Postfix 需要为您选择文件。

警告:Berkeley DB 版本 1 生成的文件格式与版本 2 和 3 不兼容(版本 2 和 3 具有相同的格式)。如果您在 DB 版本之间切换,可能需要重新构建所有 Postfix DB 文件。

警告:如果您使用 Berkeley DB 版本 2 或更高版本,请勿启用 DB 1.85 兼容模式。这样会破坏 fcntl 文件锁定。

警告:如果您使用 Perl 操作 Postfix 的 Berkeley DB 文件,则 Perl 中使用的 Berkeley DB 版本必须与 Postfix 中使用的版本一致。

性能调整

Postfix 提供了两个配置参数,用于控制 Berkeley DB 使用多少缓冲内存。

  • berkeley_db_create_buffer_size(默认:每个表 16 MB)。此设置用于维护 Berkeley DB 文件的命令:postalias(1)postmap(1)。对于 "hash" 文件,创建性能会迅速下降,除非内存池大小为 O(文件大小)。对于 "btree" 文件,创建性能在输入数据有序时即使内存池较小也能保持良好,但输入数据随机时性能会迅速下降,除非内存池大小为 O(文件大小)。
  • berkeley_db_read_buffer_size(默认:每个表 128 KB)。此设置用于所有其他 Postfix 程序。缓冲区大小足以满足读取需求。如果缓存小于表大小,随机读取性能几乎不依赖于缓存大小,除非使用 btree 表,此时缓存大小必须足够大以容纳从根节点到目标节点的完整路径。经验表明 64 KB 可能已足够。我们将其大小翻倍以确保安全,并预留空间应对实现变更和内存膨胀。

缺少 pthread 库问题

当构建 Postfix 时出现以下错误:

未定义的引用到 `pthread_condattr_setpshared'
未定义的引用到 `pthread_mutexattr_destroy'
未定义的引用到 `pthread_mutexattr_init'
未定义的引用到 `pthread_mutex_trylock'

在 "make makefiles" 命令中添加 "-lpthread" 库。

% make makefiles .... AUXLIBS="... -lpthread"

更多信息请访问 http://www.oracle.com/database/berkeley-db/