Androidを載せたbeagleboard-xmをTimeMachine用のNASにするまで(其の壱)
WiFi APとしての機能はほぼ実現できたので、次はNASとして使えるようにしてみる。
ただのNASではつまらないのでOS XのTimeMachine機能でつかるNASにすることを目的する。
どうもLionからはSambaベースNASがTimeMachimeで使えなくなったらしいので、AFPサーバを入れる必要がある。netatalkというオープンソースをポーティングしてみる。
まずはnetatalkが依存するライブラリがいくつかあるのでそれから。
- avahi
- Berkeley DB
Berkeley DB
下記のページを参考にビルドしてみた。バージョンはdb-5.3.15.NC。
http://occasional-coding.com/cross-compiling-berkeley-db-for-android
ただ、android-ndkのコンパイラだといろいろ足りなくてビルドに失敗するので、busyboxをビルドしたときと同じようにcodesourceryからもってきたarm-none-linux-gnueabiのコンパイラを使ってstaticにビルドすることにした。
下記のようにconfigureした後でmake。ポイントはLDFLAGSに-staticを指定してstatic linkにすることと--with-sysrootでtoolchainのcライブラリへのパスを通しておくこと。
export PATH=<arm-none-linux-gnueabiへのパス>:$PATH cd buid_unix ../dist/configure --host=arm-none-linux-gnueabi CC=arm-none-linux-gnueabi-gcc LDFLAGS="-static" --with-sysroot=/android/toolchain/arm/arm-none-linux-gnueabi/libc/ --enable-smallbuild --enable-sql --enable-sql_compat --enable-statistics --enable-amalgamation make
ビルドできた後はとりあえずBerkeley DB単体でちゃんと使えるようになったかを試すためにサンプルプログラムをビルドしてbeagleboard-xm上で動作確認した。サンプルコードは下記のサイトから拝借した。
http://mannequeen.net/portal/mirror/DEFAULT-Sample-/takusato.net/article/bdb_oboegaki.html
$arm-none-linux-gnueabi-gcc -I../build_unix -L../build_unix -o c_create_database c_create_database.c -ldb -lpthread -static -v $file c_create_database c_create_database: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.14, not stripped $ldd c_create_database not a dynamic executable
avahi
avahiはAppleのboujourのオープンソース実装。boujourはAppleのゼロコンフィギュレーション技術の実装。
いつもMacBookAirやiMacを使っている時にお世話になっているプロトコルだと思うが、積極的に使ってみたことはなかった。ポーティングの前にとりあえずPC(Ubuntu)上でいろいろ試してみる。
PC上での動作確認
Ubuntuではデフォルトでavahiがインストールされているらしい。
psでみるとavahi-daemonなるプロセスが動いていることが分かる。
$ ps alx | grep avahi 5 104 778 1 20 0 3036 1400 poll_s S ? 0:00 avahi-daemon: running [lynx.local] 1 104 779 778 20 0 2928 244 unix_s Ss ? 0:00 avahi-daemon: chroot helper
avahi-browseコマンドでLAN内の端末とサービスを検索できる。※名前の部分は適当に変えてます。
$ avahi-browse -av Server version: avahi 0.6.25; Host name: lynx.local E Ifce Prot 名前 タイプ Domain + eth0 IPv4 <iPhone> _apple-mobdev._tcp local + eth0 IPv4 <XXXXX> iPod Touch Music Library local + eth0 IPv4 <XXXXX> iTunes Remote Control local + eth0 IPv4 <XXXXX> iTunes Audio Access local + eth0 IPv4 <iMac> _atc._tcp local + eth0 IPv4 <iMac> VNC Remote Access local + eth0 IPv4 <WiFiAP> Apple AirPort local + eth0 IPv4 <XXXXX> _acp-sync._tcp local + eth0 IPv4 <XXXXX> _sleep-proxy._udp local + eth0 IPv4 <Ubuntu> Workstation local + eth0 IPv4 <iMac> Apple File Sharing local + eth0 IPv4 <MBA> Apple File Sharing local
さらに-rオプションをつけるとIPやポートを確認できる。下記はiPhoneをWiFi接続しているとみえるサービス。
avahi-browse -r _apple-mobdev._tcp -t + eth0 IPv4 XX:XX:XX:XX:XX:XX@XXXX::XXXX:XXXX:XXXX:XXXX _apple-mobdev._tcp local = eth0 IPv4 XX:XX:XX:XX:XX:XX@XXXX::XXXX:XXXX:XXXX:XXXX _apple-mobdev._tcp local hostname = [XXXXX-no-iPhone.local] address = [192.168.1.20] port = [62078] txt = []
avahi-daemonの設定ファイルをかえてローカルで起動しているサービスの定義を増やしてみる。
$ cat /etc/avahi/services/http.service <?xml version="1.0" standalone='no' ?> <!DOCTYPE service-group SYSTEM "avahi-service.dtd"> <service-group> <name replace-wildcards="yes">%h</name> <service> <type>_http._tcp</type> <port>80</port> </service> </service-group>
確かに検索結果にサービスが増えていた。
$ avahi-browse -av Server version: avahi 0.6.25; Host name: lynx.local E Ifce Prot 名前 タイプ Domain + eth0 IPv4 <iPhone> _apple-mobdev._tcp local + eth0 IPv4 <XXXXX> iPod Touch Music Library local + eth0 IPv4 <XXXXX> iTunes Remote Control local + eth0 IPv4 <XXXXX> iTunes Audio Access local + eth0 IPv4 <iMac> _atc._tcp local + eth0 IPv4 <iMac> VNC Remote Access local + eth0 IPv4 <WiFiAP> Apple AirPort local + eth0 IPv4 <XXXXX> _acp-sync._tcp local + eth0 IPv4 <XXXXX> _sleep-proxy._udp local + eth0 IPv4 <Ubuntu> Workstation local + eth0 IPv4 <iMac> Apple File Sharing local + eth0 IPv4 <MBA> Apple File Sharing local + eth0 IPv4 <MBA> Apple File Sharing local + eth0 IPv4 <Ubuntu> Web Site local
だいたいの動作が分かったのでポーティングしてみる。
Time Machine用ファイル共有サービスの通知が目的なので最低限avahi-daemonが動けばいいはず。