アーカイブ
BeagleBoard上でmoxaを開発する
Ubuntu 9.04をインストールしたBeagle Boardの上でtalkticのコンパイルとmoxaへ書き込みを行う。刺しっぱなしで開発できるようになるのでとても便利。
xtel technical information > download> ダウンロードから「開発用エクリプスパッケージ for Mac」をダウンロードしてくる。
xtel-eclipseの中の
- jsc/jsc.jar
talkticコンパイラ - avrdude/bin/avrdude
avrdude実行ファイル。mac portsでインストールできるavrdudeだと書き込みが怪しい。
Ubuntu9.04のaptでインストールできるavrdudeは普通に動くのでこれは必要ない。 - avrdude/etc/avrdude.conf
avrdudeの設定ファイル
■talkticのコンパイル
javaをインストールする
sudo apt-get install default-jre
which java
コンパイル。source.jsからsource.binを作る
java -jar path/to/jsc.jar -Bsource.bin source.jsmacでも同じようにバイナリを作れる。
■moxaへの書き込み
avrdudeをインストールしておく。Macはeclipseについてるavrdudeを使う。
sudo apt-get install avrdude
which avrdude
BeagleBoardではUSBデバイス名を書き込んであっても /dev/ttyUSB0 になってしまい、しかもrootしかアクセスできないのでsudoを使って書き込む。
sudo avrdude -C path/to/avrdude.conf -p m128 -c stk500v1 -b 9600 -P /dev/ttyUSB0 -F -U eeprom:w:source.bin:r
Macだとsudoが必要なくて、デバイス名が認識されてるのでこうなる。
avrdude -C path/to/avrdude.conf -p m128 -c stk500v1 -b 9600 -P /dev/tty.usbserial-gemsbok -F -U eeprom:w:source.bin:r
こんな風に書き込んだりプログラム書いたりしてる


Beagle Board rev.BにUbuntu9.04 ARM版をインストール
既に9.04を動かしてたんだけど、Arduinoにつないだセンサーの値をずっと読ませていたらkernel panicになってブート不能になっていたので再インストールした。大量のセクタエラーが出ていたので、SDカードに何度も書き込みすぎて壊れた気がする。
前回のインストール方法はメモを取っておいたんだけど、公開されていたrootfsが削除されていてインストール方法も変わっていたのでメモしなおしておく。
同じ9.04なのにUSBシリアル変換チップのFT232RLやemobileや、300GBのUSB外付けHDDが接続できた。ファームウェアをアップデートしたからか、Ubuntuのせいかは不明。
USBメモリとemobileを接続して動いているところ

WiFiとmoxaとUSBメモリ

手順
- Beagle Boardのファームウェアをアップデート
- SDカードにパーティションを切る
- Ubuntu9.04 ARM版のrootfsを作る
- uImageを作る
- boot.scrを作る
- UbuntuをSDカードに書き込む
- 起動する
- emobileやWiFi、Arduino、USB外付けHDDとかを接続してみる
■Beagle Boardの起動手順おさらい
まずボード自体のファームウェアがあって、専用シリアルケーブルで接続して設定できる。ファームウェアはSDカードにu-boot.binという名前にして入れておくとアップデートできる。色々改善されてるみたいなので今回は最初にアップデートしておいた。
起動は、まずボードのファームウェア→第1パーティションのboot.scr→第1パーティションのuImage→第2パーティションのLinux OS
の順で行われる。
uImageはOS毎に違う物を使う。第2パーティションのOSは自分でビルドして作る物で、rootfsとも呼ばれる。
つまりboot.scrとuImageとrootfsを用意して、SDカードに書き込まなければならない。
ARM用イメージをビルドするツールはLinuxでしか動かないのと、ファイルシステムの関係でここから先の作業は全てUbuntuデスクトップマシンで行った。でもVMWareのUbuntでも問題なくできる。
■Beagle Boardのファームウェアをアップデート
新しいSDカードを用意して、先頭に50MB程度のFAT32パーティションを切る。
SDカードのフォーマットはUbuntuのgpartedでやった。
http://elinux.org/BeagleBoardUbuntu#Upgrade_U-Bootに書いてあるとおりにやればいい
SDカードは/media/boot に自動的にマウントされた。
されなかったら
sudo mkdir /media/bootでマウントする。
sudo mount /dev/sdb1 /media/boot
アップグレード用のu-boot.binをSDカードの第1パーティションに置く。
wget http://rcn-ee.net/deb/tools/u-boot-beagleboard-2009.08+r37+gitr1590f84007e2b50ad346a482fff89195cb04ff4e-r37.bin
sudo mv u-boot-beagleboard-2009.08+r37+gitr1590f84007e2b50ad346a482fff89195cb04ff4e-r37.bin /media/boot/u-boot.bin
sudo umount /media/boot
Beagle Boardの基板上のシリアルポートピンに専用のケーブルで接続してから、電源を入れる。
WindowsならTeraterm、MacならZTerm、Linuxならminicomで接続するといい。
で、u-boot.binを読ませてファームをアップグレードするのだけど俺の使ってるのはrev.Bなので、命令名がwikiに掲載されているのとはちょっと違った。helpコマンドで出てくるのを参考にしてこう打ち込んだ
U-Bootのアップグレード – 橋本詳解より
mmcinit
fatload mmc 0:1 0x80300000 u-boot.bin
nand unlock
nand ecc sw
nand erase 80000 160000
nand write 0x80300000 80000 160000
nand erase 260000 20000
reset
■SDカードにパーティションを切る
Ubuntuマシンを持ってるので、gpartedでSDカードを3つのパーティションに分けた。4GBのSDカードを使った。あんまり怪しいメーカーのは使わない方がよさそう。
先頭から順に
- FAT32で100MB程度、名前はboot
- ext3で3GBちょっと、名前はubuntu
- swapで700MBぐらい
■Ubuntu9.04 ARM版のrootfsを作る
http://elinux.org/BeagleBoardUbuntuを参考にビルドする。
rootstockの最新版をダウンロードしてきて、rootstockのバイナリを手に入れる。
sudo apt-get install qemu
wget http://ports.ubuntu.com/pool/main/d/debootstrap/debootstrap_1.0.20~jaunty1_all.deb
sudo dpkg -i debootstrap_1.0.20~jaunty1_all.deb
wget http://launchpad.net/project-rootstock/trunk/0.1/+download/rootstock-0.1.3.tar.gz
tar -zxvf rootstock-0.1.3.tar.gz
cd rootstock-0.1.3
ARM用ubuntu9.04(jaunty)のビルド。4GBのSDカードに作った3GBのパーティションに入れるのでimagesizeで指定している。
sudo ./rootstock --fqdn beagleboard --login ubuntu --password ubuntu --imagesize 3G --seed gcc,make,linux-firmware,wireless-tools,usbutils --dist jaunty --serial ttyS2 --kernel-image http://rcn-ee.net/deb/kernel/beagle/jaunty/v2.6.29-58cf2f1-oer44.1/linux-image-2.6.29-oer44.1_1.0jaunty_armel.debデスクトップ環境が欲しければ、–seedにubuntu-desktopやxfce4を追加指定する。
それなりに時間がかかる。CPU2.7GHzの環境で2時間ぐらいかかった。
これでarmel-rootfs-[日付].tgzとvmlinuz-2.6.29-oer44.1できる。vmlinuz-*はuImageを作るのに使う。
■uImageを作る
vmlinuz-*からuImageを作る。
sudo apt-get install uboot-mkimageできた。
which mkimage
mkimage -A arm -O linux -T kernel -C none -a 0x80008000 -e 0x80008000 -n "Linux" -d ./vmlinuz-* ./uImage
■boot.scrを作る
ブートスクリプトを作る。
ubuntu.cmd というテキストファイルを作る
setenv bootcmd 'mmc init; fatload mmc 0:1 0x80300000 uImage; bootm 0x80300000'dvi:の所の解像度は自分の画面環境に合わせないと出ない。
setenv bootargs 'console=ttyS2,115200n8 console=tty0 root=/dev/mmcblk0p2 rootwait rootfstype=ext3 ro vram=12M omapfb.mode=dvi:1024x767MR-16@60'
boot
beagle boardのbootパーティションに書き込むバイナリ形式にする
mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "Ubuntu 9.04" -d ./ubuntu.cmd ./ubuntu.scr
■UbuntuをSDカードに書き込む
SDカードを刺したらマウントされると思うけど、手動マウントの場合
sudo mkdir /media/bootでマウント。
sudo mkidr /media/ubuntu
sudo mount /dev/sdb1 /media/boot
sudo mount /dev/sdb2 /media/ubuntu
uImage, ubuntu.scr, rootfsの3つを書き込む
sudo cp uImage /media/boot/
sudo cp ubuntu.scr /media/boot/boot.scr
sudo tar xfp armel-rootfs-*.tgz -C /media/ubuntu
最初からキーボードは認識するが、ネットワークに接続できないとemacsがインストールできないので、SDカード上でUbuntuの設定をいじっておく。
/media/ubuntu/etc/netowrk/interfaces を編集
auto loこれでUSBイーサネットアダプタが認識する。
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
/media/ubuntu/etc/fstab を編集。swapを有効にする
proc /proc proc defaults 0 0
/dev/mmcblk0p3 swap swap defaults 0 0
取り外す
cd /media/bootうちのSDカードリーダだと手動でsyncしないとなかなか書き込んでくれなかった
sync
cd /media
sudo umount /media/boot
cd /media/ubuntu
sync
cd /media
sudo umount /media/ubuntu
■起動する
USBにハブ経由でLANとキーボードを接続、HDMIで画面も起動、SDカードを入れてbeagle boardを起動する。
念のためにシリアルケーブルを接続しておいて見ておいた方がいい。カウントダウンを10秒待つか自分でbootって打ちこんでUbuntu9.04を起動させる。
rootstockでイメージ作った時に指定したusername,passwordでログインする。
パスワードを変更してsshdを起動すれば、あとは普通のLinuxとして使える。
■emobileやWiFi、Arduino、USB外付けHDDとかを接続してみる
USBデバイスがちゃんと認識するようになったのでいろいろできる。特にHDDかUSBメモリを付けてそっちに作業領域とswapを置くと、SDカードが壊れる事が少なくなってよいかもしれない。
Cでgearman workerを書いてRubyのclientから呼び出す
gearmandをソースからインストールして、Cライブラリのlibgearmanが使えるようになった。
これでC言語でworkerを作ってRubyのclientから呼び出せる。環境はUbuntu9.04とgearmand0.11
■Cでworkerを書く
str_reverseというアビリティを持つworkerを作る。
ほぼAPIドキュメントのままだが、jobの引数を受け取るのと、値を返せるようにがんばった。ジョブ失敗した時とかのエラー処理全然書いてない。たぶんenum gearman_return_tを返せばいいんだろうけど
strreverse-worker.c
// 文字列をreverseして返すworker
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <libgearman/gearman.h>
void *job_str_reverse(gearman_job_st *job, void *cb_arg, size_t *result_size,
gearman_return_t *ret_ptr)
{
char *str = (char *)gearman_job_workload(job);
int len = strlen(str);
printf("str:%s length:%d\n", str, len);
char reverse[len];
for(int i = 0; i < len; i++){
reverse[i] = str[len-i-1]; // 文字列を逆にする
}
char *result = strdup(reverse); // 結果の文字列はコピーしてポインタで返す
*result_size= gearman_job_workload_size(job);
*ret_ptr= GEARMAN_SUCCESS;
return result;
}
int main(int argc, char *argv[])
{
gearman_return_t ret;
gearman_worker_st worker;
gearman_worker_create(&worker);
gearman_worker_add_server(&worker, "127.0.0.1", 7003);
gearman_worker_add_function(&worker, "str_reverse", 0, job_str_reverse, NULL);
while(1) gearman_worker_work(&worker); // ジョブ登録したらループで待つ
gearman_worker_free(&worker);
return 0;
}
Makefile
# Linux用Makefilemakeするとstrreverse-workerができる。
SRC = strreverse-worker.c
DST = strreverse-worker
prefix=/usr/local
INCPATH=$(prefix)/include
LIBPATH=$(prefix)/lib
GEAR_LIBS=$(LIBPATH)/libgearman.a
all:
g++ -O $(SRC) -o $(DST) -I$(INCPATH)/libgearman -L. -L$(LIBPATH) $(GEAR_LIBS)
■Rubyでclientを書く
xing-gearman-serverを使うといい
client書く。実行時引数を一つずつstr_reverseに登録するclient。
strreverse-client.rb
#!/usr/bin/env ruby
require 'rubygems'
require 'gearman'
c = Gearman::Client.new(['localhost:7003'])
taskset = Gearman::TaskSet.new(c)
ARGV.each{|str|
puts "add task #{str}"
task = Gearman::Task.new('str_reverse', str)
task.on_complete{|result|
puts "return: #{str} => #{result}" # 文字列が逆になって返ってくる
}
taskset.add_task(task)
}
taskset.wait(100) # wait 100(sec)
■動かしてみる
worker動かす
./strreverse-worker
clientから3つ文字列登録
ruby strreverse-client.rb hello konitiwa asdfhujiko
すると文字列返ってくる
add task hello
add task konitiwa
return: hello => olleh
add task asdfhujiko
return: konitiwa => awitinok
return: asdfhujiko => okijuhfdsa
worker側の標準出力はこうなってた
str:hello length:5
str:konitiwa length:8
str:asdfhujiko length:10
workerを3つバックグラウンドで起動しておく
./strreverse-worker&
./strreverse-worker&
./strreverse-worker&
凄い勢いで処理されてるので非同期になってるのかよくわからない
ruby strreverse-client.rb hello konitiwa asdfhujiko aaiiaaiiaaii hogehogehogehoge mmmasdffajkl23rwdfv ahsdga9sd8uf9p8u nbjkasdoif98pu
add task hello
add task konitiwa
return: hello => olleh
add task asdfhujiko
return: konitiwa => awitinok
add task aaiiaaiiaaii
return: asdfhujiko => okijuhfdsa
add task hogehogehogehoge
return: aaiiaaiiaaii => iiaaiiaaiiaa
add task mmmasdffajkl23rwdfv
return: hogehogehogehoge => egohegohegohegoh
add task ahsdga9sd8uf9p8u
return: mmmasdffajkl23rwdfv => vfdwr32lkjaffdsammm
add task nbjkasdoif98pu
return: ahsdga9sd8uf9p8u => vfdu8p9fu8ds9agd
return: nbjkasdoif98pu => vfdu8up89fiods
Inspiron Mini9に外付けUSB RAID HDDをつけてファイルサーバー化した
Ubuntuが入ってるDellのInspiron Mini9を回収してきたので、IO DATAの外付けRAID HDDをつけてファイルサーバーにした。
もともとうちではGLANTANKを使ってたんだけど、部屋の掃除をしたら急にファンの音が気になるようになったので、もう3年以上使ってるし入れ替える事にした。
inspironは4GBのSSDでファンレス。外付けHDDもファンレスなのでとても静かになった。
売り上げランキング: 675

Cost-Efficient & Convenient!
結構いいww
順調です
ミラーでのフォーマットが時間がかかる
動画専門で使っています■ほしい機能
ただのNASではなく
- 音が静か
- RAID1でミラーリングしてデータが消えないようにしたい
- 家のdynamic dnsを更新
- 家の外からもe-mobileでsshでログインできたり、mercurialやgitのリポジトリを置ける
- rsyncで大学にある巨大なファイルをダウンロードさせておく作業を任せられる
- sambaでwindowsのファイル共有にも参加する
- 念のためモニタとキーボードも付いていて、ネットワークが壊れている時も操作しやすい
- Inspiron Mini9と外付けHDDどちらが壊れても迅速に入れ替え・復旧できる構成にしたい
- apacheとhgweb.cgiを動かしてmercurialのリポジトリビューアを置きたい
- 巨大ファイルのやりとりのためにapacheは動かしておきたい
■HDC2-U2.0の設定
まずRAID1に設定し直す。後でやると中身がフォーマットされるので。
パソコンに接続しないで、ACアダプタだけ刺す。
電源モードスイッチをONに切り替える。起動する。
裏にあるRAID SETUPボタンを3秒押し続けると電源LEDが点滅しはじめる。
前側のFUNCボタンを押す毎に電源LEDの色が変わる。
青:RAID0 ストライピング
紫:RAID1 ミラーリング
緑:マルチディスクモード
なので、紫にする。裏側のRAID SETUPボタンを押して設定終了。
パソコンに接続して容量が1TBに減っている事を確認。これでミラーリングモードになった
■HDC2-U2.0のフォーマット
inspiron mini9に接続して起動。
sudo apt-get install gpartedgpartedでHDDのパーティションをフォーマットする。ubuntuをインストールする時に出てくるツール。
which gparted
sudo gparted
全部ext3でフォーマットした。しばらく待つ。
■HDC2-U2.0をマウントする
マウントポイントを作っておく
mkdir /home/sho/ex
/dev/sdb1としてHDC2-U2.0が認識されていたので
/etc/fstab を編集
/dev/sda2 / ext3 defaults 0 0自分のホームディレクトリの下に置く。
proc /proc proc defaults 0 0
/dev/sdb1 /home/sho/ex ext3 defaults 0 0
マウントする
sudo mount -a
これで/home/sho/ex/ 以下はRAIDで守られる。
■sambaのインストールと設定
sudo apt-get install samba
/etc/samba/smb.conf を編集
[global]
workgroup = MSHOME
coding system = UTF-8
doc charset = cp932
unix charset = UTF-8
wins support = yes
[ex]
path = /home/sho/ex
comment = ex
browseable = yes
read only = no
create mask = 0755
directory mask = 0755
sambaからはHDC2-U2.0の中以外は見える必要が無いので、[homes]とかは ; で全部コメントアウトした。
samba再起動
sudo /etc/init.d/samba restart
■Dynamic DNSの更新
mydns.jpを使っているんだけど、ここはDiCEとかを使わなくてもBasic認証で更新できる。
crontab -e で設定追加
*/10 * * * * wget --spider http://mydns-username:password@www.mydns.jp/login.html10分おきに更新する。
■その他
あとはまあ普通のLinuxなので、mercurialとかgitとかapacheをインストールしておしまい。
SSDの容量を稼ぐために、Inspiron Mini9に入ってたゲームやGIMPやEvolutionメールやOpenOfficeを全部消した。
ML115 + Ubuntu9.10 64bit環境で音を出す
元サーバーマシンを、開発用のデスクトップマシンにした。
Windowsをインストールするとすんなりいくらしいんだけど、64bit版Ubuntuで音を出そうとすると大変だった。
PCIスロットが3.3V用で、5V用のサウンドカードだと切り欠きが合わなくて刺さらない。そして刺さっても64bitでのまともなサウンドドライバが無くて音がホワイトノイズだらけになる。
このUSBスピーカーを刺して他のサウンドデバイスを刺さないようにすれば音が出る。音質はたぶんそんなに良くないけど。
売り上げランキング: 798

ちょっと不便。
安いし簡単
値段以上の価値はあります
音は及第点(値段の割には)
価格以上の音質他にも、Creative Sound Blaster 5.1 VXを使うと音が全部ホワイトノイズになってしまうが、
alsamixer -Dpulseで音量をギリギリまで絞ると一応聞こえなくもなかった。
alsamixer -Dhw
参考:[ubuntu-jp:1749] Jaunty において Creative Sound Blaster 5.1 VX 上で再生する音声が全てホワイトノイズに
あとはAppleのMac用の小さいキーボードと、Microsoftの光学式マウスの安い奴を使ってる。



最近のコメント