素直にDebian化すれば良かったのですが、「ただのWeb ServerとPerl Scriptを1つ走らせるだけ」には大袈裟だろうと 考えたのが失敗だったという話です。「gcc3.4.4、glibc2.3.6等添付」とあれば、直にWeb Serverをbuildして、perl script 程度走らせられるだろう、と。
とはいえ、何処でつまづいたのかをメモしておく価値ぐらいはあるだろうと思い、このページを用意しました。
| lighttpd(1.4.20)を入れよう。 | → | pcre (Perl Compatible Regular Expressions; Perl 互換正規表現)が無い。 |
| pcreを入れよう。 | → | libstdc++が無い。 |
「gcc3.4.4と書かれていても、g++が入っていることは保証されてはない」ということでした。これは明らかな油断です。
ならば、gccをbuildするかとばかりに、gcc-4.1_4.1.1ds2.orig.tar.gz を拾って来て (debian の source package を利用 するのが早いかと、x86の debian linux上で apt-get source しています)、
# tar zxvf gcc-4.1_4.1.1ds2.orig.tar.gz # cd gcc-4.1-4.1.1ds2.orig # bzip2 -cd gcc-4.1.1-dfsg.tar.bz2 | tar xvf - # mkdir gcc-obj # cd gcc-obj # ../gcc-4.1.1/configure \ --prefix=/usr/local2 \ --enable-shared \ --target=arm-none-linux-gnueable \ --host=arm-none-linux-gnueabi \ --build=arm-none-linux-gnueabi \ --enable-languages=c,c++
そして、
# make
ところが、libstdc++ を build する段になって、"libgcc_s.so.1: version `GCC_3.5' not found"(*1) です。
# strings /usr/lib/libgcc_s.so | grep GCC_3.5 GCC_3.5 # strings gcc/libgcc_s.so | grep GCC_3.5 #
確かに libgcc_s.so に GCC_3.5 という symbol が存在しません。比較対象が gcc3.4.4 のlibgcc_s.soとはいえ、「正しくないlibgcc_s.soが出来上がってしまった」ということになります。
途中経過を省略して結論だけ書くと、
すなわち、
# awk --help BusyBox v1.1.1 (2006.11.29-02:37+00000) multi-call binary ...
こいつが原因です。試しに debian 上で awk を叩くと mawk (手元では mawk-1.3.3) が install されていることが分かります。
g++ さえ install できれば、pcre の build と lighttpd の build は難しくありません。普通に configure & make で終わります。念のために make test は通しておきましょう。
ここから先は完全な余談です。
GCC_3.5 は gcc/config/arm/libgcc-bpabi.ver の中に用意されています。これを利用しているのは、gcc/config/arm/t-bpabi です。
SHLIB_MAPFILES += $(srcdir)/config/arm/libgcc-bpabi.ver
この t-bpabi は gcc/config.gcc の中で arm*-*-linux-gnueabi が target である時に tmake_file に追加されます。(*2)
一方、SHLIB_MAPFILES は mklibgcc.in の中で、
${mapfile}: $SHLIB_MKMAP $SHLIB_MAPFILES
{ \$(NM_FOR_TARGET) $SHLIB_NM_FLAGS \$(objects); echo %%; \\
cat $SHLIB_MAPFILES \\
...
} | \$(AWK) -f $SHLIB_MKMAP $SHLIB_MKMAP_OPTS > ${tmpmapfile}
mv '$tmpmapfile' \$@
$libgcc_s_so: ${mapfile}
のように利用されています。ここの ${mapfile} とは gcc/libgcc/libgcc.map のことです。中を確認してみれば、GCC_3.4 などの項目はありますが、GCC_3.5 の項目はありません。
cat されている段階では存在するのですから、後は実際の mklibgcc の中から cut&paste で該当箇所を抜き出して動かしてみれば良いことになります。
すると、awk をかける直前までは、GCC_3.5 の項目が存在していることが分かります。また、同じ状況で x86 の debian linux で走らせると、GCC_3.5 の項目が libgcc.map に残ります。
すなわち、「BusyBox v1.1.1 の awk は、gcc を build するには不十分である」ということになります。
恐らくは、もともと install されていた gcc は cross 開発環境下で(まともな?)awkの下で build されたのでしょう。一方、cross 開発環境構築を省略できるとばかりに kurobox-pro 上の BusyBox 下で gcc を build すると…上のような状況に陥ります。
手元で適当に作成した "nifty の dynamic dns 更新 script" は、libwww-perl と libio-ssl-socket, libnet-ssleay-perl あたりに依存しています。
幸い OpenSSL は install されているようですから、このあたりの package の導入は簡単であろうと推測したのですが…。
「sslecho.log を見ましょう」
手元では、Random number generator not seeded!!! というメッセージが記録されています。
この場合には、prngd - Pseudo Random Number Generator Daemonをインストールしましょう。理由は、
"Random number generator not seeded!!!" (日本語訳:"乱数発生装置が種付けされていません!!!") この警告はrandomize()が/dev/random あるいは /dev/urandomを 読むことができなかったことをしめします。おそらくあなたのシステムが それらを持っていないか、別の名前になっているからでしょう。これでもSSLを 使うことは出来ます。しかし暗号化はあまり強力ではありません
引用元: http://perldoc.jp/docs/modules/Net_SSLeay.pm-1.20/SSLeay.pod
kurobox-pro の OpenSSL は /var/run/egd-pool を利用するように build されていますので、首尾よく prngd が install できたら、
# prngd /var/run/egd-pool
これで少なくとも sslecho.log に上記メッセージは出なくなる筈です。
/etc/protocols がありません、です。x86 の debian linux から copy しました。
きちんと DNS server に登録されていれば動作します。そうでない場合には、「/etc/nsswitch.conf がありません」です。
hosts: files dns
と記述して、/etc/hosts を参照するようにしました。
crontab はある(BusyBoxだけど)のですが、cronがありません。cron それ自身は build できるのですが、
# cron # ps | grep cron #
と上手く走りません。
# mkdir /etc/cron.d # mkdir /etc/cron.daily # mkdir /etc/cron.hourly # mkdir /etc/cron.monthly # mkdir /etc/cron.weekly # mkdir -p /var/spool/cron/crontabs # addgroup crontab # chgrp crontab /var/spool/cron/crontabs # chmod 1731 /var/spool/cron/crontabs
と、準備が必要でした。
http://www.nslabs.jp/clockspeed.rhtml を参考にして、clockspeed を入れました。(*3)
/etc/netinfo の中身、my_ipaddress, my_subnetmask, my_dgw を修正する、です。例えば、
# cat /etc/netinfo my_ipaddress=192.168.1.15 my_subnetmask=255.255.255.0 my_dgw=192.168.1.1
です。
が、ここで /etc/resolv.conf を用意するのを(私は)すっかり忘れていました。あわせて、/etc/resolv.conf に nameserver の設定を追加しましょう。例えば、
# cat /etc/resolv.conf nameserver 192.168.1.1
のような感じです。