为何postmap生成超大数据库?APFS分区下Postfix映射文件异常膨胀
我之前在APFS分区上部署Postfix时也碰到过一模一样的问题!明明只有一行配置的generic文件,postmap之后居然生成了近30MB的DB,当时整个人都懵了,对比HFS+上的16KB差距实在太大。后来翻了Postfix和Berkeley DB的文档,终于搞清楚了原因,也找到了几个靠谱的解决办法:
问题根源
Postfix的postmap工具底层依赖Berkeley DB的db_load命令生成数据库文件。在macOS High Sierra切换到APFS之后,Berkeley DB的默认页大小(page size)会自动适配APFS的文件系统块大小,而APFS的块大小通常比HFS+大很多(尤其是大容量SSD上),再加上Berkeley DB的预分配机制,导致哪怕只有几条记录的小配置文件,也会生成体积夸张的DB文件。
解决方案
方案1:手动指定Berkeley DB页大小
执行postmap时通过环境变量强制设置小页尺寸(比如4KB,和HFS+的默认块大小一致),这样生成的DB文件就会回到正常大小:
# 处理generic文件 DB_CONFIG="set_pagesize 4096" sudo postmap /etc/postfix/generic # 处理sasl_passwd文件 DB_CONFIG="set_pagesize 4096" sudo postmap /etc/postfix/sasl_passwd
执行完之后用ls -lh /etc/postfix/*.db检查,文件大小应该会降到16KB左右。
方案2:创建全局DB配置文件
如果不想每次执行postmap都加环境变量,可以在Postfix的数据库目录创建一个DB_CONFIG文件,永久设置页大小:
- 先创建目录(如果不存在的话):
sudo mkdir -p /etc/postfix/db
- 创建
/etc/postfix/db/DB_CONFIG文件,写入以下内容:
# 设置页大小为4KB set_pagesize 4096 # 设置缓存大小,优化性能 set_cachesize 0 1048576 0
- 重新执行postmap命令即可,不需要加环境变量:
sudo postmap /etc/postfix/generic sudo postmap /etc/postfix/sasl_passwd
方案3:改用Hash格式映射
Postfix支持多种映射格式,其中hash格式在APFS上不会出现体积膨胀的问题。修改/etc/postfix/main.cf中的配置,把原来的默认db格式改成hash:
# 替换generic映射格式 smtp_generic_maps = hash:/etc/postfix/generic # 替换sasl_passwd映射格式(如果用到的话) smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
然后重新执行postmap生成hash格式的DB文件,体积也会保持在很小的范围。
验证
执行完任意一种方案后,用以下命令检查文件大小:
ls -lh /etc/postfix/generic.db /etc/postfix/sasl_passwd.db
正常情况下,每个文件的大小应该在16KB左右,和Sierra的HFS+上的结果一致。
内容的提问来源于stack exchange,提问作者Chris

