beagleboardでSDカードの抜き差しを減らす

beagleboardでAndroidのイメージを変更するたびに、SDカードにイメージをコピーして
起動しなおすのが面倒なので、chrootを使ってイメージを切り替えることにチャレンジしてみました。


1. beagleboardにUbuntuを入れる

http://elinux.org/BeagleBoardUbuntu を参考にしてubuntuのイメージを作成してください。

armのイメージ作成がFedoraでは無理だったので、今回は、VirtualBox にubuntuを入れて対応しました。
ubuntuにインストールに必要なツールを入れる

$ sudo apt-get install qemu
$ sudo apt-get install uboot-mkimage
$ sudo apt-get install rootstock
$ wget http://launchpad.net/project-rootstock/trunk/0.1.99.4/+download/rootstock-0.1.99.4.tar.gz

rootstockは、apt-getでもインストールできたのでが、バグがあるみたいなので
最新のソースをwgetでダウンロードしたものを使用しました。
実際、イメージの作成途中で止まったままになりました。

rootstockをインストールに合わせて依存関係のあるツールも一緒に入れる必要があったのですが、
調べるのが面倒だったので使わないけどあえて、apt-getでもrootstockをインストールしています。
PATHをwgetで取得した方を先に通すようにして使っています。
依存関係のあるパッケージは、qemu-extra-** とかだったような…

イメージを作成します。openssh-serverは必要なので必ず入れて下さい。その他は、お好きにしてください。

$ sudo ./rootstock --fqdn omap --login  --password   --imagesize 4G --seed  wget,nano,linux-firmware,wireless-tools,usbutils,xserver-xorg-core,xinit,xterm,wpasupplicant,openssh-server  --dist maverick --serial ttyS2 --components "main universe multiverse"  --kernel-image  http://rcn-ee.net/deb/maverick/v2.6.35.9-l8/linux-image-2.6.35.9-l8_1.0maverick_armel.deb

しばらく待つと下記のファイルが作成されます。

armel-rootfs-201101030333.tgz
initrd.img-2.6.35.9-l8
vmlinuz-2.6.35.9-l8

次にuImage,uInitrdの作成をします。

$ mkimage -A arm -O linux -T kernel -C none -a 0x80008000 -e 0x80008000 -n "Linux" -d ./vmlinuz-* ./uImage
$ mkimage -A arm -O linux -T ramdisk -C none -a 0 -e 0 -n initramfs -d ./initrd.img-* ./uInitrd

実際には、使わないので作成しなくても良いと思いますが、動作確認用に作成しました。

SDカードへuImage, uInitrd をコピーしてネットワークへの接続、sshでのログインが確認できました。


2. カーネルをAndroidのカーネルに置き換える

ubuntuのカーネルをandroidのカーネルに置き換えます。
※カーネルのバージョンがあっていないけど、気にせずに置き換えます。
今回は、USB-LANアダプタ、無線LANアダプタを使いたいのでコンフィグを有効にしておきます。

$ANDROIDをandroidのソースのルートディレクトリとして説明します。
$ANDROID以下のkernelのディレクトリに移動します

Androidのkernelのディレクトリに移動します。

$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- uImage clean
$ make ARCH=arm  CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-  defconfig  menuconfig

コンフィグで下記の設定を有効にする。
これは、必要なものを環境に合わせて設定して下さい。

[Device Drivers]->[Network device support]->[USB Network Adapters]
ASIX AX88xxx Based USB 2.0 Ethernet Adapters をチェック

[Device Drivers]->[Network device support]->[Wireless LAN]->
->[Wireless LAN (IEEE 802.11)]->[Ralink driver support]
Ralink rt2800 (USB) support をチェック

[*]で、built-in を選択しておく。

$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- uImage modules

SDカードのデータを、できあがった uImageに置き換える。uInitrd は、削除してください。


3. Androidのイメージを転送する

SDカードをbeagleboardに挿入して起動すれば、linuxが起動するはず。

NICが見えているか確認します。起動時のログで、認識していることがわかるけど、いろいろ確認してみる

$ dmesg
$ ifconfig -a

eth0が見えていたので、DHCPでIP取得してみる。

$ sudo dhclient eth0

たぶん、IP取れると思います。取れなかったら各自で解決して下さい。
ホストマシンから、sshでログインしてみる。

$ ssh <username>@<IPaddress>

ログインできることを確認できたので、ホストマシンから、
beagleboardにAndroidのイメージを転送してみる

$ cd $ANDROID/vendor/sola/omap3/image/beagleboard
$ scp -r android <username>@<IPaddress>:/home/<username>

4. Androidを起動する

beagleboard にログインして、ホームディレクトリに先ほどコピーしたandroidディレクトリがあることを確認
chroot で、android ディレクトリをルートディレクトリに設定します。

$ sudo chroot /home/<username>/android /init

androidが起動しました。でもなんか不安定な感じが・・・

コメント 停止中