qmail 1.03 の IPv6 への対応断念
SERVER
qmail と IPv6 対応パッチ
CentOS 5.5 (x86_64) でも使い慣れた qmail を利用したいと思い、インストールしてみることにしました。
そういえば、同じく djb さんの djbdns について調べている中で、djb さんは IPv6 への対応に消極的といった話を目にしたような記憶があります。なんとなく IPv6 の存在も表面に現れるようになってきた気がするこの頃、せっかくなのでメールサーバー (MTA) も IPv6 に対応したものを選んでおきたいように思います。
そうなると、有名どころな選択肢としては qmail と sendmail と Postfix あたりになるかと思うのですけど、この中ならば、慣れ親しんでいて運用上の安心感がある qmail を個人的には選んでおきたいところです。
そんな観点で調べてみたときに、どうやら qmail にも IPv6 に対応するためのパッチがどこかから提供されているという情報を目にしました。
結局のところ IPv6 対応パッチを適用してもコンパイルで失敗してしまう状況に見舞われ断念となりましたけど、ともあれそんな感じで今回は、将来に備えて IPv6 対応化を施した qmail を CentOS 5.5 へインストールしようと奮闘した際の記録として記してみようと思います。
daemontools のインストール
まずは qmail を起動させるための daemontools のインストールから始めてみます。IPv6 対応を目指していても、こちらは通常通りのインストールで大丈夫なようでしたので、今までと同じような感じで進める形になりました。
ここは、従来通りの方法で、問題なくインストールして正常動作させることが出来ました。
ucspi-tcp の IPv6 対応化とインストール
続いて、qmail の SMTP サービスを稼働させる上で一般的な ucspi-tcp のインストールです。IPv6 を想定している場合には、こちらには IPv6 対応パッチを充てる必要があるようでしたので、それも併せて記して行こうと思います。
ucspi-tcp は、平成 22 年 10 月 27 日現在、http://cr.yp.to/ucspi-tcp.html からダウンロードすることが出来るようになっていました。
こちらも daemontools と同様、glibc 2.3.1 以降の環境では http://qmail.org/moni.csi.hu/pub/glibc-2.3.1/ で提供されている errno 対応のパッチを充てないとコンパイル時にエラーとなってしまうので、それも併せて行います。
また、ucspi-tcp の IPv6 対応パッチは http://www.fefe.de/ucspi/ からダウンロードできるようでした。
まず、http://cr.yp.to/ucspi-tcp.html ページの "How to install ucspi-tcp" から "ucspi-tcp-0.88.tar.gz" をダウンロードします。
今回は次のようにして、"/usr/local/src" にダウンロードして展開することにしました。
cd /usr/local/src
wget http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz
tar xvzf ucspi-tcp-0.88.tar.gz
続いて、必要なパッチを適用して行きます。
今回は glibc 2.3.1 の errno に対応させるためのパッチと IPv6 対応パッチをダウンロードして適用します。
wget http://qmail.org/moni.csi.hu/pub/glibc-2.3.1/ucspi-tcp-0.88.errno.patch
wget http://www.fefe.de/ucspi/ucspi-tcp-0.88-ipv6.diff19.bz2
bzip2 -d ucspi-tcp-0.88-ipv6.diff19.bz2
cd ucspi-tcp-0.88
patch -p1 < ../ucspi-tcp-0.88-ipv6.diff19
patch -p1 < ../ucspi-tcp-0.88.errno.patch
パッチを適用したら、コンパイルとインストールを行います。
make
make setup check
こんな感じでとりあえず、ucspi-tcp のインストールは完了した様子です。
qmail の IPv6 対応化とインストール
さて、今回は qmail を IPv6 対応の状態でインストールしてみようと試みたのですけど、失敗に終わってしまいました。
行った手順としては、通常の qmail をインストールする手順の途中で、http://member.wide.ad.jp/~fujiwara/ で提供されている "qmail-1.03-v6-20021006.diff" という IPv6 対応パッチを充ててから "make" するという流れだったのですけど、最後の make の段階でコンパイルエラーとなってしまったのでした。
patch -p1 < ../qmail-1.03-v6-20021006.diff
他にもいくつかパッチを充ててみましたが、ともあれこのように IPv6 対応パッチを適用してからコンパイルを行ってみると、"readwrite.h" の中で "read" と "write" という名の宣言が "/usr/include/unistd.h" の宣言と重複してしまっていることを示すエラーが表示されました。
当該ファイルを確認すると、"readwrite.h" の中では単純に int 型の "read" と "write" が extern で宣言されているだけのファイルです。そして "/usr/include/unistd.h" では同名のものが ssize_t として extern で宣言されているような感じです。
調べてみるとこれはどうやら、IPv6 対応パッチを適用した段階で組み込まれる "unistd.h" のインクルードが影響しているらしいです。
特にこの ssize_t という型は 32 ビット環境では 32 ビットの変数らしいのですが、これが 64 ビットになると 64 ビット環境になってしまうのだそうです。int 型が 32 ビット型のため、それによって今回の CentOS 5.5 (x86_64) 環境では、型の大きさの違いから、コンパイルエラーとなってしまうらしいです。
これを判断する上で参考になった資料は http://www.maid.ne.jp/~yy/memoru/2005-04.html の 2005/04/13 の記事でした。
このデータ型の差異はソースコード全体に大きな影響を及ぼしそうですし、ちょっとやそっとで対応できる問題ではなさそうな感じなので、これはひとまず 64 ビット環境での qmail の IPv6 対応化は断念しておくのが良さそうです。