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
やりたかったこと
- 24時間稼働
- 外出先(PC,android携帯)からライブカメラの動画にアクセス(水槽で飼っているウーパールーパーの様子を見たい!)
- 無線LANで家庭内LANに接続(線はAC電源のみ)
- ダイナミックDNS
- uPnPでポート開放(ルータの設定はuPnPを有効にするだけ)
固定IPなのでダイナミックDNSは本来は不要ですが、サーバ一式を別の場所
(例えば実家)に持っていって、ルータに有線LANで接続すれば設定変更せず
にそのまま使えるものを目指しました。ポート開放にルータの設定ではなく
uPnPを使ったのも同じ理由です。
HW
全体像
サーバ,SD,USB hub,Wifi adapter
カメラ
- Server: SheevaPlug
- SD: SILICON POWER micro SDHC 4GB (class 10)
- Camera: Logicool qcam-200sx
- Wifi Adapter: BUFFALO WLI-UC-GNM
- USB 2.0 hub
- 電源スイッチ: ダイソーで315円で売ってたヤツ
カメラはUVC対応のものであれば何でも良いと思います。
Wifi Adapterは標準linuxカーネルで認識されるものが望ましいです。
電源スイッチはあると便利です。
SW
- linux: Ubuntu 9.04 + kernel 3.0.4
- stream: mjpg-streamer
- uPnP: miniupnp
- dyndns: ddclient
Service
設定レシピ
母艦の準備
母艦の役割は下記です。
- tftpserver(u-bootの置換のため)
- SDカードのパーティション設定、ファイルシステム作成、ファイルコピー
- コンソール接続(usbserial経由)
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