2014年06月27日

Flucard Pro - Wi-Fi 機能搭載 SD カードを Linux サーバーとして楽しむ方法

Flucard Pro は 2011 年頃に発売された Wi-Fi (アクセスポイント兼クライアント)機能を搭載した SD カード。 カメラで撮影した写真を無線 LAN 経由でダウンロードや FTP アップロード出来るのが特徴なんですが、今日は値段も手頃になった Flucard Pro を Linux サーバーとしてより高度・便利に使うための Linux 基盤環境構築方法を考えてみますよ!

flucard pro

Flucard Pro の概要と特徴


Flucard Pro は無線 LAN 親機、子機両方の機能を持った SD カードでカメラで撮影した写真をスマートフォンや PC で気軽に閲覧、ダウンロード出来るのが特徴。

flucard_overview

スペックはこちら。 僕の購入した Flucard Pro 8G は Class6 と時代を感じさせる性能ですが実売 3500 円程度(Amazon)とお手頃な価格帯になっています(PENTAX から 16GB/Class10 版も発売されてるのですが、まだまだお高い・・・)。

名称 Flucard Pro 8GB
型番 FLUCARDPRO8GBCL6
販売元 Trek 2000 International LTD
容量 8GB
Class Class6 (読み書き時の転送速度 6 MByte/sec 以上)
無線LAN 親機(AP)及び子機機能。 最大転送速度: 65 Mbit/sec
ブザー機能 あり
CPU ARM926EJ-S rev 5 (v5l)
メモリ 26 MB
Linux カーネル 2.6.32.28


Wi-Fi 搭載系カードとしては Eye-Fi が有名ですが Flucard や CloudFlash には Linux サーバーとして自由にカスタマイズ出来るという利点があります。

発売された直後には組み込まれた Linux 上で PHP, Ruby (のサブセット)が動くぞっ!(詳しくは、とんすけさんのブログをどーぞ)、とちょっとした話題になりましたよね。 カメラを持たずサーバー用途として楽しむには小さ過ぎるフットプリントを警戒した当時の僕は

  〃∩ ∧_∧
  ⊂⌒(  ・ω・)  はいはい動く動く(でも本当は何も動かないんでしょ)
    `ヽ_っ⌒/⌒c
       ⌒ ⌒

と静観していたのですが、先日とある理由で CloudFlash を使わせてもらったところ感動、ブザー音を使うことも出来る Flucard で本格的に SD カード Linux デビューすることにしたのです(今なら一眼レフも持っていますしね!)。


Flucard Pro で Linux を楽しむ方法


Flucard, CloudFlash, PQI Air など Key ASIC社 システム・オン・チップ(SoC)を搭載した SD カードには autorun.sh という名前のシェル・スクリプトを保存しておくと組み込まれた Linux が起動する際に呼び出してくれる、という仕組みがあるのですが、これをうまく利用すれば Linux OS としても遊ぶことが出来ます。

今回もこの仕組みを利用してトリガーになる画像が SD カードに保存されていなければ(トリガー画像がカメラから削除されていれば)、ネットワークと SSH サーバーを有効化しつつ、ユーザーが作成したカスタム・スクリプトを自動実行してくれる Flucard Linux サーバーを作ってみます。

flucard_boot_flow

用意した実行ファイル一式はこちらからダウンロード可能。



この中にある APP フォルダと autorun.sh を Flucard にコピーし、wifi.conf, wpa.conf にネットワーク・アドレスと無線 LAN アクセス・ポイントへの接続情報を設定すれば Flucard Linux サーバーが動き出します。

FLUCARD_APP/
├── APP
│   ├── action
│   │   ├── _a01_buzzer.sh
│   │   └── _a01_remove_fire.sh
│   ├── bin
│   │   ├── busybox-armv5l
│   │   ├── dbclient
│   │   ├── dropbear
│   │   ├── dropbearkey
│   │   └── scp
│   ├── etc
│   │   ├── TREK9990.JPG
│   │   ├── dropbear
│   │   ├── init
│   │   │   ├── s01_dropbear.sh
│   │   │   ├── s02_network.sh
│   │   │   └── s03_stop_daemon.sh
│   │   └── network
│   │       ├── wifi.conf
│   │       └── wpa.conf
│   └── logs
└── autorun.sh


もう少し詳しい仕組みを説明しておきましょうか。 autorun.sh の中身はこんなふうになっています。

#!/bin/sh

SDCARD_HOME=/mnt/sd
APP_HOME=$SDCARD_HOME/APP
FIRE_IMAGE=$SDCARD_HOME/DCIM/123_TREK/TREK9990.JPG
export SDCARD_HOME APP_HOME FIRE_IMAGE

if [ -f $FIRE_IMAGE ]
then
  exit 0
else
  if [ ! -d ${FIRE_IMAGE%/*} ]
  then
    mkdir ${FIRE_IMAGE%/*}
  fi
  cp $SDCARD_HOME/APP/etc/${FIRE_IMAGE##*/} $FIRE_IMAGE || exit 1
fi

#########################################
#        Link external commands         #
#########################################
ln -s $APP_HOME/bin/* /usr/bin/


#########################################
#           Run init scripts            #
#########################################
ls $APP_HOME/etc/init/s*_*.sh | while read script
do
  chmod 777 $script
  $script > $APP_HOME/logs/${script##*/}.log 2>&1
  sleep 1
done

#########################################
#           Run user scripts            #
#########################################
ls $APP_HOME/action/a*_*.sh | while read action
do
  chmod 777 $action
  $action > $APP_HOME/logs/${action##*/}.log 2>&1
  sleep 1
done

sync

return 0


普段、僕達ユーザーがデータを保存している場所はカード上の Linux から見ると /mnt/sd という場所にマウントされているのですが、もし、この下に DCIM/123_TREK/TREK9990.JPG というパスでトリガー画像(TREK9990.JPG)が存在していれば何もせず終了し、逆に無ければこの場所に画像ファイルをコピーしつつ、Linux サーバーの起動処理が始まる仕掛けになっています。

起動処理に進むと、まず APP/bin 下にある実行ファイルへのリンクを Flucard 上の /usr/bin 下に作成していますが、ここでリンクしている busybox というプログラムはフットプリントの小さなデバイス向けに開発されている Linux プログラムの集合体(例えば ls, top, vi, telnetd)で引数に指定された名前に応じて該当するコマンドを実行してくれるユーティリティなのです。 dropbear も同じくフットプリントの小さなデバイス向けに開発されている SSH サーバー&クライアント。 busybox や dropbear は僕達が普段使っている Linux をベースとしたルーターやスマートフォンでもよく使わているんですよ。

プログラムを起動する準備が出来たら APP/etc/init の下にあり、s*_*.sh という名前のスクリプトをその名前順に実行していきます。

一番初めに実行される init スクリプトは s01_dropbear.sh。 SSH サーバーのホスト鍵を SD カード上に作成、/etc/dropbear としてリンク、最後に dropbear (sshd)本体を起動します(ログイン・ユーザ、パスワードの初期値は root, passwd。 変更する場合はこのファイルを編集)。

#!/bin/sh

SSHD_USER=root
SSHD_PASSWD=passwd
SSHD_PORT=22
SSHD_DSS_KEY=$APP_HOME/etc/dropbear/dropbear_dss_host_key
SSHD_RSA_KEY=$APP_HOME/etc/dropbear/dropbear_rsa_host_key

if [ ! -f $SSHD_DSS_KEY ]
then
  mkdir $APP_HOME/etc/dropbear
  dropbearkey -t dss -f $SSHD_DSS_KEY
  dropbearkey -t rsa -f $SSHD_RSA_KEY
fi

if [ -f $APP_HOME/bin/dbclient ]
then
  ln -s $APP_HOME/bin/dbclient /usr/bin/ssh
fi

ln -s $APP_HOME/etc/dropbear /etc/dropbear
mount -t devpts /dev/pts
dropbear -A -N $SSHD_USER -C $SSHD_PASSWD -U 0 -G 0 -p $SSHD_PORT


続いて呼び出されるのが s02_network.sh。 この中では無線 LAN アダプタを有効化し、 APP/etc/network/wifi.conf の内容に応じて設定されたネットワークへ接続を試みます。

#!/bin/sh

if [ ! -f $APP_HOME/etc/network/wifi.conf ]
then
  exit 0
else
  . $APP_HOME/etc/network/wifi.conf
fi

if [ "$ONBOOT" != "yes" ]
then
  exit 0
fi

# load driver
w1

# set this so that can connect to router at channel 13
iwpriv $DEVICE regioncode 0x41

uaputl bss_stop

ifconfig $DEVICE down

wpa_supplicant -i $DEVICE -B -c $APP_HOME/etc/network/$WPACONF

iwpriv $DEVICE htcapinfo 0x4020000

if [ "$BOOTPROTO" = "static" ]
then
  ifconfig $DEVICE $IPADDR netmask $NETMASK up
  route add default gw $GATEWAY
  echo "nameserver $DNS" > /etc/resolv.conf
else
  udhcpc -i $DEVICE -s /etc/dhcp.script
fi


固定アドレスを使うのならば、このスクリプトで参照している APP/etc/network/wifi.conf を編集し  BOOTPROTO を static として IPADDR, NETMASK, GATEWAY, DNS に各固定値を宣言しておきます(アドレスを自動取得する場合は BOOTPROTO 行を # コメントアウトしておけばOK)。

WPACONF=wpa.conf
ONBOOT=yes
DEVICE=mlan0
BOOTPROTO=static
IPADDR=192.168.1.1
NETMASK=255.255.255.0
GATEWAY=192.168.1.254
DNS=8.8.8.8


後もう一つ、APP/etc/network/wpa.conf には無線 LAN アクセス・ポイントの情報(SSID名、暗号化方式、パスフレーズ)を設定しておきましょう。

network={
        ssid="SSID"
        key_mgmt=WPA-PSK
        proto=WPA
        pairwise=TKIP
        group=TKIP
        #psk="password"
        psk=2f6a0beddf2f0588ee426b0c3a0e3d9a523bb07a05cb857f85d826da80fa75c4
}


ssid と psk だけを変更すれば殆どの Wi-Fi アクセス・ポイントに接続出来るはずです。 psk の値は wpa_passphrase コマンドを使うか、オンライン・サービス(http://www.wireshark.org/tools/wpa-psk.html)を使えば簡単に分かります。

最後に APP/action の下に a*_*.sh という命名規則に準じたファイルがあれば autorun.sh は順番に実行していきます。 例えば SD カード上に新しく撮影した動画ファイルがあればサーバーへコピーした後に ssh クライアントを使ってリモート・サーバー上のエンコード処理を走らせる、なんて自動化スクリプトを作ってみるのも楽しいかも。

さあ、APP フォルダと autorun.sh を カードにコピーして動作確認してみましょうか。 と、その前に僕の使っている Ubuntu はファイル・マネージャーが接続した USB ドライブを自動的にマウントして中身を参照してくれるのですが、これが原因でカード側 Linux から SD カード上のデータにアクセスすると競合が発生してカード全体が固まってしまいます。 よってこの設定を 「設定マネージャ」 > 「リムーバルドライブとメディア」から事前に解除(ホットプラグ時のマウント及び挿入時の参照を解除)しておくのが吉。

リムーバルドライブとメディア設定

※この問題は Mac OS でも発生します。

Flucard を差し込んで 10〜20秒程待つと設定したアドレスから応答があるはず。

[netbuffalo:~] $ ping 192.168.x.x
PING 192.168.x.x (192.168.x.x) 56(84) bytes of data.
64 bytes from 192.168.x.x: icmp_req=1 ttl=64 time=93.6 ms
64 bytes from 192.168.x.x: icmp_req=2 ttl=64 time=117 ms
64 bytes from 192.168.x.x: icmp_req=3 ttl=64 time=35.1 ms


ssh で接続してみると・・・、

$ ssh root@192.168.x.x
root@192.168.x.x's password:
#

お、ログイン成功。 用意しておいた busybox-armv5l を使えば一通りのコマンドが利用出来ます。 dropbear/dbclient (ssh) も使えるので Flucard から別の Linux へログインするだって可能。

# busybox-armv5l uname -a
Linux (none) 2.6.32.28 #3169 PREEMPT Sun Mar 25 03:31:06 UTC 2012 armv5tejl GNU/Linux
#
# ssh netbuffalo@Sputnik
Caution, skipping hostkey check for Sputnik
netbuffalo@Sputnik's password:
Welcome to Ubuntu 12.04.4 LTS (GNU/Linux 3.2.0-65-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

[netbuffalo@Sputnik:~] $


一度起動すると DCIM/123_TREK/TREK9990.JPG という画像が作成され、次回からは自動では起動しなくなります。 もし、カメラから起動を制御する場合はこの画像を削除してから再度電源を OFF/ON しましょう。

Fire image



Linux アプリケーションを Flucard 向けにクロス・コンパイルしたいと思ったら


もし、貴方がプログラムをコンパイルして Flucard 上で動かしたいと思ったら ARM 用のコンパイラを用意して PC 上でクロス・コンパイルする必要があります。 実は僕も dropbear をソースコードからコンパイルして Flucard 用のバイナリを作ったんですが、これを例にクロス・コンパイル方法をご紹介しておきますね。

まず、MentorGraphics 社が公開している ARM 用コンパイラを次の URL から入手します。 

http://sourcery.mentor.com/public/gnu_toolchain/arm-none-linux-gnueabi/


これを適当な場所に解凍・パスを通しておき、

ubuntu $ tar -xjvf arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
ubuntu $ export PATH=/path/to/arm-2014.05/bin:$PATH

LDFLAGS に -static (依存ライブラリも含めてビルド)を指定してソースコードを(ここでは dropbear)を  configure します。

dropbear-src $ ./configure LDFLAGS=-static CC=arm-none-linux-gnueabi-gcc
  --host=arm-none-linux-gnueabi --disable-zlib  --disable-largefile
  --disable-loginfunc --disable-shadow --disable-utmp --disable-utmpx
  --disable-wtmp --disable-wtmpx --disable-pututline --disable-pututxline
  --disable-lastlog --disable-syslog

※配布プログラムに含まれる dropbear では本家 dropbear-2013.58 にFlucard 用のパッチ(dropbear-2013-58-android.patch をベースにした Flucard 対応パッチ)を当てています。

これをビルドすれば ARM 上で動くプログラムが出来るのワケです。

dropbear-src $ make CC=arm-none-linux-gnueabi-gcc PROGRAMS="dropbear dropbearkey scp dbclient"


これから何して遊ぼうかなあ・・・。

Trek 2000 デジタルカメラ対応Wi-Fi機能付きSDカード 8GB Flucard8
プラネックス (2011-10-07)
売り上げランキング: 19,028


Posted by netbuffalo at 20:30│Comments(0)TrackBack(0)Linux | モバイルデバイス


この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/netbuffalo/4811269

コメントする

名前
URL
 
  絵文字