Berkeley DB library configured to support only DB_PRIVATE environments

id:hiro-ueda:20080628:1214632306 の ERROR: can't create DB environment: Inappropriate ioctl for device (dbdir: /var/spool/postfix/postgrey uid/gid: 101,101) エラーの件、何とかしたくて postgrey のコードを少しずつ改変しながらチェックしてみました。こういうとき、オープンソースって素晴らしいなぁ、と思いますよね :)。

[root@bpr sbin]# diff -u postgrey postgrey.modified 
--- postgrey    2008-09-16 22:29:56.000000000 +0900
+++ postgrey.modified   2008-09-16 22:30:49.000000000 +0900
@@ -665,6 +665,8 @@
         -Home     => $self->{server}{dbdir},
         -Flags    => DB_CREATE|DB_RECOVER|DB_INIT_TXN|DB_INIT_MPOOL|DB_INIT_LOG,
         -SetFlags => $setflags,
+        -ErrFile  => '/tmp/error_bdb.log',
+        -Verbose  => 1,
     ) or die "ERROR: can't create DB environment: $! (" .
              "dbdir: ".$self->{server}{dbdir}." uid/gid: $<,$>)\n";

ここ を見て見つけた -ErrFile-Verbose オプションを付加して起動したところ、以下のようなエラーが記録されました。

Berkeley DB library configured to support only DB_PRIVATE environments

一歩、進展しました。これでググッたところ http://billboebel.typepad.com/blog/2007/03/berkeley_db_cen.html を発見 :)。

I am trying to get a CentOS 4.4 image running on Amazon EC2, and hit a helluva bug. A time consuming bug at least... CentOS comes with Berkeley db4 compiled with '--enable-posixmutexes'. But this doesn't work under Xen. When installing the perl BerleleyDB package I get a bunch of this:

Berkeley DB library configured to support only DB_PRIVATE environments

The BerkeleyDB README mentions this Red Hat bug. So I compiled my own copy of db-4.4.20 with '--disable-posixmutexes' and installed it to /usr/local/BerkeleyDB.4.4 and linked it from /usr/local/BerkeleyDB. Then while installing perl BerkeleyDB, I started getting a bunch of this crap:

http://billboebel.typepad.com/blog/2007/03/berkeley_db_cen.html

うわー、Xen 環境だからダメだったのか orz。どうりで VMware 上の CentOS 4 や実機上の CentOS 5 では大丈夫だったわけだ。

ということで http://www.oracle.com/technology/software/products/berkeley-db/db/index.html から db-4.2.52.tar.gz を入手し、ブログの手順に従って作業しました。

# tar xvfz db-4.2.52.tar.gz
# cd db-4.2.52/build_unix/
# ../dist/configure --disable-posixmutexes
# make
# make install
# cd /usr/local
# ln -s BerkeleyDB.4.2 BerkeleyDB
# echo "/usr/local/BerkeleyDB/lib" > /etc/ld.so.conf.d/BerkeleyDB.conf
# /sbin/ldconfig

さて、いよいよ postgrey の起動です。

# /usr/sbin/postgrey --inet=54321
2008/09/16-22:39:59 postgrey (type Net::Server::Multiplex) starting! pid(30618)
Binding to TCP port 54321 on host localhost
Setting gid to "101 101"
Setting uid to "101"
(Ctrl+c)
2008/09/16-22:40:02 Server closing!

無事に動きました :)。いやー、頑張って見るものです! ただし、この方法だと BerkeleyDB が rpm 版と tar ball 版の 2つ入った状態になります。大丈夫かどうかは私も良く分かりませんので、Xen 環境で postgrey が動かなくて困っている人は自己責任で追試してください m(__)m。