ラベル beagleboard の投稿を表示しています。 すべての投稿を表示
ラベル beagleboard の投稿を表示しています。 すべての投稿を表示

2010/09/23

beagleboard用にlinuxカーネルを新しくしてみた

手元のbeagleboardのスペックは次のようになっています。

  • Rev. C3
  • X-Loader 1.4.2 (Feb 19 2009 - 12:01:24)
  • U-Boot 2009.01-dirty (Feb 19 2009 - 12:22:31)

以前は http://rcn-ee.net/deb/kernel/beagle/lenny/にあったbeagleboard用のkernelの配布場所が、サーバはそのままにディレクトリが /deb/lenny/へ変更になっていました。

beagleboard用にカーネルを新しくしたので、そこを踏まえてメモを残しておきます。

導入するkernelバージョンを決める

最近はkernel.orgをみるとstableなカーネルのバージョンが、かなり多数あります。

ここはstableの安定板である2.6.35.5をターゲットに、beagleboard上で現在使っている2.6.32.11-x13を置き換えることにしました。

さっそく開始

http://rcn-ee.net/deb/lenny/の2.6.35.5-x4/install-me.shを使う事にします。

beagleboardはUSB経由でLANに接続しているので、作業は全てbeagleboard上で行なうことにしました。

作業はとっても簡単

以前と比べればinstall-me.shは安定した動きをするようで、./tempではなく/tmpを使うようにしたり、ディレクトリを作成する作業もsudo経由で行なわれるなど権限に関する問題はほぼなくなったようです。

$ cd
$ wget http://rcn-ee.net/deb/lenny/v2.6.35.5-x4/install-me.sh
$ /bin/bash install-me.sh

これだけで作業は完了しました。

気になっていたhdparmの結果を確認してみる

# /sbin/hdparm -t /dev/mmcblk0

hdparmの出力結果

/dev/mmcblk0:
 Timing buffered disk reads:   54 MB in  3.02 seconds =  17.89 MB/sec

作業前は約5MB/secでしたが、現在はSDカードのスペックをほぼフルに出せています。

これが一番の目的だったので、もうしばらく遊べそうです。 beagleboard-xMもdigikey日本版で扱いが始まりましたが、買う余裕もないし、しばらくは手を出さないつもりです。

2010/05/25

beagleboardとUSBカメラとGPSを車に載せてみた

beagleboard自身は5V1A程度の電源が必要ですが、車のシガーソケットから携帯充電用のUSB端子を接続することで簡単に動かすことができます。

そこにUSB Video Class(UVC)に対応したUSBカメラとGPSを接続することで、走行場所の位置情報を埋め込んだ写真を取るようにしてみました。

助手席に子供の目線ぐらいに付けたカメラから写真を取るとこんな感じになります。

始めて車から取った写真

準備作業

電源の確保

近場のオートバックスでみつけたのがAXSの キューブチャージャー デュアルでした。

これは5V2000mAが取れてヒューズもついていて、USB経由でカメラ(+100mA?)やらGPS(+300mA?)やらをつけても安定して動いています。

GPSモジュール

今回は秋月電子通商の GPSモジュール GT-730F/Lを準備しました。 消費電力がわりと高めといわれていて心配でしたが、性能自体に問題はなさそうなので値段を考えて決めました。

USBカメラ

Video4Linux2で遊んだ前回はBUFFALOの BSW13K05Hを使いましたが、今回はELECOMの UCAM-DLX300Bを使ってみました。

UCAM-DLX300Bでテストしたところ、シャッタスピードの問題なのか、2048x1536だと明る過ぎてしまい、1280x720は640x480と画角が同じで引き伸ばしただけの絵だったので、結局640x480で使っています。

画像は安定していますが、この使い方だと130万画素のBSW13K05Hと比べて違いはそれほど大きくありません。 家の中で使うには良いでしょうね。

撮影した写真の加工

GPSのデータは/dev/ttyUSB0経由で取得することができますが、今回はgpsdとntpdを動かしています。 このgpsdにTCP/IPで接続する事でデータを取得しています。

とりあえずはexiv2コマンドで時刻を修正しています。

beagleboardでの時刻同期

ntpdを-xオプションで動かしたとしても、電池でバックアップされたRTCを持っていないbeagleboardでは、ある程度の時間を調整してあげる必要があります。

これは別のスクリプトでgpsdから時刻情報を取ってきて比較することで、時差が大きい場合にはdate --utc MMDDhhmmYYYYhwclock -wで時刻を合せています。

まとめ

まだしばらくはカメラの固定方法や取り付け位置の高さといった調整が必要そうです。

この記事で取り上げた品々

2010/05/16

SDカードにnilfs2領域を作成した、その顛末

beagleboardに差しているSDカードに書き込み不可なブロックが出現したりしてファイルシステムが恐れてしまう現象が何回か発生しました。

そこで試験的にnilfs2な領域を作成して/home, /var, /usrにしたのですが、2週間ほど稼働した後に残念ながら書き込みができなくなりました。 最初はGCプロセスが動いていないのかなと思ったのですが、空きが十分ある状態で論理的な不整合が原因のようです。 使っていたSDカード(Panasonic 2GB Class6)自体には問題はないようで、ext3でフォーマットを再度行なって問題なく動いていました。

最終的には2GBでは空き領域が不足したので、 東芝の海外向けClass6 4GB SDカードを購入しました。 これをext3で60〜90%程度まで使って、データをUSBフラッシュメモリに退避するような使い方をしています。 1週間程度使ってみて特に問題は発生していません。

以前のカード(上海問屋オリジナル150倍速 2GB SDカード)は連続稼働して、おおよそ3週間程度で問題が発生しました。 東芝製の白SDカードはSLC NANDと言われているので、その通りであれば、今回は全体の容量も増えているので当分は様子をみる必要がありそうです。

経験的には Alixに使っているCFカード(ext3フォーマット)で問題が発生したのはMLCタイプのものだけです。 今回はSDカードでしたが、nilfs2に問題があったというよりも使い方に問題があったんだと思いますが、しばらくは無難にext3を使ってみます。

まぁSLC NANDフラッシュメモリを使ったSDカードが欲しいといった時に、明記されているのは トランセンドの150倍速SDカードぐらいですね。 過去にSLCであっても内部でRAID0のようなストライピングを行なうことも可能ですし、パフォーマンスをみてもたぶんSLCなカードとほぼ同じパフォーマンスだからSLCだろう、と判断することしかできないのが残念なところです。

この記事で取り上げた品々

2010/04/25

BeagleboardのDebian lennyを入れたSDカードでnilfs2を試す

いままでSDカード全体をext3でフォーマットしていたのですが、一部のディレクトリで書き込みができなくなってしまったので、他のSDカードでパーティションを増やし、 nilfs2を使うことにしました。

いきなりnilfs2の領域を作成してインストールすることはできないので、まずは普通にext2/ext3でフォーマットしたSDカードにdebian lenny環境を構築しておきます。 ここからは別のSDカードにnilfs2の領域を作成して、引っ越した時の状況をメモしておきます。

進め方

すでにSDカード上にdebian lennyが導入されているので、待ち受け側のSDカードにnilfs2用のパーティションを追加してファイルをコピーするだけです。

ただし、カーネルがnilfs2をサポートしているか確認が必要です。 手元の2.6.32.6-x6.2ではnilfs2.koがないのですが、2.6.32.11-x13には含まれています。 できるだけ安定している最新のカーネルを使うべきでしょう。

配布されているカーネルではnilfs2はカーネルモジュールなので、起動時のパーティションには引き続きext2/ext3が必要です。

SDカードのパーティショニング

いま稼働しているSDカードは2GBのもので、次のようなパーティションに分かれています。 /dev/mmcblk0p3をext3な最小限の部分と、残りをnilfs2な領域に分割します。

稼働中SDカードのパーティション

Disk /dev/sdg: 2014 MB, 2014838784 bytes
64 heads, 63 sectors/track, 976 cylinders
Units = シリンダ数 of 4032 * 512 = 2064384 bytes
Disk identifier: 0x00000000

        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1               1         125      251968+   6  FAT16
/dev/mmcblk0p2             126         250      252000   82  Linux swap / Solaris
/dev/mmcblk0p3             251         976     1463616   83  Linux

次のようなSDカードを別に準備しました。

nilfs2をロードするまでに必要となる/sbin, /bin, /lib, /etcなどはext2/ext3な領域に配置する必要があります。 今回は/dev/mmcblk0p4をnilfs2にフォーマットし、/usr, /var, /homeを配置することにしました。

移動先カードのパーティション

Disk /dev/mmcblk0: 2021 MB, 2021654528 bytes
20 heads, 19 sectors/track, 10390 cylinders
Units = cylinders of 380 * 512 = 194560 bytes
Disk identifier: 0x00000000

        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1               1         659      125200+   6  FAT16
/dev/mmcblk0p2             660        1976      250230   82  Linux swap / Solaris
/dev/mmcblk0p3            1977        3293      250230   83  Linux
/dev/mmcblk0p4            3294       10390     1348430   83  Linux

ちなみに /dev/mmcblk0p1 は、USBカードリーダを通して普通のPCでmountすると/dev/sdg1のようになります。 "mmcblk0"が"sdg"、"mmcblk0p1"が"sdg1"のようになる感覚です。

'w'コマンドでfdiskを終了してから、各パーティションをフォーマットします。

フォーマット

各パーティションに合った

$ sudo mkfs.vfat /dev/sdg1
$ sudo mkswap /dev/sdg2
$ sudo mke2fs -j /dev/sdg3
$ sudo mkfs.nilfs2 /dev/sdg4

もし必要ならfsckが走らないようにtune2fsで/dev/sdg3の設定を変更しておきます。

$ tune2fs -c 0 -i 0 /dev/sdg3

Debian lenny x86_64版でのファイルの引っ越し

beagleboardにUSB経由でSDカードアダプタを接続しようとしましたが、I/O負荷が高くなった時にUSBポートが安定的に稼働するか自信がなかったので、VMWare上のdebian lennyでカーネルを作業を行ないました。

Debian lenny x86_64版でのnilfs2の有効化

対応するモジュールが準備されているので、それを導入します。

$ sudo apt-get install nilfs2-modules-$(uname -r)
$ sudo apt-get install nilfs2-tools
オリジナルSDカードからのバックアップの作成

まずはオリジナルのSDカードの各パーティションの内容をtar形式でバックアップを作成しておきます。 あらかじめ$ sudo mkdir /mnt/sdで/mnt以下にマウントポイントを作成しておきます。

$ sudo mount /dev/sdg1 /mnt/sd
$ cd /mnt/sd
$ sudo tar czf ~/mmcblk0p1.tar.gz .

あとは同じようにmmcblk0p3.tar.gzを作成します。

待ち受け先SDカードの準備作業

nilfs2が有効になったdebian lennyにSDカードを認識させて、fdiskでパーティションを切っていきます。

それから各パーティションをマウントして、バックアップからファイルシステムを戻していきますが、"/dev/mmcblk0p3"は'/'(root)にマウントし、"/dev/mmcblk0p4"は'/nilfs2'にマウントします。

その上で次のようにシンボリックリンクを使い、'/usr', '/var', '/home'を準備しておきます。

$ tree .

マウントポイントからみたディレクトリ構造

.
|-- home -> nilfs2/root.home
|-- lost+found
|-- nilfs2
|   |-- root.home
|   |-- root.usr
|   `-- root.var
|-- usr -> nilfs2/root.usr
`-- var -> nilfs2/root.var

これでバックアップを展開すれば'/usr', '/var', '/home'などは自動的に/nilfs2以下にファイルが作成されます。

"/dev/mmcblk0p1"はFAT領域で、単純にバックアップからtarで戻せばOKです。

起動時にnilfs2モジュールをロードする

起動時にカーネルモジュールをロードする方法は、ディストリビューションによって違いがあります。

Debianでは/etc/modulesに、起動時にロードさせたい名前を記入します。

/etc/modulesファイルの内容 (コメント、空行は除く)

loop
nilfs2

beagleboardでの稼働

基本的にはここで作成したSDカードをbeagleboardに差し込んでうまく動いています。

ただしbeagleboardではカーネルに統合されたnilfs2ドライバを使っているため、nilfs2本家のFAQにあるようにapt-getで入手できるnilfs2-toolsパッケージとは互換性がありません。

そこでlscpなどのnilfs2に固有のコマンドはnilfs-utils-2.0.18をコンパイルして使っています。 xstowを使うために--prefixオプションでインストール先を変更しましたが、/etc/nilfs_cleanerd.conf, /sbin/mkfs.nilfs2などのコマンドのインストール先は標準では変更することができないようになっています。

これらのファイルは手動で配置しています。独自にパッケージを作成するのであれば、既存のnilfs2-toolsのソースファイルを展開して参考にするのが良いでしょう。

さいごに

ext2/ext3のようにあらかじめカーネルに組み込まれていれば良いんですが、 ARM用にカーネルの再構築を試していないのと、beagleboard実機でのカーネルコンパイルはおそろしく時間がかかりそうなので試していません。

また、次のようなログがシステムに出力されているため、原因についても少し追い掛けてみようと思っています。

現在dmesgに出力されているエラーメッセージ

[56527.452941] NILFS error (device mmcblk0p4): nilfs_check_page: bad entry in directory #14570: unaligned directory entry - offset=0, inode=134777631, rec_len=770, name_len=99
[56527.478210] NILFS error (device mmcblk0p4): nilfs_readdir: bad page in #14570
[73378.520874] NILFS error (device mmcblk0p4): nilfs_readdir: bad page in #14570

2010/04/23

V4L2のサンプルコードで遊んでみる

手元にWebカメラがあってbeagleboardに接続して使えないかなと思って、V4L2 APIを使ってみました。 V4L2 APIリファレンスのAppendix B. "Video Capture Example"にあるコードを使うと、static void process_image(void *p)関数の中身を作成するぐらいで動画や静止画を書き出す事ができます。

ただ「〜するぐらいで」とはいっても、使うUSBカメラのスペックなども関連して、 そんなに簡単ではなったので試行錯誤した結果をまとめておきます。

今回はbeagleboardに入れたdebianに、ライブラリなどを入れましたが、特に問題なく試す事ができると思います。

環境

今回はprocess_image関数を実装するために、motion(GPLv2)のコードを参考にしました。 参考にしたものも合わせて、環境をまとめると次のようになります。

  • HW: BeagleBoard Rev. C3
  • USB Camera: BUFFALO BSW13K05H
  • OS: Debian Lenny 5.0.4
  • Kernel(uname -r): 2.6.32.6-x6.2
  • gcc --version: gcc (Debian 4.3.2-1.1) 4.3.2
  • Packages: libjpeg62 libjpeg62-dev
  • References: motion-3.2.9 (derived by: apt-get source motion)

サンプルコードをコンパイルする

まずは APIリファレンスのAppendix B.にあるコードをコピーして、コンパイルできるかどうか確認するのが良さそうです。 とりあえず"v4l2_example.c"という名前でコピーしてきました。

$ gcc v4l2_example.c

特別なライブラリをリンクすることもなくコンパイルできるはずです。 これはそのまま実行できます。

$ ./a.out -d /dev/video0

正常に実行できた場合

....................................................................................................

/dev/video0が存在しない場合

Cannot identify '/dev/video0': 2, No such file or directory

v4l2_format構造体に指定するデバイスの初期設定値が間違っていた場合

VIDIOC_S_FMT error 22, Invalid argument

コード中では /dev/video が指定されていますが、debian/ubuntuではudevはデバイス名の最後に番号を割り振ってくれます。 "-d"オプションを使う必要がないように"/dev/video"を"/dev/video0"に書き換えて良いのかもしれません。

fmt.pixelformatに設定できるデバイスの画像形式を確認する

最後の「v4l2_format構造体に指定するデバイスの初期設定値が間違っていた場合」では、試した範囲では接続したUSBカメラに対応したpixelformatを選択しない場合に、エラーになるようです。

サンプルコードではカバーされていませんが、ioctlでVIDIOC_ENUM_FMTを要求するとデバイスからpixelformatに設定できるフォーマットを得る事が可能です。

例えば次のような関数をmain()の中のopen_device();の直後に呼ぶと、出力例のようにデバイスのサポートする形式が出力されます。

motionを参考にしたVIDIOC_ENUM_FMTを利用したコード例

static void list_formats()
{
    int i;
    struct v4l2_fmtdesc fmt;
    fmt.index = i = 0;
    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

    while(-1 != xioctl(fd, VIDIOC_ENUM_FMT, &fmt)) {
        printf("%i: %c%c%c%c (%s)\n", fmt.index,
                           fmt.pixelformat >> 0, fmt.pixelformat >> 8,
                           fmt.pixelformat >> 16, fmt.pixelformat >> 24, fmt.description);
        memset(&fmt, 0, sizeof(struct v4l2_fmtdesc));
        fmt.index = ++i;
        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    }
}

実行時のlist_formats()の出力例

0: YUYV (YUV 4:2:2 (YUYV))
...

このコードはmotionを参考にしました。

検索でみつかるV4L2 APIについてのプログラミング例は、だいたいV4L2 APIのサンプルをベースにしているようです。 そういうサイトの説明ではpixelformatに、V4L2_PIX_FMT_RGB24やV4L2_PIX_FMT_MJPEGを指定しているものがありますが、これは接続するUSBカメラに合ったものでなければなりません。

問題となるコード例

...
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_RGB24;
...

今回の場合は、"YUYV"と表示されているのでV4L2_PIX_FMT_YUYVだけが唯一pixelformatに指定できる形式です。

"VIDIOC_S_FMT error 22"をキーにして検索するとMLに質問を投げて無視されているようなものもみつかりますが、まずは使うUSBカメラがサポートする形式を調べるところから始める必要がありそうです。

外部コマンドによるデバイス出力形式の確認

自前でコードを書かなくとも、デバイスの出力形式を調べることは可能です。

例えば、luvcviewコマンドの'-L'オプションを使う方法があります。

$ luvcview -L

luvcviewコマンドの出力例

luvcview 0.2.4

SDL information:
  Video driver: x11
  A window manager is available
Device information:
  Device path:  /dev/video0
/dev/video0 does not support read i/o
{ pixelformat = 'YUYV', description = 'YUV 4:2:2 (YUYV)' }
...

ブログなどをみると比較的高めなUSBカメラで、MJPEGにも対応しているものがあるようです。 デバイス毎の出力形式が一覧になっていると良いんですけどね。

YUYV(YUV422)形式からJPEGファイルへの出力の作成

画像処理ではtiff形式をよく使いましたし、汎用性が高そうなYUV422からRGBへの変換などは他にまとめている方が大勢います。 ここら辺は専門分野ではないので、motionのコードを流用する事にしました。

今回のUSBカメラとV4L2 APIを使った背景目的は、動画ファイルの作成ではなくて、監視カメラとして1,2秒間隔で静止画を得る事だったのでJPEG形式に出力させてみました。 motionをそのまま使ったほうが良いんじゃないかって感じですが、swfファイルとか必要ないですし、V4L2の勉強を兼ねてコンパクトなアプリを作ることにしました。

motionはデバイスからのRGB24やらYUYVやらの出力形式を受けて、YUV420形式に統一して扱っています。 JPEGファイルに出力する場合は、さらにそのYUV420形式を入力にします。

motionからのコードコピー

関数の内容は次のプロトタイプ宣言に対応するコードをmotionのvideo_common.cとpicture.cからコピーしておきます。

motionからコピーしてきた関数のプロトタイプ宣言

void conv_yuv422to420p(unsigned char *map, unsigned char *cap_map, int width, int height);
void put_jpeg_yuv420p_file(FILE *fp, unsigned char *image, int width, int height, int quality);

put_jpeg_yuv420p_fileはlibjpegライブラリを使うため、libjpeg.hファイルをincludeする事が必要です。

サンプルコードに追加するinclude文

#include <jpeglib.h>
#include <jerror.h>
process_image関数の実装

オリジナルのサンプルコードは、単純に'.'(ピリオド)を表示するだけのコードですが、(void *)型のp変数から準備した関数を使い画像形式を変換していきます。

process_image関数の概要

int ya_count = 0;
#define IMG_WIDTH 640
#define IMG_HEIGHT 480
#define FILENAME_LEN 10
...
static void process_image (const void *p) {
    FILE *fp;
    unsigned char *dst;
    char filename[FILENAME_LEN];

    snprintf(filename, FILENAME_LEN, "p_%02d.jpeg", ya_count++);
    fp = fopen(filename, "w");
    dst = (unsigned char *)malloc(sizeof(unsigned char) * (IMG_WIDTH*IMG_HEIGHT) * 2);
    conv_yuv422to420p(dst, (unsigned char *) p, IMG_WIDTH, IMG_HEIGHT);
    put_jpeg_yuv420p_file(fp, dst, IMG_WIDTH, IMG_HEIGHT, 99);
    free(dst);
    fclose(fp);
}

毎回mallocしなくても、一回確保してmemsetで初期化した方が良さそうにも見えますね…。

$ gcc v4l2_example.c -ljpeg

beagleboardなのでSDカードに220KB程度のファイルを書き出していますが、とりあえずI/Oはボトルネックになっていない模様。

とりあえず動くコードはできたので、V4L2のAPIリファレンスを読み進めていこうと思います。

この記事で取り上げた品々

2010/04/13

Beagleboardに使うSDカードのhdparm結果メモ

SDカードのパフォーマンスはいろいろな計測方法があるので、この数字だけで、どうこういうわけではないですが、手持ちのカードをhdparmを使って計測したデータを羅列しておきます。

$ sudo /sbin/hdparm -Tt /dev/mmcblk0

上海問屋オリジナル 150倍速 2GB SDカード

hdparm -Tt /dev/mmcblk0

/dev/mmcblk0:
 Timing cached reads:   234 MB in  2.00 seconds = 116.79 MB/sec
 Timing buffered disk reads:   18 MB in  3.33 seconds =   5.41 MB/sec
$ sudo /sbin/hdparm -Tt /dev/mmcblk0

Panasonic Class6 2GB SDカード

/dev/mmcblk0:
 Timing cached reads:   230 MB in  2.01 seconds = 114.31 MB/sec
 Timing buffered disk reads:   18 MB in  3.32 seconds =   5.42 MB/sec

あれ、もう少しスピードが出ても良いような気もするけれど…。

OMAP3との接続は20MHzで4bitモードだっていうから、1byteに2cycle必要で、送受信が同時できないとすれば、5MB/sec前後のパフォーマンスは妥当なのかなぁ…。

どういうわけかMMC用の8bitモードで駆動させるパッチの情報があったり、カーネルのバージョンを上げるとパフォーマンスが向上するといった情報があったり、ちょっと謎な感じもします。

どうしたってUSBバス経由でフラッシュメモリを搭載した方がよさそうなのは、ちょっと残念だなぁ。 beagleboardのディスクI/O周りはどうするのが良いんだろう…。

2010/04/11

Ubuntu 8.04 LTSでBeagleboardにDebian lennyを導入してみる

今回はしばらく前に入手した Beagleboard(Rev. C3)にdebian lennyをインストールします。 alixでtracを稼働させていたのですが、パフォーマンスに満足いかなかったのでBeagleboardを試すことにしたのでした。

beagleboardに接続するSDカードはUbuntu 8.04 Hardyで作成します。 mkimageコマンドを除けばUbuntu 8.04を意識することはありませんが、その他のメモと一緒に気になった点をまとめました。

構成

今回作成した機器は次の通りです。

  • Beagleboard Rev. C3
  • SDカード1:Panasonic Class6 2GB
  • SDカード2:上海問屋オリジナル 150倍速 2GB
  • シリアルUSBケーブル: SRC06-USB
  • USBイーサネット: PCI UE-200TX-G

インストール

参考にしたのは http://elinux.org/BeagleBoardDebianで、 基本的には書かれている手順に従いました。 気になったところをメモしていきます

kermitのパラメータ

Ubuntu 8.04 Hardyとbeagleboardとの接続はUSBシリアルケーブル(SRC06-USB)を使っています。 Ubuntu側ではckermitパッケージを導入し、/usr/bin/kermitを使っていますが、connectするために次のようなコマンドを入力しています。

$ kermit
C-Kermit> set port /dev/ttyUSB0
C-Kermit> set carrier-watch off
C-Kermit> set speed 115200 

kermit画面出力

Type ? or HELP for help.
(/home/yasu/) C-Kermit>set port /dev/ttyUSB0
(/home/yasu/) C-Kermit>set carrier-watch off
(/home/yasu/) C-Kermit>set speed 115200 
/dev/ttyUSB0, 115200 bps
(/home/yasu/) C-Kermit>connect
Connecting to /dev/ttyUSB0, speed 115200
SDカードのパーティションについて

ブートローダを配置するためにFATフォーマットで最初のパーティションに128〜256MB程度の領域を確保します。 この時に残りの領域をext2などでフォーマットしてしまうと、参考にした手順で Guided - Use the largest continuous free space という選択肢は表示されません。

この場合はManualを選択し、ext3でフォーマットし、'/'にマウントさせ、bootflagをONに設定する必要があります。 簡単ですが、面倒だと思えば、使わないパーティションは削除し、空きスペースを割り当てずにbeagleboardの電源を入れるのがお勧めです。

netinstall.cmd, boot.scrファイルの配置場所

前のセクションからの流れで作業をしていれば問題ありませんが、boot.scrファイルはSDカードに作成したFATパーティションに配置します。 そのため、参考にした手順では /media/disk に移動した上で、netinstall.cmdファイルを配置する事になります。

nanoはテキストエディタで、これが便利であれば良いですが、単純にcatを使ったりviを使ってnetinstall.cmdファイルを作成することもできるでしょう。

mkimageコマンド

beagleboardの起動イメージを作成するために、mkimageコマンドを使う手順があります。

debian lennyや、最近のUbuntuでは uboot-mkimage パッケージが準備されているため、問題はありません。 しかし8.04 (Hardy)では手動でmkimageコマンドをインストールする必要があります。

手順自体は簡単で、debianや ubuntuのuboot-mkimageパッケージのページから、sourceファイルを展開しコンパイルするだけです。

$ tar xvzf uboot-mkimage_0.4.tar.gz
$ cd uboot-mkimage
make

カレントディレクトリにmkimageコマンドが作成されるため、頻繁に使うようであれば/usr/local/binなどに移動させるのが良いでしょう。

リブート後の作業について

インストールが一通り終ると、インストーラはbeagleboardを再起動します。 画面に Hit any key to stop autoboot: 10 のメッセージが出ている間に、適当なキーを押して処理を停止させ、電源を落すなどして一端SDカードを抜き、デスクトップ(Ubuntu 8.04 Hardy)側にSDカードを移します。

ここで適当なマウントポイント(例えば/media/disk)にFATパーティションをマウントし、normal.cmdファイルを作成していきます。

normal.cmd, boot.scrファイルの作成

/media/disk等にFAT領域をマウントし、そこへcdすると、既存のboot.scrファイルが存在するはずです。 もし再び同じSDカードを使ってdebianをインストールするのであれば、boot.scrファイルは保存しておいた方が便利かもしれません。

インストール後、マウントしたFAT領域の状態

-rwxr-xr-x 1 root root     310 2010-04-11 09:01 boot.scr
-rwxr-xr-x 1 root root 6023680 2010-01-22 21:53 initrd
-rwxr-xr-x 1 root root 8388608 2010-04-11 08:42 initrd.pad
-rwxr-xr-x 1 root root     238 2010-04-11 08:50 netinstall.cmd
-rwxr-xr-x 1 root root  188660 2010-04-11 08:57 u-boot.bin
-rwxr-xr-x 1 root root 2989884 2010-04-11 08:48 uImage

boot.scrファイルは適当な名前に変更して、normal.cmdファイルを作成し、参考にした手順の通りにboot.scrファイルを作成します。 最終的にはFAT領域は次のような内容になりました。

boot.scrファイルを作成し直した後のFAT領域の状態

-rwxr-xr-x 1 root root     245 2010-04-11 11:56 boot.scr
-rwxr-xr-x 1 root root 6023680 2010-01-22 21:53 initrd
-rwxr-xr-x 1 root root 8388608 2010-04-11 08:42 initrd.pad
-rwxr-xr-x 1 root root     310 2010-04-11 09:01 inst.boot.scr.old
-rwxr-xr-x 1 root root     238 2010-04-11 08:50 netinstall.cmd
-rwxr-xr-x 1 root root     173 2010-04-11 11:52 normal.cmd
-rwxr-xr-x 1 root root  188660 2010-04-11 08:57 u-boot.bin
-rwxr-xr-x 1 root root 2989884 2010-04-11 08:48 uImage
マニュアルで2番目以外のパーティションに導入した場合の対応

normal.cmdファイルにはパーティションを指定する記述があるため、3番目などに導入した場合にはroot=/dev/mmcblk0p3のように変更する必要があります。

uImageファイルの置き換え

ここまでの手順ではインストールに使ったカーネルイメージ(uImage)を起動するようになっています。

基本的にはuImageファイルを置き換える事でカーネルを切り替えることができるはずです。 Beagleboard: install kernel-imageではinstall-me.shを入手して実行するように書かれています。

この install-me.sh を読むと実行するためには、いくつかの前提条件があります。事前にチェックされていないので予期しないエラーになる可能性もあるでしょう。

  • カレントディレクトリに"temp"ディレクトリを作成するための書き込み権限と数十MBの余裕があること
  • SDカードのFAT領域は/dev/mmcblk0p1としてmountできること (既に他の領域にマウントしていないこと)

副作用としては次のようなものがありそうです。

  • /tmp/bootディレクトリが削除されること
  • uboot-mkimageパッケージが導入されること

まぁエラーが起きても問題の個所を修正して繰り返す事で問題なく修正できると思いますが、念のためにメモしておきます。 またinstall-me.shを実行した際の出力メッセージも下記にメモしておきます。

install-me.sh実行時の出力

Installing uboot-mkimage
Reading package lists... Done
Building dependency tree       
Reading state information... Done
uboot-mkimage is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Downloading Recommended Kernel
--2010-04-11 18:22:17--  http://rcn-ee.net/deb/kernel/beagle/lenny/v2.6.32.6-x6.2/linux-image-2.6.32.6-x6.2_1.0lenny_armel.deb
Resolving rcn-ee.net... 69.163.149.169
Connecting to rcn-ee.net|69.163.149.169|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10814762 (10M) [application/x-debian-package]
Saving to: `linux-image-2.6.32.6-x6.2_1.0lenny_armel.deb'

100%[===============================================================================>] 10,814,762   566K/s   in 19s     

2010-04-11 18:22:36 (551 KB/s) - `linux-image-2.6.32.6-x6.2_1.0lenny_armel.deb' saved [10814762/10814762]

Installing linux-image
Selecting previously deselected package linux-image-2.6.32.6-x6.2.
(Reading database ... 21583 files and directories currently installed.)
Unpacking linux-image-2.6.32.6-x6.2 (from linux-image-2.6.32.6-x6.2_1.0lenny_armel.deb) ...
Setting up linux-image-2.6.32.6-x6.2 (1.0lenny) ...
Mounting Fat32 partition
Extracting vmlinuz
Backing up Previous uImage
Creating uImage from vmlinuz
Image Name:   2.6.32.6-x6.2
Created:      Sun Apr 11 18:23:15 2010
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    3609320 Bytes = 3524.73 kB = 3.44 MB
Load Address: 0x80008000
Entry Point:  0x80008000
Please Reboot

ここからはRTCもないので、ntpdate, openntpdやらopenssh-serverやらsudoなどをインストールして環境を整えていかなければいけません。 とりあえず試している範囲では十分にtrac and subversionサーバとして活躍してくれそうです。

まとめ

先頭のFAT領域を最初はインストーラー、次はuImageをそのまま使って起動用領域にする手法はシンプルで便利です。

alixに比べてパワフルなのでtracとsubversionのサーバにしようとしましたが、USB-Ethernetが一度ダウンしてしまい、安定性については少し懸念がありますが、CPUのワークロードに依存する処理については任せるしかないと判断しています。

beagleboardに拡張ボードもありますが、ネットワークへはSPI経由での接続ですし、スピードは期待できないでしょう。安定性はどうなんでしょうね。

アクリル板でケースを作って、しばらく稼働させてみようと思います。