2011-09-12 CentOS 5.6に netatalk 2.2.1を入れるのが大変だった…
netatalk のバージョンが 2.2.1 になっていた。
大量のバグフィックスってあるし、せっかくだからまだ netatalk 2.2.0 を入れていなかった古い(CentOS 5.6)サーバーに入れてみようと思った。
そしたらちょこっとハマったのでメモ。
■[CentOS][netatalk]netatalk 2.2.1 のダウンロードと準備

まずは前に netatalk 2.2.0 をインストールした時のメモを見て準備。
このサーバーには avahi-devel が入っていなかったのでインストールした。
[paraches@raphael myTest]$ yum list installed | grep avahi avahi.i386 0.6.16-10.el5_6 installed avahi.x86_64 0.6.16-10.el5_6 installed avahi-compat-libdns_sd.x86_64 0.6.16-10.el5_6 installed avahi-glib.i386 0.6.16-10.el5_6 installed avahi-glib.x86_64 0.6.16-10.el5_6 installed [paraches@raphael myTest]$ sudo yum install avahi-devel <省略> Installed: avahi-devel.i386 0:0.6.16-10.el5_6 avahi-devel.x86_64 0:0.6.16-10.el5_6 Complete! [paraches@raphael myTest]$
netatalk 2.2.1 はココからダウンロードしてきて展開する。
[paraches@raphael myTest]$ wget http://sourceforge.net/projects/netatalk/files/netatalk/2.2.1/netatalk-2.2.1.tar.gz/download [paraches@raphael myTest]$ tar zxvf netatalk-2.2.1.tar.gz [paraches@raphael myTest]$ cd netatalk-2.2.1
■[CentOS][netatalk]configure して make & make install する

まずは configure
[paraches@raphael netatalk-2.2.1]$ ./configure --enable-redhat --with-bdb=/usr/local/BerkeleyDB.5.1/ <省略> ERROR: --enable-redhat is obsoleted. Use --enable-redhat-sysv or --enable-redhat-systemd. exit 1 [paraches@raphael netatalk-2.2.1]$
あ! エラー!
でも、これはココに書いてあったのをさっき読んだばかりだった…。
というわけで、再度トライ!
[paraches@raphael netatalk-2.2.1]$ ./configure --enable-redhat-sysv --with-bdb=/usr/local/BerkeleyDB.5.1/
<省略>
Using libraries:
LIBS = -lpthread -L$(top_srcdir)/libatalk
CFLAGS = -I$(top_srcdir)/include -D_U_="__attribute__((unused))" -g -O2 -I$(top_srcdir)/sys
SSL:
LIBS = -L/usr/lib64 -lcrypto
CFLAGS = -I/usr/include/openssl
LIBGCRYPT:
LIBS = -lgcrypt -ldl -lgpg-error
CFLAGS =
BDB:
LIBS = -L/usr/local/BerkeleyDB.5.1//lib -ldb-5.1
CFLAGS = -I/usr/local/BerkeleyDB.5.1//include/
Configure summary:
Install style:
redhat-sysv
AFP:
Large file support (>2GB) for AFP3: yes
Extended Attributes: ad | sys
CNID:
backends: dbd last tdb
UAMS:
DHX ( SHADOW)
DHX2 ( SHADOW)
RANDNUM ( SHADOW)
passwd ( SHADOW)
guest
Options:
DDP (AppleTalk) support: no
SLP support: no
Zeroconf support: yes
tcp wrapper support: yes
quota support: yes
admin group support: yes
valid shell check: yes
cracklib support: no
dropbox kludge: no
force volume uid/gid: no
ACL support: no
LDAP support: yes
[paraches@raphael netatalk-2.2.1]$
無事終了!
で、さっくり make & make install!
[paraches@raphael netatalk-2.2.1]$ make <省略> /bin/sh ../../libtool --tag=CC --mode=compile gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I../.. -I../../include -D_U_="__attribute__((unused))" -g -O2 -I../../sys -MT ldap.lo -MD -MP -MF .deps/ldap.Tpo -c -o ldap.lo ldap.c gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I../.. -I../../include "-D_U_=__attribute__((unused))" -g -O2 -I../../sys -MT ldap.lo -MD -MP -MF .deps/ldap.Tpo -c ldap.c -fPIC -DPIC -o .libs/ldap.o ldap.c:56: error: 配列の型が不完全要素型を持っています ldap.c:72: error: 配列の型が不完全要素型を持っています make[3]: *** [ldap.lo] エラー 1 make[3]: ディレクトリ `/home/paraches/myTest/netatalk-2.2.0/libatalk/acl' から出ます make[2]: *** [all-recursive] エラー 1 make[2]: ディレクトリ `/home/paraches/myTest/netatalk-2.2.0/libatalk' から出ます make[1]: *** [all-recursive] エラー 1 make[1]: ディレクトリ `/home/paraches/myTest/netatalk-2.2.0' から出ます make: *** [all] エラー 2 [paraches@raphael netatalk-2.2.1]$
はい、エラー!
「配列の型が不完全要素型を持っています」って何?
とりあえず、ソースを見てみる。
struct ldap_pref ldap_prefs[] = {
{&ldap_server, "ldap_server", 0, 0, -1},
{&ldap_auth_method,"ldap_auth_method", 1, 1, -1},
{&ldap_auth_dn, "ldap_auth_dn", 0, 0, 0},
{&ldap_auth_pw, "ldap_auth_pw", 0, 0, 0},
{&ldap_userbase, "ldap_userbase", 0, 0, -1},
{&ldap_userscope, "ldap_userscope", 1 ,1, -1},
{&ldap_groupbase, "ldap_groupbase", 0, 0, -1},
{&ldap_groupscope, "ldap_groupscope", 1 ,1, -1},
{&ldap_uuid_attr, "ldap_uuid_attr", 0, 0, -1},
{&ldap_name_attr, "ldap_name_attr", 0, 0, -1},
{&ldap_group_attr, "ldap_group_attr", 0, 0, -1},
{&ldap_uid_attr, "ldap_uid_attr", 0, 0, 0},
{NULL, NULL, 0, 0, -1}
};
struct pref_array prefs_array[] = {
{"ldap_auth_method", "none", LDAP_AUTH_NONE},
{"ldap_auth_method", "simple", LDAP_AUTH_SIMPLE},
{"ldap_auth_method", "sasl", LDAP_AUTH_SASL},
{"ldap_userscope", "base", LDAP_SCOPE_BASE},
{"ldap_userscope", "one", LDAP_SCOPE_ONELEVEL},
{"ldap_userscope", "sub", LDAP_SCOPE_SUBTREE},
{"ldap_groupscope", "base", LDAP_SCOPE_BASE},
{"ldap_groupscope", "one", LDAP_SCOPE_ONELEVEL},
{"ldap_groupscope", "sub", LDAP_SCOPE_SUBTREE},
{NULL, NULL, 0}
};
ダメ! 不完全要素型ってなに???
ググっても「要素の数が決まってないとダメなのかな〜?」程度にしか理解できない…。
もちろん、配列の要素数を 13 と 10 にしてやってみてもダメ!
どうしたもんだろう?と思って色々とググっていたら、こんなページを見つけた!
configure の結果のところで、ACL Support が no だと同じエラーが出るらしい。(英語だと「array type has incomplete element type」みたい。こっちで調べたらサックリ情報が見つかったかも…)
で、ACL Support を yes にするには、libacl1-dev をインストールしろと。
これは Ubuntu の話で、CentOS だと libacl-devel になる。
早速インストール。
[paraches@raphael netatalk-2.2.1]$ sudo yum install libacl-devel <省略> Installed: libacl-devel.i386 0:2.2.39-6.el5 libacl-devel.x86_64 0:2.2.39-6.el5 Dependency Installed: libattr-devel.x86_64 0:2.4.32-1.1 Complete! [paraches@raphael netatalk-2.2.1]$
これでいけるはず。
configure をやり直してみる。
[paraches@raphael netatalk-2.2.1]$ ./configure --enable-redhat-sysv --with-bdb=/usr/local/BerkeleyDB.5.1/
<省略>
Using libraries:
LIBS = -lpthread -L$(top_srcdir)/libatalk
CFLAGS = -I$(top_srcdir)/include -D_U_="__attribute__((unused))" -g -O2 -I$(top_srcdir)/sys
SSL:
LIBS = -L/usr/lib64 -lcrypto
CFLAGS = -I/usr/include/openssl
LIBGCRYPT:
LIBS = -lgcrypt -ldl -lgpg-error
CFLAGS =
BDB:
LIBS = -L/usr/local/BerkeleyDB.5.1//lib -ldb-5.1
CFLAGS = -I/usr/local/BerkeleyDB.5.1//include/
Configure summary:
Install style:
redhat-sysv
AFP:
Large file support (>2GB) for AFP3: yes
Extended Attributes: ad | sys
CNID:
backends: dbd last tdb
UAMS:
DHX ( SHADOW)
DHX2 ( SHADOW)
RANDNUM ( SHADOW)
passwd ( SHADOW)
guest
Options:
DDP (AppleTalk) support: no
SLP support: no
Zeroconf support: yes
tcp wrapper support: yes
quota support: yes
admin group support: yes
valid shell check: yes
cracklib support: no
dropbox kludge: no
force volume uid/gid: no
ACL support: yes
LDAP support: yes
[paraches@raphael netatalk-2.2.1]$ make clean
ACL support が yes になったので、make clean して再度 make してみる。
[paraches@raphael netatalk-2.2.1]$ make clean [paraches@raphael netatalk-2.2.1]$ make [paraches@raphael netatalk-2.2.1]$
エラー出なかった!
後は make install でインストール。
[paraches@raphael netatalk-2.2.1]$ sudo make install [paraches@raphael netatalk-2.2.1]$
さっくりインストール終了!
設定は前に netatalk 2.2.0 をインストールした時と同じで。


LDAP Support:YesなのにACL Support:Noの場合は、
configure scriptが警告を出して止まるようにすべきということか?
もうちょっと調べてみてわかったのは
「ldap.c の中で HAVE_LDAP が true の時、<atalk/ldapconfig.h> を読み込んでその中で ldap_pref の定義がされるのだけど、<atalk/ldapconfig.h> の中で HAVE_ACLS が true でない場合は結局 ldap_pref の定義がされない」という事です。
configure で ACL Support が必要だとメッセージが出ると親切だと思います。
再び問題提起しておきました。
http://sourceforge.net/mailarchive/message.php?msg_id=28087872
http://netatalk.git.sourceforge.net/git/gitweb.cgi?p=netatalk/netatalk;a=blobdiff;f=include/atalk/ldapconfig.h;h=5a5b657061ff467c5a52c8b0d819927588460243;hp=70f9f628c7c61c0c0fe7018b91bfceb884865f43;hb=04bb047d46a87e09a3e5e95ddc3e093c019c4bd8;hpb=cbc8c6f7a5de52fc01395241ef1faaac96c8bca3
あっという間に修正されるものなんですね。
驚きました。
ありがとうございました。