既に9.04を動かしてたんだけど、Arduinoにつないだセンサーの値をずっと読ませていたらkernel panicになってブート不能になっていたので再インストールした。大量のセクタエラーが出ていたので、SDカードに何度も書き込みすぎて壊れた気がする。

前回のインストール方法はメモを取っておいたんだけど、公開されていたrootfsが削除されていてインストール方法も変わっていたのでメモしなおしておく。
同じ9.04なのにUSBシリアル変換チップのFT232RLやemobileや、300GBのUSB外付けHDDが接続できた。ファームウェアをアップデートしたからか、Ubuntuのせいかは不明。

USBメモリとemobileを接続して動いているところ
beagleboard + emobile

WiFiとmoxaとUSBメモリ
USBメモリ、WiFi、moxaを接続

手順

  1. Beagle Boardのファームウェアをアップデート
  2. SDカードにパーティションを切る
  3. Ubuntu9.04 ARM版のrootfsを作る
  4. uImageを作る
  5. boot.scrを作る
  6. UbuntuをSDカードに書き込む
  7. 起動する
  8. 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'
setenv bootargs 'console=ttyS2,115200n8 console=tty0 root=/dev/mmcblk0p2 rootwait rootfstype=ext3 ro vram=12M omapfb.mode=dvi:1024x767MR-16@60'
boot
dvi:の所の解像度は自分の画面環境に合わせないと出ない。


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
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
これでUSBイーサネットアダプタが認識する。


/media/ubuntu/etc/fstab を編集。swapを有効にする
proc /proc proc defaults 0 0
/dev/mmcblk0p3 swap swap defaults 0 0

取り外す
cd /media/boot
sync
cd /media
sudo umount /media/boot
cd /media/ubuntu
sync
cd /media
sudo umount /media/ubuntu
うちのSDカードリーダだと手動でsyncしないとなかなか書き込んでくれなかった


■起動する
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カードが壊れる事が少なくなってよいかもしれない。