Debian on chumbyに挑戦。

Debian on chumbyを試してみるかと試行錯誤して、現在USBメモリにインストールしたLennyの領域をマウントできるようになったとこ。とりあえずchrootで擬似的にDebianを動かすことが目標。

まずはUSBメモリにLennyをインストールする。

x86やamd64(x86_64)以外のアーキテクチャをQEMUで起動させたことが無かったので、そこでまず試行錯誤した。

http://d.hatena.ne.jp/mkouhei/20090214/1234542872

ext2をつかえるようにする。

インストールした後、今度はchumbyで読めるかどうかを試したところchumbyってばext2を読めないのですな。仕方ないのでDebianをvfatフォーマットにコピーしようとしたところ、symlink作れずに失敗する。ダメ元でd-iでのインストールも試してみたが、/ファイルシステムにvfatを選択するとインストールプロセスが進まないのですな。仕方ないので、USBメモリにvfat領域とext2領域を作り、ext2領域にLennyを再インストールした。

ext2を組み込んでchumbyのkernelをリビルドする。

Let’s note R3やMacBook AirのSid環境に、Chumby用の開発ツールをtarで展開して突っ込む、のは嫌なので以前作成したLennyのイメージを最新状態にし、それをベースにchumby用の環境のスナップショットを作った。要らなくなれば捨てれば良いし。

(host)$ qemu-img create -b lenny.img -f qcow lenny-tmp.img
Formatting 'lenny-tmp.img', fmt=qcow, backing_file=lenny.img, size=4194304 kB

これをKVM/QEMUでブートして、sshでログインする。

(host)$ kvm -hda lenny-tmp.img -boot c -m 384 -localtime -monitor stdio -redir tcp:2222::22
(host)$ ssh -p 2222 localhost

chumby用のカーネル構築環境をダウンロードして展開する。手順はWikiにそってやれば良し。

http://wiki.chumby.com/mediawiki/index.php/GNU_Toolchain

http://wiki.chumby.com/mediawiki/index.php/GCC_Toolchain

(guest)$ wget -c http://files.chumby.com/resources/Gcc-3.3.2-glibc-2.3.2.tar.gz
(guest)$ wget -c http://files.chumby.com/toolchain/arm-linux-v4.1.2b.tar.gz
(guest)$ cd /
(guest)$ sudo tar zxf ~/arm-linux-v4.1.2b.tar.gz
(guest)$ sudo tar zxf ~/Gcc-3.3.2-glibc-2.3.2.tar.gz
(guest)$ sudo mkdir -p /opt/Embedix/usr/local/arm-linux
(guest)$ sudo ln -s /usr /opt/Embedix/usr/local/arm-linux/gcc-3.3.2-glibc-2.3.2
(guest)$ sudo vi /usr/bin/arm-linux-make
(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 "$@"
(EOF)
(guest)$ sudo chmod +x /usr/bin/arm-linux-make

chumby用のkernelをダウンロードして、再構築する。ジークスから販売開始直後に購入したchumbyだが、こいつのファームウェアは1.6なので、Wikiの1.6の手順を実施した。

http://wiki.chumby.com/mediawiki/index.php/Hacking_Linux_for_chumby

最低限、以下のdebパッケージは導入しておく必要あり。

  • make
  • gcc [1]
  • libncurses5-dev
  • libncursesw5-dev
  • zip

ext2を有効にするには、make menuconfigを実行して組込みにしておく必要あり。 [2]

(guest)$ cd
(guest)$ mkdir kernel
(guest)$ cd kernel
(guest)$ wget -c http://files.chumby.com/source/ironforge/build396/align.pl
(guest)$ wget -c http://files.chumby.com/source/ironforge/build733/linux-2.6.16-chumby-1.6.0.tar.gz
(guest)$ tar zxf linux-2.6.16-chumby-1.6.0.tar.gz
(guest)$ cd linux-2.6.16-chumby-1.6.0
(guest)$ ARCH=arm BOARD=mx21ads CROSS_COMPILE=arm-linux- make menuconfig
(guest)$ ARCH=arm BOARD=mx21ads CROSS_COMPILE=arm-linux- make
(guest)$ perl ../align.pl arch/arm/boot/zImage
(guest)$ zip k1.bin.zip arch/arm/boot/zImage

kernel/linux-2.6.16-chumby-1.6.0/ディレクトリ直下に、k1.bin.zipが生成されるので、これをホストOS側に持ってくる。

(host)$ scp -P 2222 localhost:kernel/linux-2.6.16-chumby-1.6.0/k1.bin.zip .

先ほど用意したUSBメモリのうち、vfat領域にk1.bin.zipをコピーしておく。

$ 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をアップデートする。

  1. chumbyの電源をOFFにした状態でUSBメモリを挿す。
  2. タッチスクリーンを押したまま、電源を入れる。途中で押したままにするとspecial option modeになるよ、と表示されるのでそのまま押しつづける。
  3. special option modeのメニュー画面で”install updates”をクリックする。
  4. “Install from USB flash drive”をクリックすると、kernelがアップデートされ、自動的に再起動される。

再起動後にsshdを起動させ、ログインするとvfat領域だけでなく、ext2領域も自動的にマウントされることに気づく。vfat領域にdebugchumbyをおいて、mountさせてやらんとアカンかなぁと思ってたので意外。

# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/mtdblock5           33.0M     33.0M         0 100% /
none                     30.2M     16.0k     30.2M   0% /dev
none                     32.0M    552.0k     31.5M   2% /tmp
none                     32.0M     60.0k     31.9M   0% /var
none                     32.0M         0     32.0M   0% /mnt
/dev/mtdblock1            2.0M      1.6M    444.0k  78% /psp
/dev/sda1               475.5M      1.4M    474.1M   0% /mnt/usb
/dev/sda2                 1.3G    443.9M    825.9M  35% /mnt/usb2
# ls /mnt/usb2
bin         home        mnt         sbin        tmp
boot        lib         opt         selinux     usr
dev         lost+found  proc        srv         var
etc         media       root        sys
# cat /mnt/usb2/etc/debian_version
5.0

chrootを試してみるが…。

# chroot /mnt/usb2/
Illegal instruction

なんてこった。ダメじゃん…。さてどうするかなぁ…。chrootで逃げようとしたのが裏目に出たか…。とりあえず、chumbyのkernelリビルドは意外に簡単で、かつちゃんと動いてくれたのは一安心だけどね。

[1]クロスコンパイル用のgccを入れているんだから要らないんじゃねぇかなぁ…。
[2]モジュールでも良いけど。