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が起動しました。でもなんか不安定な感じが・・・