今回、 実は chumby の上でネイティブに Debian を動かしたわけではありません。 USB メモリにインストールした Debian に
chroot して擬似的に動かしているように見せかけました。 ネイティブに動かすとなるとブートローダをいじる必要があります
が、 今回は chumby 自体はほとんど変更せずに済む方法をとりました。
chumby は、 インターネットに接続可能な無線 LAN 環境が必要で、 接続できなければアナログ時計の widget
の表示しかできません。 また、 書き込み可能なメモリ領域はフラッシュメモリも 64MB のうち、 わずかで
す 。 当
然、 Debian をローカルにインストールすることはできないので、 USB メモリを外部ストレージとして使い
ます。
もう一つの制約は、 chumby は、 ext2 などを使えません。 USB メモリを使う場合は vfat のみです。 しかし vfat では Linux をインストー
ルできません 。
そ こ で 、 大 き く 3 つ や る こ と が あ り ま す 。
- chumby のカーネルリビルド
- USB メモリへの Debian インストール
- USB メモリの Debian への chroot 設定
環境構築時に最低限必要なもの
- chumby
- USB メモリ
- Debian 環境構築用の PC
- ネットワーク環境
前述のとおり、 chumby の kernel は ext2 を使えません。 今回、 USB メモリには ext2 フォーマットで Debian をインストール
するので、 chumby 自体も ext2 を読み込めるようにします。 まず、 下記リンク先から chumby のカーネル構築用のツールキッ
トを入手します。 手順はリンク先に従います。
- GNU Toolchain
- GCC Toolchain
これらのツールキットは、 /usr 以下に展開されるので、 kvm/qemu などの仮想 OS 環境に、 環境を構築すると良いでしょう。
$ cd /
$ sudo tar zxf ~/arm-linux-v4.1.2b.tar.gz
$ sudo tar zxf ~/Gcc-3.3.2-glibc-2.3.2.tar.gz
$ sudo mkdir -p /opt/Embedix/usr/local/arm-linux
$ sudo ln -s /usr \
/opt/Embedix/usr/local/arm-linux/gcc-3.3.2-glibc-2.3.2
$ sudo vi /usr/bin/arm-linux-make
$ sudo chmod +x /usr/bin/arm-linux-make
|
/usr/bin/arm-linux/make には以下のように記述します。
#!/bin/sh
echo make ARCH=arm CROSS=arm-linux- CC=arm-linux-gcc \
AR=arm-linux-ar NM=arm-linux-nm RANLIB=arm-linux-ranlib \
CXX=arm-linux-g++ AS=arm-linux-as LD=arm-linux-ld \
STRIP=arm-linux-strip BUILDCC=gcc BUILD_CC=gcc \
CC_FOR_BUILD=gcc ‘‘$@’’
exec make ARCH=arm CROSS=arm-linux- CC=arm-linux-gcc \
AR=arm-linux-ar NM=arm-linux-nm RANLIB=arm-linux-ranlib \
CXX=arm-linux-g++ AS=arm-linux-as LD=arm-linux-ld \
STRIP=arm-linux-strip BUILDCC=gcc
BUILD_CC=gcc CC_FOR_BUILD=gcc ‘‘$@’’
|
私の chumby のファームウェアは 1.6 な
ので、 Wiki の firmware 1.6 の手順を実施します。
- Hacking Linux for chumby - ChumbyWiki
また、 カーネルビルド用の環境には次の Debian パッケージは最低限入れておく必要があります。
- make
- gcc
- libncurses5-dev
- libncursesw5-dev
- zip
また、 chumby 用のカーネルソースコードと、 chumby へ新しいカーネルをインストールするためにアライメントする Perl スク
リプトをそれぞれダウンロードしておきます。
- linux-2.6.16-chumby-1.6.0.tar.gz
- align.pl
カーネルソースを展開し、 make menuconfig で ext2 を組み込みま
す 。
$ cd
$ mkdir kernel
$ cd kernel
$ cp ~/{align.pl,linux-2.6.16-chumby-1.6.0.tar.gz} ./
$ tar zxf linux-2.6.16-chumby-1.6.0.tar.gz
$ cd linux-2.6.16-chumby-1.6.0
$ ARCH=arm BOARD=mx21ads CROSS_COMPILE=arm-linux- \
make menuconfig
$ ARCH=arm BOARD=mx21ads CROSS_COMPILE=arm-linux- make
$ perl ../align.pl arch/arm/boot/zImage
$ zip k1.bin.zip arch/arm/boot/zImage
|
これで、 kernel/linux-2.6.16-chumby-1.6.0/ディレクトリ直下に、 k1.bin.zip が生成されます。 これを USB メモリの vfat 領
域にコピーします。
$ sudo mount -t vfat /dev/sda1 /media/usb
$ sudo mkdir /media/usb/update2
$ sudo cp -i k1.bin.zip /media/usb/update2/
$ sudo umount /media/usb
|
chumby を special option mode で起動し、 kernel をアップデートします。
- chumby の電源を OFF にした状態で USB メモリを挿します。
- タッチスクリーンを押したまま、 電源を入れる。 途中で押したままにすると special option mode になるよ、
と表示されるのでそのまま押しつづけます。
- special option mode のメニュー画面で”install updates” をクリックします。
- “Install from USB flash drive” をクリックすると、 kernel がアップデートされ、 自動的に再起動されます。
次に、 USB メモリに Debian をインストールしますが、 USB メモリには chumby 自体の設定を行うためのファイルを置く
vfat 領域も必要なので、 fdisk コマンドで/dev/sda1 を vfat、 /dev/sda2 を Linux 用領域を作り、 mkfs コマンドでファイルシ
ステムを作成しておきます。
$ sudo fdisk /dev/sda
$ sudo mkfs.vfat /dev/sda1
$ sudo mke2fs /dev/sda2
|
この sda2 の方に、 Debian をインストールします。 chumby は、 EABI(armel) ではなく、 OABI(arm) であるため、 arm 版
のインストーラを用意する必要があります。 しかし、 Qemu では armel のサブアーキテクチャ versatile しかサポートしていな
いため、 arm 版の kernel イメージを起動させることしかできません。 なので、 今回は、 同じ OABI のアットマークテクノ社の
armadillo-9 用に公開されている Debian Etch イメージを利用しました。 下記リンク先から、 5 つの tar ボールを全てダウン
ロ ー ド し ま す 。
- debian directory - Armadillo 開発者サイト
ext2 領域をマウントし、 tar ボールを展開します。
$ sudo mount /dev/sda2 /mnt
$ cd /mnt
$ tar zxf ~/debian-etch-a9-1.tgz
$ tar zxf ~/debian-etch-a9-2.tgz
$ tar zxf ~/debian-etch-a9-3.tgz
$ tar zxf ~/debian-etch-a9-4.tgz
$ tar zxf ~/debian-etch-a9-5.tgz
|
chumby の電源を落とし、 この USB メモリを挿して電源を入れると、 自動的に ext2 領域もマウントされ、 この下の領域の
バイナリも正常に実行できます。
USB メモリの Debian 環境に chroot し、 そしてその環境下で Etch から Lenny にバージョンアップさせます。 まず、 ssh でロ
グインし、 /proc、 /dev、 devpts をバインドさせます。
chumby:~# mount -o bind /proc /mnt/usb2/proc
chumby:~# mount -o bind /dev /mnt/usb2/dev
chumby:~# mount -t devpts devpts /mnt/usb2/dev/pts/
chumby:~# chroot /mnt/usb2
chumby:/1 df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hda1 1373548 181321 1118946 14% /
tmpfs 1373548 181321 1118946 14% /lib/init/rw
sysfs 1373548 181321 1118946 14% /sys
udev 1373548 181321 1118946 14% /dev
tmpfs 1373548 181321 1118946 14% /dev/shm
devpts 1373548 181321 1118946 14% /dev/pts
|
apt line を etch から lenny に書き換え、 バージョンアップを行うと、 問題なくアップグレードできるはず
です。
次に、 chroot の Debian で、 ssh を自動起動させるため、 次の設定を行います。 22/tcp は chumby 自体の sshd が使うので別
のポートを割り当てる方が良いでしょう。
/mnt/usb2/etc/ssh/sshd_config (一部抜粋)
Port 2222
(snip)
PermitRootLogin no
StrictModes yes
RSAAuthentication yes
PubkeyAuthentication yes
(snip)
PermitEmptyPasswords no
ChallengeResponseAuthentication no
PasswordAuthentication no
(snip)
|
次に、 chumby 側の設定。 USB メモリに配置した Widget をロードさせる手順の応用で、 6.2.3 で作成した vfat 領域の直下
に 、 以 下 の 内 容 で
debugchumby というファイル名でスクリプトを作成します。
#!/bin/bash
mount -o bind /proc /mnt/usb2/proc
mount -o bind /dev /mnt/usb2/dev
mount -t devpts devpts /mnt/usb2/dev/pts/
chmod 666 /mnt/usb2/dev/null
chroot /mnt/usb2 /bin/hostname chumby
chroot /mnt/usb2 /usr/sbin/sshd
|
これで、 次回以降、 自動的に chroot 環境の Debian の sshd が 2222/tcp で起動するようになります。
6.1 でも書きましたが、 Chumny はインターネットに繋がらないと単なる時計です。 理由は、 起動時に chumby.com から
controlpanel.swf という管理コンソールの flash ファイルや、 その他自分で設定している Widget をダウンロードしてくるため
です。 そこで、 簡単な Widget を作成し、 画面上はそれを表示しつつ、 スタンドアロン環境でも有線 LAN を介して SSH でロ
グインできるようにします。
環境構築に加えて必要なもの
- mtasc パッケージ
- USB-Ethernet 変換アダプタ
- クロスケーブル
- 展示用の PC
chumby の Widget は Flash です。 Debian を使っているので Widget はもちろんテキストエディタで ActionScript を書いて、
フリーソフトウェアでコンパイルします。 今回の展示で表示させていた Widgit のソースコードは以下のとおりです。
class DisplayDebian {
public static function main(mc:MovieClip):Void
{
var app = new DisplayDebian(mc);
}
public function DisplayDebian(mc:MovieClip)
{
mc.createEmptyMovieClip(‘‘image’’,
mc.getNextHighestDepth());
var image:MovieClip = mc.image;
var imageArr:Array = [ ‘‘./openlogo.png’’ ];
image._xscale= 100;
image._yscale= 100;
image._x= 69;
image._y= 0;
image.loadMovie(imageArr[0]);
var textField:TextField = mc.createTextField(’textField’,
mc.getNextHighestDepth(), 15, 10, 320, 240);
var fmt:TextFormat = new TextFormat(’’, 24, 0x000000);
textField.text = ’ 東京エリア Debian 勉強会\n\n\n’ +
’ 次回は 3/21, 東大で開催予定’;
textField.setTextFormat(fmt);
}
}
|
これを Hoge.as として保存し、 同じディレクトリに
openlogo.png を
配置します。
そして以下のワンライナー (ascompile.sh) の引数として渡し、 コンパイルします。
ワンライナー ascompile.sh は以下のように記述します。
#!/bin/bash
test -z $1 && exit 1
mtasc -swf ‘basename $1 .as‘.swf -main $1 -header \
320:240:12 -version 8
|
コンパイルすると、 Hoge.swf という flash ファイルができます。 この Hoge.swf を Widget として読み込むために、
profile.xml という名前で設定します。
<?xml version=’’1.0’’ encoding=’’utf-8’’ ?>
<profile>
<widget_instances>
<widget_instance id=’’1’’>
<widget>
<name>Debian Logo</name>
<description>Debian GNU/Linux Logo</description>
<version>1.0</version>
<mode time=’’30’’ mode=’’timeout’’ />
<access sendable=’’false’’ deletable=’’false’’
access=’’private’’ virtualable=’’false’’ />
<user username=’’Kouhei Maeda’’ />
<thumbnail href=’’file:////mnt/usb/openlogo.png’’
contenttype=’’image/png’’ />
<movie href=’’file:////mnt/usb/Hoge.swf’’
contenttype=’’application/x-shockwave-flash’’ />
</widget>
<access access=’’private’’ />
<mode time=’’30’’ mode=’’timeout’’ />
<widget_parameters>
<widget_parameter>
<name>auther1</name>
<value>Kouhei</value>
</widget_parameter>
<widget_paramter>
<name>auther2</name>
<value>Maeda</value>
</widget_parameter>
</widget_parameters>
</widget_instance>
</widget_instances>
</profile>
|
この profile.xml および、 Hoge.swf と openlogo.png を USB メモリの vfat 領域直下にコピーします。 これで、 起動時に
USB メモリからこの Widget が読み込まれるようになります。
次に、 スタンドアロンで先ほどの Widget が読み込まれ、 ssh でログインできるようにします。 基本的にはフォーラ
ム の内容に従って行えば問題あり
ません。 まず、 chumby-offline.zip
をダウンロードします。 展開すると offline-howto.txt というドキュメントがあるので、 これに従い設定します。 profile.xml は
既に 6.3.2 で作成していますので、 これを利用してください。 USB メモリの vfat 領域の直下に以下のファイルをコピーし
ます。
- chumby-offline.zip を展開してできる offline ディレクトリ以下にある www/ディレクトリ
- chumby の/usr/widgets/controlpanel.swf
USB メモリの vfat 領域の直下の debugchumby を次のように書き換えます。
#!/bin/bash
killall httpd
/usr/sbin/httpd -h /mnt/usb/www
cp /mnt/usb/www/hosts.offline /psp/hosts
#cp /mnt/usb/www/hosts.online /psp/hosts
mount -o bind /proc /mnt/usb2/proc
mount -o bind /dev /mnt/usb2/dev
mount -t devpts devpts /mnt/usb2/dev/pts/
chmod 666 /mnt/usb2/dev/null
chroot /mnt/usb2 /bin/hostname chumby
|
なお、 オフラインモードからオフラインモードに戻す場合は、 killall から3行をコメントアウトし、 hosts.online をコピーす
る行を有効にしてください。
そして最後に、 USB-Ethernet アダプタを使い、 有線 LAN 経由でアクセスできるように設定します。 今までと同じく、 vfat
領域に userhook1 というファイルを作成します。 内容は以下のとおりです。
#!/bin/sh
USE_DHCP=0
IPADDR=192.168.3.10
NETMASK=255.255.255.0
GATEWAY=192.168.3.1
/sbin/insmod /drivers/usbnet.ko
/sbin/insmod /drivers/pegasus.ko
ifconfig rausb0 127.0.0.1
if [ $USE_DHCP == 1 ]\daggerhen
udhcpc -t 5 -n -p /var/run/udhcpc.eth0.pid -i eth0
else
/sbin/ifconfig eth0 $IPADDR netmask $NETMASK
/sbin/route add default gw $GATEWAY eth0
fi
|
ちなみに、 今回は BUFFALO の LUA2-TX を使っています。
以上で、 まったくインターネットを使えない環境でも、 有線 LAN 経由で SSH 接続かつ、 液晶モニタ上に USB に入れた
Widget を稼働させることができるようになります。
以下が残っていますが、 気が向いたらやるかもしれないし、 やらないかもしれません。
- debootstrap で Lenny arm 版を作ってみて chroot 環境として使えるか?
- chroot 環境からフレームバッファを乗っ取る。
- ブートローダをハックして、 直接 USB ブートさせる。
2 月はこの OSC 準備と別件で、 ヨメよりも早く帰ってきても晩飯を作らなかった(作れなかった) のと、 毎週水曜に Hack
Meeting に参加するようになったため、 めっちゃ不機嫌になりました。 コワ。 方々のアドバイスを頂き、 3月現在は “すい〜
つ” でなだめています。
|