玄箱 + NetBSD 上で avahi を (2008/03/12)


 玄箱に NetBSD を入れて netatalk を動かして Mac 用のサーバにしているのですが、Mac の OS を Lopard にしたらネットワークブラウザに出て来なくなってしまいました。これは各方面で話題になっているようですが、Leopard は SLP には対応せず、Bonjour で検出できるデバイスしか表示しなくなってしまったのが原因ようです。対策としては玄箱を何らかの方法で Zeroconf に対応させれば良いのですが、さて、どうしたものか。

 現在、選択肢としては Apple の BonjourAvahi があるようです。Howl というのもあったようですが、既に開発が停止しているようです。従って Bonjour か Avahi のどちらかになるのですが、Apple の Bonjour は NetBSD には対応していない様子。そこで Avahi を入れてみました。一応対応プラットフォームとして NetBSD が入っていましたので。しかしコトはそう単純ではなく、お約束で幾つかトラップがありましたんで、前回と同様、備忘録代わりに作成しました。

 結論から書くと、以下のようにすればインストールできそうです。

 netatalk のビルドでインストールしたものに加えて、以下のものをインストール

  1. pkg-config
  2. expat
  3. XML::Parser
  4. libdaemon

 ビルドの手順は以下の通り

	% setenv CFLAGS "-D_NETBSD_SOURCE=1"
	% setenv LD_LIBRARY_PATH "/usr/local/lib"
	% setenv LDFLAGS "-L/usr/local/lib -lintl -Wl,--rpath -Wl,/usr/local/lib"
	% ./configure --disable-qt3 --disable-qt4 --disable-gtk --disable-python --disable-mono --disable-glib --disable-gobject --disable-dbus --disable-autoipd
	% gmake

 で、多分 OK です。ただ、実際には avahi を入れる前に w3m とか samba とかを既にインストールしてありまして、それらのビルドに必要だったライブラリは今回ビルドしていません。なので、このリストには抜けがあるかもしれません。と言っても、他に入れたのは多分 w3m で伝統的に使っている gc だけだと思います。実は pkg-config も w3m のビルドに必要で既にインストールしてあったので今回はビルドしてません。

 pkg-config は http://pkgconfig.freedesktop.org/releases/ からダウンロードできます。ビルド自体は簡単だったと思います。./configure、make、make install で済むと思います。確か。

 前回と同様、時系列に書いてありますのでかなり読みにくいかと思いますが、、、まぁ、そもそもこのサイトをどれだけの人が見るのか全然解らないんですが、何かのお役に立てれば、と思い、上げてみます。


■ avahi

 avahi の公式サイトから、最新と思われる avahi-0.6.22.tar.gz を頂いて来ました。展開して ./configure すると、

	checking for XML::Parser... configure: error: XML::Parser perl module is required for intltool

 というエラーが出ます。

 何だこれは?と思ってグーグルで調べると、どうやらこれは Perl のモジュールらしい。入れましょうか。


■ XML::Parser

 http://search.cpan.org/dist/XML-Parser/ から最新の XML-Parser-2.36.tar.gz を頂いて来て、展開して README に書いてある通りにインストールしました。

 perl Makefile.PL

 で configure するのね。。。へー。で、実行すると、

	% perl Makefile.PL
	Note (probably harmless): No library found for -lexpat
	
	Expat must be installed prior to building XML::Parser and I can't find
	it in the standard library directories. You can download expat from:
	
	http://sourceforge.net/projects/expat/
	.....
 はぁ。そうっすか。

 んじゃ、libexpat.a とやらをインストールしましょうか。


■ expat

 http://sourceforge.net/projects/expat/ から expat-2.0.1.tar.gz を頂いて来ました。

 これは make check も含めてすんなり入りました。


■再び XML::Parser

	% perl Makefile.PL
	Checking if your kit is complete...
	Looks good
	Warning: prerequisite LWP 0 not found.
	Writing Makefile for XML::Parser::Expat
	Writing Makefile for XML::Parser
 「LWP 0」って何?

 グーグルで調べると、これはどうやら libwww-perl のことらしい。

 しかし、Warning だから無視してもいいようです。っつーか、ここでは無視した方が無難でした。

 一応、http://search.cpan.org/〜gaas/libwww-perl/ から最新版の ibwww-perl-5.808.tar.gz を頂いて来てインストールにチャレンジしたのですが、ドツボにハマりそうだったんでやめました。


■再び avahi

./configure すると、

	:
	checking for GLIB20... gnome-config: not found
	configure: error: Package requirements ( glib-2.0 >= 2.4.0 ) were not met:
	
	No package 'glib-2.0' found
	
	Consider adjusting the PKG_CONFIG_PATH environment variable if you
	installed software in a non-standard prefix.
	
	Alternatively, you may set the environment variables GLIB20_CFLAGS
	and GLIB20_LIBS to avoid the need to call pkg-config.
	See the pkg-config man page for more details.
	
	65.805u 66.634s 2:01.63 108.8%  0+0k 31+5478io 325pf+0w
	% 

 glib が必要なようです。

 しかし、glib を入れて頑張ってみたのですが、正直言って意味がありませんでした。

 glib 自体は make check で pthread 周りでエラーが出ますが、無理矢理入れれば何とか入ります。入れてみたい人は頑張ってみてください。gmake 中、"error: `PREFIX' undeclared" というようなエラーが出た場合で、pkgsrc に入っているパッチを全て当てていた場合、patch-ah を revert してみてください。私の場合、このパッチが悪さをしていました。また、"../../gthread/.libs/libgthread-2.0.so: undefined reference to `pthread_attr_destroy'" というエラーが tests/refcount や tests/refcount で出た場合、tests/refcount/Makefile の 141 行目付近の LIBS = -lintl を LIBS = -lintl -lpthread にすれば OK でした(いや、make check で fail しているからダメだったのか?)。

 私は glib を使わないオプションを選択するのが妥当のように思いましたので、./configure --help で出てくる、

	--disable-glib          Disable use of GLib
	--disable-gobject       Disable use of GLib GObject

 を指定することにします。


 一旦ソースツリーを全て削除して今度は ./configure --disable-glib --disable-gobject を実行しました。

 結果は、

	% ./configure --disable-glib --disable-gobject
		:
	checking for QT3... gnome-config: not found
	configure: error: Package requirements ( qt-mt >= 3.0.0 ) were not met:
	
	No package 'qt-mt' found
	
	Consider adjusting the PKG_CONFIG_PATH environment variable if you
	installed software in a non-standard prefix.
	
	Alternatively, you may set the environment variables QT3_CFLAGS
	and QT3_LIBS to avoid the need to call pkg-config.
	See the pkg-config man page for more details.
	
	% 

 今度は Qt っすか。しかし何で Qt が必要なんだ?avahi って GUI のツールじゃないでしょ?理解に苦しむなぁ。

 一応入れてみようかと思ってちょっと調べたんですが、pkgsrc の README.html に出ている依存しているライブラリの一覧を見て絶句してしまいました。

 却下却下。

 こんなのインストールしたくないです。

 ということで、avahi の ./configure --help で出てくる、

	--disable-qt3           Disable building of Qt3 mainloop integration
	--disable-qt4           Disable building of Qt4Core mainloop integration

 で行くことにします。


 また一旦ソースツリーを全て削除し、./configure --disable-glib --disable-gobject --disable-qt3 --disable-qt4 を実行しました。

 今度は

	./configure --disable-glib --disable-gobject --disable-qt3 --disable-qt4
		:
	checking for GTK20... gnome-config: not found
	configure: error: Package requirements ( gtk+-2.0 >= 2.4.0 ) were not met:
	
	No package 'gtk+-2.0' found
	
	Consider adjusting the PKG_CONFIG_PATH environment variable if you
	installed software in a non-standard prefix.
	
	Alternatively, you may set the environment variables GTK20_CFLAGS
	and GTK20_LIBS to avoid the need to call pkg-config.
	See the pkg-config man page for more details.
	
	% 

 えっと、gtk っすか。これも巨大だからなぁ。avahi の ./configure --help で出てくる、

	--disable-gtk           Disable use of GTK+

がありますので、これで行ってみましょう。


 またまた一旦ソースツリーを全て削除し、./configure --disable-glib --disable-gobject --disable-qt3 --disable-qt4 --disable-gtk を実行しました。

	./configure --disable-glib --disable-gobject --disable-qt3 --disable-qt4 --disable-gtk
	:
	checking for DBUS... gnome-config: not found
	configure: error: Package requirements ( dbus-1 >= 0.34 ) were not met:
	
	No package 'dbus-1' found
	
	Consider adjusting the PKG_CONFIG_PATH environment variable if you
	installed software in a non-standard prefix.
	
	Alternatively, you may set the environment variables DBUS_CFLAGS
	and DBUS_LIBS to avoid the need to call pkg-config.
	See the pkg-config man page for more details.
	
	% 
 DBUS?何ですかそれ?

 グーグルで検索すると、どうやらプロセス間通信の場を提供するものらしいです。http://www.freedesktop.org/wiki/Software/dbus からダウンロードできるようです。

 これ、頑張ってインストールしてみたのですが、結局使いませんでした。avahi を D-Bus 対応でビルドすると、D-Bus の daemon が動いていないと avahi は動かないようです。動かす daemon は少ない程良いという主義なので、動かさずに済むのであれば dbus は動かしたくありません。

 avahi の ./configure --help を見ると、

	--disable-dbus Disable use of D-Bus

 というオプションがありますので、私はこれを指定する方を選びました。

 D-Bus ですが、ビルドした手順を簡単に書くと、まず http://0pointer.de/lennart/projects/libdaemon/ から libdaemon をダウンロードして来て展開し、

	% ./configure --disable-lynx
	% gmake
	# gmake install

 でビルド & インストールします。次に D-Bus のアーカイブを展開し、以下の手順でビルドします。

	% setenv CFLAGS "-I/usr/local/include"
	% setenv LD_LIBRARY_PATH "/usr/local/lib"
	% setenv LDFLAGS "-L/usr/local/lib -Wl,--rpath -Wl,/usr/local/lib"
	% setenv LIBXML_CFLAGS "-L/usr/local/lib"
	% setenv LIBXML_LIBS "-lexpat"
	% ./configure --with-xml=expat 
	% make

 この後 make 中に dbus/dbus-sysdeps-unix.c のコンパイルで `AI_ADDRCONFIG' undeclared というエラーが出る場合は、ソース中の 785 行目付近と 888 行目付近の二カ所にある AI_ADDRCONFIG を両方とも 0 に置き換えるのと、dbus-daemon-launch-helper-test で undefined reference to `pthread_equal' のリンクエラーが出る場合は bus/Makefile の 307 行目付近の LIBS = を LIBS = -lpthread に変更すれば、とりあえずビルドは通るようです。

 ご参考まで。


 またx3 一旦ソースツリーを全て削除し、./configure --disable-glib --disable-gobject --disable-qt3 --disable-qt4 --disable-gtk --disable-dbus を実行しました。

		:
	checking for a Python interpreter with version >= 2.4... none
	configure: error: no suitable Python interpreter found
	% 

 Python っすか。入れたこと無いなぁ。

 一応 Python を入れようと思って頑張ってみました。ですが、configure、make までは特にエラーも無く終わるものの、make test で 8 項目 fail & 40 項目 skip します。どうもきちんと動かないようなので、今回はあきらめました。

 そこで、ここでは avahi の ./configure --help で表示される、

	--disable-python        Disable scripts that depends on python

 を使うことにしました。


 またx4 一旦ソースツリーを全て削除し、./configure --disable-glib --disable-gobject --disable-qt3 --disable-qt4 --disable-gtk --disable-dbus --disable-python を実行。

 すると、あれ?

	./configure --disable-glib --disable-gobject --disable-qt3 --disable-qt4 --disable-gtk --disable-dbus --disable-python
		:
	checking for XML_ParserCreate in -lexpat... no
	checking for XML_ParserCreate in -lbsdxml... no
	configure: error: *** neither libexpat not libbsdxml could be found ***
	% 

 おかしいなぁ。libexpat は入れたんだが。
 config.log を見てみると、

		:
	configure:30755: checking for XML_ParserCreate in -lexpat
	configure:30790: gcc -o conftest -g -O2 -std=c99 -Wall -W -pedantic -pipe -Wformat -Wfloat-equal -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wredundant-decls -Wmissing-noreturn -Wshadow -Wendif-labels -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align -Wwrite-strings -Winline -fPIC -D_XOPEN_SOURCE=500 -D__EXTENSIONS__ -I/usr/local/include  conftest.c -lexpat   >&5
	conftest.c:106: warning: function declaration isn't a prototype
	conftest.c:109: warning: function declaration isn't a prototype
	ld: cannot find -lexpat
		:

 どうやら libexpat.a を見つけられなかったらしい。-I/usr/local/include は入っているのだが、-L/usr/local/lib は入ってないのは何故?ま、いっか。

	% setenv LD_LIBRARY_PATH "/usr/local/lib"
	% setenv LDFLAGS "-L/usr/local/lib -Wl,--rpath -Wl,/usr/local/lib"

 をしてから再度 configure します。


 またx4 一旦ソースツリーを全て削除し、

	% setenv LD_LIBRARY_PATH "/usr/local/lib"
	% setenv LDFLAGS "-L/usr/local/lib -Wl,--rpath -Wl,/usr/local/lib"

 を実行した後 ./configure --disable-glib --disable-gobject --disable-qt3 --disable-qt4 --disable-gtk --disable-dbus --disable-python を実行。

	% ./configure --disable-glib --disable-gobject --disable-qt3 --disable-qt4 --disable-gtk --disable-dbus --disable-python
		:
	checking for mcs... no
	configure: error: Can not find "mcs" - The Mono C-Sharp Compiler) in your PATH
	% 

 何でしょう?この "The Mono C-Sharp Compiler" というのは?

 グーグルで検索すると、どうやら本当に C# のコンパイラのようです。こんなのあるんだ。

 この The Mono C-Sharp Compiler もインストールしようと頑張ってみたのですが、ある程度まで進んだ所で投げ出しました。と言う訳で、avahi の ./configure --help に出てくる

	--disable-mono          Disable mono bindings

 を指定することにしました。

 参考までに The Mono C-Sharp Compiler のことを書きますと、まず、これは http://www.mono-project.com/CSharp_Compiler で配布しているようです。ここから最新の mono-1.2.6.tar.bz2 を頂いて来るのですが、まず、展開する所から躓きます。NetBSD に付属の tar では展開できません。GNU の tar をインストールし、gtar で展開する必要があります。GNU の tar 自体は問題無くビルドできます(ただ、make check で幾つか fail します。まぁ、深刻なものは無いようですが)ので、大した問題ではないんですが。あと、glib と pkg-config と bison が必要です。glib と pkg-config は既に入っていたのですが、bison は入れる必要がありました。bison のインストールも問題無く、make check まで含めて素直に入ります。./configure の前に、

	setenv LD_LIBRARY_PATH "/usr/local/lib"
	setenv LDFLAGS "-Wl,--rpath -Wl,/usr/local/lib"

 をやっておき、gmake すればある程度の所までは進みますが、

	*** The compiler 'mcs' doesn't appear to be usable.
	*** Trying the 'monolite' directory.

 このエラーを解決するのが面倒だったのであきらめました。


 またx5 一旦ソースツリーを全て削除し、

	% setenv LD_LIBRARY_PATH "/usr/local/lib"
	% setenv LDFLAGS "-L/usr/local/lib -Wl,--rpath -Wl,/usr/local/lib"

 を実行した後 ./configure --disable-glib --disable-gobject --disable-qt3 --disable-qt4 --disable-gtk --disable-dbus --disable-python --disable-mono を実行。

 これで、ようやく configure が通りました。disable ばっかりですね。

 いよいよ make します。まぁ、素直には make 出来ないとは思ってますが。案の定

		:
	gcc -DHAVE_CONFIG_H -I. -I. -I.. -I/usr/local/include -I.. "-DDEBUG_TRAP=__asm__(\"int \$3\")" -g -O2 -std=c99 -Wall -W -pedantic -pipe -Wformat -Wfloat-equal -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wredundant-decls -Wmissing-noreturn -Wshadow -Wendif-labels -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align -Wwrite-strings -Winline -fPIC -D_XOPEN_SOURCE=500 -D__EXTENSIONS__ -MT libavahi_core_la-socket.lo -MD -MP -MF .deps/libavahi_core_la-socket.Tpo -c socket.c  -fPIC -DPIC -o .libs/libavahi_core_la-socket.o
	In file included from socket.c:47:
	/usr/include/net/if_dl.h:66: error: parse error before "u_char"
	/usr/include/net/if_dl.h:69: error: parse error before "sdl_type"
	/usr/include/net/if_dl.h:69: error: ISO C forbids data definition with no type or storage class
	/usr/include/net/if_dl.h:70: error: parse error before "sdl_nlen"
	/usr/include/net/if_dl.h:70: error: ISO C forbids data definition with no type or storage class
		:(以下略)

 えっと、u_char が定義されてないようですね。

 u_char は /usr/include/sys/types.h で

	typedef        unsigned char   u_char;

 と定義されていますが、これが有効になるのは _NETBSD_SOURCE が #define されている時だけのようです。

 _NETBSD_SOURCE を #define しているのは、/usr/include/sys/featuretest.h のようなので、これの include を追加しましたが、どうやらダメですね。

 むりやり #define _NETBSD_SOURCE 1 してしまいましょう。

 gcc を -E 付きで実行してプリプロセッサの出力を見ると、最初に #include <sys/types.h> をするのは #include <unistd.h> の時のようなので、この前後に #define と #undef を入れます。

	% diff avahi-core/socket.c avahi-core/socket.c.orig
	30d29
	< #define _NETBSD_SOURCE
	32d30
	< #undef        _NETBSD_SOURCE
	% 

 しかし、、、他にも iface-pfroute.c をはじめ、幾つかの *.c で同様の原因のエラーが出るようです。ここはいっそのこと

	setenv CFLAGS "-D_NETBSD_SOURCE=1"

 してから configure しなおした方が良いような気がしましたので、やり直しました。


 またx6 一旦ソースツリーを全て削除し、

	% setenv CFLAGS "-D_NETBSD_SOURCE=1"
	% setenv LD_LIBRARY_PATH "/usr/local/lib"
	% setenv LDFLAGS "-L/usr/local/lib -Wl,--rpath -Wl,/usr/local/lib"

 を実行した後 ./configure --disable-glib --disable-gobject --disable-qt3 --disable-qt4 --disable-gtk --disable-dbus --disable-python --disable-mono を実行。

 その後 make すると、今度は以下のようなエラーが出ました。

	gcc -I.. "-DDEBUG_TRAP=__asm__(¥"int ¥$3¥")" (...中略...) -o .libs/avahi-daemon (...中略...) -L/usr/local/lib ../avahi-common/.libs/libavahi-common.so ../avahi-core/.libs/libavahi-core.so /usr/local/src/avahi-0.6.22/avahi-common/.libs/libavahi-common.so /usr/local/lib/libdaemon.so /usr/local/lib/libexpat.so /usr/local/lib/libdbus-1.so -lpthread -Wl,--rpath -Wl,/usr/local/lib
	../avahi-common/.libs/libavahi-common.so: undefined reference to `dgettext'
	../avahi-common/.libs/libavahi-common.so: undefined reference to `bind_textdomain_codeset'
	../avahi-common/.libs/libavahi-common.so: undefined reference to `bindtextdomain'
	*** Error code 1
	
	Stop.
	make: stopped in /usr/local/src/avahi-0.6.22/avahi-daemon
	*** Error code 1
		:(以下略)

 dgettext() や bind*() 等は libintl.a に入っています。ここは基本的には単純に -lintl をつけて gcc を実行してやれば済むはずなんですが、最初の -DDEBUG_TRAP に続く "" の対処を毎回やるのは面倒なんで、今回は LDFLAGS に入れて再度 configure することにしました。前回の netatalk では、こういった場面では手作業で済ませてたんですがね。


 またx7 一旦ソースツリーを全て削除し、

	% setenv CFLAGS "-D_NETBSD_SOURCE=1"
	% setenv LD_LIBRARY_PATH "/usr/local/lib"
	% setenv LDFLAGS "-L/usr/local/lib -lintl -Wl,--rpath -Wl,/usr/local/lib"

 を実行した後 ./configure --disable-glib --disable-gobject --disable-qt3 --disable-qt4 --disable-gtk --disable-dbus --disable-python --disable-mono を実行し、make します。

 今度はいい感じです。一気にマニュアルの整形まで進みました。

 しかし。

	sed -e 's,@PACKAGE_BUGREPORT¥@,avahi (at) lists (dot) freedesktop (dot) org,g'  -e 's,@PACKAGE_URL¥@,http://avahi.org/,g'  > avahi-browse.1.xml

 で、処理が進まなくなってしまいました。

 おーい。sed。しっかり仕事しろよ。

 make コマンドが他のプロセスを起動する時に問題が出るのかなぁ?と思い、gmake で再度トライします。


 一旦 make clean した後、gmake でビルドをします。

 今度は sed で止まることはなくなりました。

 ですが今度は

		:
	Making all in avahi-autoipd
		:(中略)
	main.c:39:26: net/ethernet.h: No such file or directory
		:(以下略)

 っていうエラーになりますね。。。

 これ、ちょっと見てみましたがとっても厄介そうです。本格的な移植作業になりそうです。autoipd はどうやら IPv4 Link-Local address をクライアントに提供する daemon のようです。DHCP や固定 IP Address で運用している場合は不要ですね。ということで、これ、ビルドするのやめましょう。configure --help で出てくる

	  --disable-autoipd       Disable building of avahi-autoipd

 で行きます。


 またx8 一旦ソースツリーを全て削除し、

	% setenv CFLAGS "-D_NETBSD_SOURCE=1"
	% setenv LD_LIBRARY_PATH "/usr/local/lib"
	% setenv LDFLAGS "-L/usr/local/lib -lintl -Wl,--rpath -Wl,/usr/local/lib"

 を実行した後 ./configure --disable-glib --disable-gobject --disable-qt3 --disable-qt4 --disable-gtk --disable-dbus --disable-python --disable-mono --disable-autoipd を実行し、gmake っと。

 ふう。これでようやくビルドできました。

 しかし、、、動くのか?これ。


■仕上げ

 いよいよ実行してみます。

 docs/INSTALL を読むと、次はユーザとグループの追加が必要なようです。Debian specific って書いてありますが、avahi-daemon を起動しようとすると、"Failed to find user 'avahi'." とか言われて起動しませんので必要なのでしょう。

 という訳で、vipw で avahi ユーザを適当に追加します。あと /etc/group に avahi グループも追加しておき、avahi さんには avahi グループに所属してもらいました。

 後、/usr/local/etc/avahi/services/afpd.service が必要ですが、これは前回 netatalk のインストールの時に参考にさせて頂いた http://www003.upp.so-net.ne.jp/hat/netatalk/andsamba.html にサンプルがありましたので、これをそのままコピーさせて頂きました。

 この時点で su して /usr/local/etc/avahi -D -s として起動すると、/var/log/message に、どうやら正常に起動できた様に見えるログが出て来ました。これは行けるかも。

 で、Mac のネットワークブラウザで見ると、、やりました。ちゃんと表示されました。うれしー。

 あとは /etc/rc.d/ 以下に置く起動スクリプトを用意する必要がありますが、これは以下のように適当にでっち上げました。ファイル名は avahi で。

	#!/bin/sh
	#
	# $NetBSD$
	#
	
	# PROVIDE: avahi-daemon
	# REQUIRE: DAEMON LOGIN
	# KEYWORD: shutdown
	
	. /etc/rc.subr
	
	name="avahi"
	rcvar=$name
	command="/usr/local/sbin/avahi-daemon"
	pidfile="/usr/local/var/run/avahi-daemon/pid"
	etcdir="/usr/local/etc/avahi"
	required_files="$etcdir/avahi-daemon.conf"
	command_args="-D -s"
	
	load_rc_config $name
	run_rc_command "$1"

 これがベストかどうかわかりませんが。最後に /etc/rc.conf に avahi=YES の行を追加して再起動してみた所、とりあえず動いているようなのでこれで良しとしましょう。

 そうそう、slpd はもう不要なので /etc/rc.conf から削除ですね。

 完了〜


戻る