sheevaplugで省電力自宅ライブカメラサーバ

2011/10/29 最終更新 図を修正。省電力自宅ライブカメラサーバ製品ページを追加

ライブカメラの映像

ライブカメラの映像
運がよければ水槽の現在の様子を見ることができます。時間帯によっては消灯のため真っ黒なことがあります。 (2012/08/13停止中)

SheevaPlugとは

安価、小型、省電力のLinuxサーバです。

globalscaleのsheevaplug dev kitのページ
CPU: Marvell Kirkwood (88F6281) 1.2GHz
MEMORY: DDR2 SDRAM 512MB
DISK: NAND FLASH 512MB

やりたかったこと


固定IPなのでダイナミックDNSは本来は不要ですが、サーバ一式を別の場所 (例えば実家)に持っていって、ルータに有線LANで接続すれば設定変更せず にそのまま使えるものを目指しました。ポート開放にルータの設定ではなく uPnPを使ったのも同じ理由です。

HW


全体像

サーバ,SD,USB hub,Wifi adapter

カメラ
カメラはUVC対応のものであれば何でも良いと思います。 Wifi Adapterは標準linuxカーネルで認識されるものが望ましいです。 電源スイッチはあると便利です。

SW


Service


設定レシピ


母艦の準備

母艦の役割は下記です。 CentOS5がインストールされているx64マシンを母艦にしました。

SD boot可能なu-bootのダウンロードと展開

bokan# wget http://www.alpha.or.jp/wp-content/uploads/2009/08/u-boot-rd88f6281Sheevaplug_400db_nand.bin.gz
bokan# gunzip -c u-boot-rd88f6281Sheevaplug_400db_nand.bin.gz > /tftpboot/u-boot-sd.bin

SDのパーティション設定

母艦にSDカードを接続。以下、母艦にSDカードが/dev/sdfとして認識されたとして記述。
bokan# fdisk /dev/sdf
(パーティションを作成)

bokan# fdisk -l /dev/sdf

Disk /dev/sdf: 4012 MB, 4012900352 bytes
120 heads, 55 sectors/track, 1187 cylinders
Units = cylinders of 6600 * 512 = 3379200 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdf1               1         153      504872+  83  Linux
/dev/sdf2             154         306      504900   82  Linux swap / Solaris
/dev/sdf3             307        1187     2907300   83  Linux

bokan# mkfs.ext3 /dev/sdf1
bokan# mkfs.ext3 /dev/sdf3
bokan# mkswap /dev/sdf2

SDへのkernel, rootファイルシステムのコピー


bokan# mkdir /tmp/sheeva
bokan# cd /tmp/sheeva
bokan# wget http://www.plugcomputer.org/405/us/plug-basic/kernel/Plug_LSP1.2.zip
bokan# wget http://www.plugcomputer.org/405/us/plug-basic/distributions/ubuntu-9.0.5.Release.jffs2

bokan# unzip Plug_LSP1.2.zip

bokan# /sbin/modprobe jffs2
bokan# /sbin/modprobe mtdblock
bokan# /sbin/losetup /dev/loop5 ./ubuntu-9.0.5.Release.jffs2
bokan# /sbin/modprobe block2mtd block2mtd=/dev/loop5,131072
bokan# mount -t jffs2 -o ro /dev/mtdblock0 /mnt/tmp

bokan# mount /dev/sdf3 /mnt/tmp2
bokan# cd /mnt/tmp
bokan# cp -a * /mnt/tmp2
bokan# vi /mnt/tmp2/etc/fstab
  #rootfs / rootfs rw 0 0
  /dev/mmcblk0p1 /boot ext3 rw 0 0
  /dev/mmcblk0p3 / ext3 rw 0 0
  /dev/mmcblk0p2 swap swap defaults 0 0
bokan# umount /mnt/tmp2
bokan# mount /dev/sdf1 /mnt/tmp2
bokan# cp -a boot/* /mnt/tmp2
bokan# cp /tmp/sheeva/SheevaPlug_LSP/LSP\ -\ Image/uImage.sheeva.040309 /mnt/tmp2
bokan# cd /mnt/tmp2
bokan# ln -s uImage.sheeva.040309 uImage
bokan# cd /
bokan# umount /mnt/tmp2

USB serialの接続

母艦のUSBとsheevaplugのJTAGを付属のUSBケーブルで接続。電源はまだ入れない。
bokan# modprobe usbserial
bokan# modprobe ftdi_sio vendor=0x9e88 product=0x9e8f
sheevaplugの電源を投入。
bokan# cu -s 115200 -l /dev/ttyUSB1
"Hit any key to stop autoboot: "と表示されるところで何かキー入力しu-bootのプロンプトで止める。

sd boot

SDカードから起動するようにu-bootをSDカード起動可能なものに置き換えた上で環境変数を設定する。

u-bootの置き換え

以下の例では母艦のIPアドレスを192.168.0.2,sheevaplugのIPアドレスを192.168.0.101にしています。環境に応じて書き換えてください。
Marvell>> set ipaddr 192.168.0.101
Marvell>> set serverip 192.168.0.2
Marvell>> set netmask 255.255.255.0
Marvell>> bubt u-boot-sd.bin
  Override Env parameters? (y/n) n
Marvell>> reset

SD bootの設定

更新したu-bootで下記を設定します。
Marvell>> setenv bootargs_org $(bootargs)
Marvell>> setenv bootcmd_org $(bootcmd)
Marvell>> setenv bootargs 'console=ttyS0,115200 mtdparts=orion_nand:0x400000@0x100000(uImage),0x1fb00000@0x500000(rootfs) rw root=/dev/mmcblk0p3 rootfstype=ext3 rootdelay=3'
Marvell>> setenv bootcmd 'mmcinit; ext2load mmc 0:1 0x800000 /uImage; bootm 0x800000'
Marvell>> saveenv
Marvell>> reset

時刻合わせ (option)

数字は現時刻に会わせてください。この作業は省略可能です。ここで省略しても後でLinuxで時刻合わせしてそれをhwclockに書き戻すように設定します。
Marvell>> date
Marvell>> date 091315532011
Date: 2011-09-13 (Tuesday)    Time: 15:53:00

Linuxが起動するか確認

"Hit any key to stop autoboot: "
と表示されるところで何も操作しないとLinuxがbootしてLogin:プロンプトが出るところまで進むことを確認。

Linuxの設定

rootでログインして下記の設定を行います。 下記のページをいろいろ参考にしています。
http://mizupc8.bio.mie-u.ac.jp/pukiwiki/index.php?SheevaPlug%2FNAND_Flash#l941ed36

rootのpasswordの変更

passwdコマンドでrootのパスワードを変更します。

DHCP client

/etc/dhcp3/dhclient.confを編集し以下の行をコメントアウト。
supersede domain-name-servers 127.0.0.1;

timezone

root# dpkg-reconfigure tzdata
メニューからasia->tokyoを選択する。

rc.local

/etc/rc.localを編集し以下の行をコメントアウト
insmod /boot/fat.ko
insmod /boot/vfat.ko
/root/discoverd
cd /
date 012618002009
hwclock -w
ここで一旦リブート

時刻合わせ

root# ntpdate -b ntp.nict.jp
root# hwclock -w

hosts

/etc/hostsを編集し以下の行をコメントアウト
91.189.88.36 ports.ubuntu.com

apt

/etc/apt/sources.listを編集し以下の行をコメントアウト
deb http://ports.ubuntu.com jaunty main restricted universe multiverse
以下の行を追加
deb http://old-releases.ubuntu.com/ubuntu jaunty main universe multiverse restricted

kernelの置き換え

wgetのインストール

root# apt-get update
root# apt-get install wget

kernel 3.0.4 のインストール

root# cd /root
root# mkdir kernel
root# cd kernel
root# wget http://sheeva.with-linux.com/sheeva/README-PLUG-UPDATE.sh
root# bash README-PLUG-UPDATE.sh 3.0.4 --rootkernel
root# cd /boot
root# rm uImage
root# ln -s sheeva-3.0.4-uImage uImage
root# reboot

u-bootの設定変更

Marvell>> setenv mainlineLinux yes
Marvell>> setenv arcNumber 2097
Marvell>> saveenv
Marvell>> reset

開発ツールのインストール

root# apt-get install gcc build-essential
root# apt-get install subversion

mjpg-streamer

root# mkdir -p /proj/linux/ubuntu/mjpg-streamer
root# cd /proj/linux/ubuntu/
root# svn co https://mjpg-streamer.svn.sourceforge.net/svnroot/mjpg-streamer
root# cd mjpg-streamer/mjpg-streamer
root# apt-get install libjpeg-progs libjpeg62 libjpeg62-dev
root# make
root# /proj/linux/ubuntu/mjpg-streamer/mjpg-streamer/mjpg_streamer -b --input "/proj/linux/ubuntu/mjpg-streamer/mjpg-streamer/input_uvc.so --device /dev/video0 --fps 5 --resolution 320x240 -y" --output "/proj/linux/ubuntu/mjpg-streamer/mjpg-streamer/output_http.so --www /proj/linux/ubuntu/mjpg-streamer/mjpg-streamer/www/"
/etc/rc.localを編集し以下を追加
if [ -e /dev/video0 ] ; then
    /proj/linux/ubuntu/mjpg-streamer/mjpg-streamer/mjpg_streamer -b --input "/proj/linux/ubuntu/mjpg-streamer/mjpg-streamer/input_uvc.so --device /dev/video0 --fps 5 --resolution 320x240 -y" --output "/proj/linux/ubuntu/mjpg-streamer/mjpg-streamer/output_http.so --www /proj/linux/ubuntu/mjpg-streamer/mjpg-streamer/www/"
fi

miniupnp

root# mkdir /proj/linux/ubuntu/miniupnp
root# wget http://miniupnp.free.fr/files/download.php?file=miniupnpc-1.6.tar.gz
root# tar xvfz miniupnpc-1.6.tar.gz
root# cd miniupnpc-1.6
root# make
root# make -n install
        install -d /usr/include/miniupnpc
        install -m 644 miniupnpc.h miniwget.h upnpcommands.h igd_desc_parse.h upnpreplyparse.h upnperrors.h miniupnpctypes.h portlistingparse.h declspec.h /usr/include/miniupnpc
        install -d /usr/lib
        install -m 644 libminiupnpc.a /usr/lib
        install -m 644 libminiupnpc.so /usr/lib/libminiupnpc.so.8
        ln -fs libminiupnpc.so.8 /usr/lib/libminiupnpc.so
        install -d /usr/bin
        install -m 755 upnpc-shared /usr/bin/upnpc
        install -m 755 external-ip.sh /usr/bin/external-ip
root# make install
/etc/rc.localを編集し以下を追加
    upnpc -r 8080 tcp
/etc/cron.hourly/upnpcを作成
#!/bin/sh
/usr/bin/upnpc  -r 8080 tcp
実行権を付与
root# chmod +x /etc/cron.hourly/upnpc
手動実行
root# /usr/bin/upnpc  -r 8080 tcp
http://(外部向けIPアドレス):8080に外部からアクセスして確認する。

sysv-rc-conf

root# apt-get sysv-rc-conf

ddclient

事前にdyndnsにサインアップしlogin,password,ドメイン名を決定しておくこと。
root# apt-get install ddclient
/etc/ddclient.confを編集 login, password, 最後のドメイン名は適宜置き換えること。
# Configuration file for ddclient generated by debconf
#
# /etc/ddclient.conf

daemon=300                              # check every 300 seconds
syslog=yes                              # log update msgs to syslog
mail=                                   # mail all msgs to root
mail-failure=                           # mail failed update msgs to root
pid=/var/run/ddclient.pid               # record PID in file.
ssl=yes                                 # use ssl-support.  Works with
                                        # ssl-library

use=web

protocol=dyndns2                               # default protocol
server=members.dyndns.org                      # default server

login=*******                               # default login
password=****                               # default password
mx=mx.for.your.host                            # default MX
backupmx=no                                # host is primary MX?
wildcard=no                                # add wildcard CNAME?


##
## dyndns.org dynamic addresses
##
## (supports variables: wildcard,mx,backupmx)
##
server=members.dyndns.org,            \
protocol=dyndns2                      \
uri.dyndns.org
/etc/default/ddclientを編集
 run_daemon="true"
root# sysv-rc-conf ddclient on

wlan

下記を参考にしました。 http://ubuntuforums.org/showthread.php?t=263136
http://royalwin.blog.so-net.ne.jp/2009-02-01-1
wpa_passphaseで設定するwpaのパスフレーズは適宜置き換えること
root# apt-get install wpasupplicant
root# apt-get install psmisc
root# apt-get install linux-firmware 
root# wpa_passphrase PRIVATE_URI_2 XXXXXXXXX
/etc/wpa_supplicant.confを編集
ssidは適宜書き換えること
pskはwpa_passphraseの結果をコピペすること。
ctrl_interface=/var/run/wpa_supplicant

network={
        ssid="PRIVATE_URI_2"
        #psk="6CXXXXXXXXXXX"
        psk=bde27e0045e4ab6a7b30d34b127ddef105c689e9a8471a1d50b2ad2bffa99a25
        scan_ssid=1
        proto=WPA RSN
        key_mgmt=WPA-PSK
        pairwise=CCMP TKIP
        group=CCMP TKIP
}

/etc/network/interfacesを編集
auto wlan0
iface wlan0 inet dhcp
wireless-essid PRIVATE_URI_2
pre-up wpa_supplicant -B -Dwext -iwlan0 -c/etc/wpa_supplicant.conf
post-down killall -q wpa_supplicant