into the void

ソフトウェアに関する雑多な調査日記

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やポートを確認できる。下記はiPhoneWiFi接続しているとみえるサービス。

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が動けばいいはず。