FreeBSD 5,6 で Samba 3

実はうちのファイルサーバ、そろそろ UFS 2 に移行したいということでサーバのバージョンアップを行った。今から入れるなら中途半端な FreeBSD 5.4 より 6.0 の方がいいかなと思い、6.0 をさらでインストールした。ならばついでに開発の終わっている Samba 2.x より 3.0 系列をということでコンパイルしたのだが、これが有名な libiconv 問題をかかえているので一筋縄でいかない。しかも GNU ツールで全部揃えている Linux ではあまり問題にならないトラブルもあったので、忘れないように書き残しておこうと思う。なお、FreeBSD 5 でも同じ内容が通用するかと思う。

正攻法


2007年、元のファイルサーバがぶち壊れたので、正攻法も検証してみました。

OSは FreeBSD 6.1 で、ports.tar.gz は 適当に anonymous FTP から取ってきました。

今時の libiconv には WITH_EXTRA_PATCHES というシンボルが定義されていれば cp932 パッチが適用されるよう、気を効かせてもらっているようだ。

# cd /usr/ports/converters/libiconv
# make WITH_EXTRA_PATCHES=yes
# make install                                                    

あとは ports から gmake をインストールすれば問題ない。

が、何も考えずに Packages で gmake を入れてしまった私はえらい手間がかかってしまった。

遠回り


だめだと思うが iconv -l | grep MS などで EUC-JP-MS などが表示されるかどうか見てほしい。Packages で入ったものだったらこんな表示はでないだろう。

で、ソースからコンパイルするわけだが、とりあえずアーカイブを取得する。

libiconv は GNU の FTP サイトにある。2006年1月現在、1.10 が最新版のようだ。ミラーもたくさんあることだろう。

http://ftp.gnu.org/pub/gnu/libiconv/

CP932 パッチは以下の所にあった。

http://www2d.biglobe.ne.jp/~msyk/software/

該当する libiconv のバージョンと合ったものを取得してほしい。

% cd /usr/local/src
% tar xvzf /path/to/libiconv-1.10.tar.gz
% gzip -d /path/to/libiconv-1.10-patch.gz | patch -p
(↑ cd libiconv-1.10 すると path が違うと怒られるので注意が必要)

これで gmake でないとコンパイルが通らなかったら悲惨なのだが、さすがにそんなことはない。

% cd libiconv-1.10
% ./configure
% make
% make check
% su
# mkdir /usr/local/lib/libiconv.org
# mv /usr/local/lib/libiconv* /usr/local/lib/libiconv.org         
# make install
# ldconfig /usr/local/lib

configure はデフォルトで prefix が /usr/local になっている。prefix を別に /usr/local 以外にしてもよい。この時にはすでに Packages で入ってしまった libiconv を待避する必要がない。ただし、何を指定したかは覚えておくように。

iconv -l | grep MS の確認と、ldconfig -r | grep libiconv の確認をしておく。

なお、元の libiconv を移動した時点で Packages で入れた gmake は使えなくなっている。

で、必要な人は OpenLDAP や cups などをコンパイルしてほしい。

いよいよ Samba のコンパイルになる。ソースアーカイブは日本のユーザグループの Webページにリンクがある。

http://www.samba.gr.jp/

% cd /usr/local/src
% tar xvzf /path/to/samba-3.0.18a.tar.gz
% cd samba-3.0.18a
% ./configure --with-libiconv=/usr/local --with-syslog --disable-\
cups --disable-winbindd --mandir=/usr/local/man

syslog がどうとか cups や winbindd がこうとかはそれぞれの趣味で決めてほしい。

大事なのは --with-libiconv の指定で、最初ここを /usr/local/lib にしていて大はまりした。ここには libiconv をコンパイルした時の prefix をそのまま指定するのが正解である。厄介なのは libiconv のパスが違っていてもコンパイル時に warning がでているだけでコンパイルそのものは終わってしまう。なので、実際に起動してエラーメッセージが大量にでてやっと気づくことになる。(それも syslog オプションを付けていないと気づかないかもしれない)

なお、このあとのコンパイルは make (BSD make) でも可能である。gmake を使いたい場合には configure が終わってから ln -s /usr/local/lib/libiconv.org/libiconf.so.3 /usr/local/lib/libiconv.so.3 としてから gmake すればよい。

なお、CP932 対応の libiconv は libiconv.so.5 としてインストールされているようなので、upper compatible なはずだから ln -s /usr/local/lib/libiconv.so.5 /usr/local/lib/libiconv.so.3 で動きそう(未確認)。

Samba の configure では prefix がデフォルトで /usr/local/samba になっているのでインストールする。

あとは起動する設定である。

% su
# vi /etc/services                                                

ここで、swat (901/TCP) をコメントアウトされていることを確認する。FreeBSD 6.0 であれば大丈夫だ。

あとは inetd.conf で swat を記述する。FreeBSD 6.0 ではコメントで用意されているのでこれを外す。もちろん /etc/hosts.allow も適切に設定する必要がある。もちろん inetd は HUP シグナルで再起動する。

これで一応 swat は起動できるようになったはずである。smb.conf を適切に設定する。大事なのは global オプションの言語の指定だ。
あとは共有やユーザなどの設定を行えばよい。私の場合、認証は Active Directory や NT Domain は使わないので、share=user で Samba 用にユーザを作る必要がある。これは swat からでもできる。

最後に /usr/local/etc/rc.d/samba.sh とでもして起動スクリプトを用意しておく。これは以下のリンクにあるスクリプトをほとんど流用させてもらった。


参考にしたページ

http://www.east.jdmia.or.jp/~tamotsu/how-to-install/samba3.php

http://www.miraclelinux.com/technet/document/samba/samba0016.html#part2

有用なドキュメントを公開されている作者の方々に感謝します。



戻る