BeagleBone BlackにAndroidをインストールする
この記事は、Androidアドベント・カレンダーの12月2日分の記事です。
BeagleBone Blackとは
BeagleBone Blackは、5000円以下で購入できる名刺サイズのボードです。
beagleboad.orgによって、オープンハードウエアとして開発されており、日本でも簡単に入手できます。
SoCにARM Cortex-A8 1GHzのTI AM335xを採用していて、DRAMも512MB搭載されています。
手のひらに乗るような、とても小さなボードですが、Androidだけでなく、UbuntuやDebianなどのLinux環境も動作させることもできます。出荷状態では、Linuxディストリビューションとして、Angstromがインストールされています。
世間では、RasPiが人気ですが、価格は数百円差で、動画の再生をする場合を除いては、トータルなパフォーマンスはBeagleBone Blackのほうに分があります。
BeagleBone Blackについての詳細な情報は、以下のサイトを見てみてください。
- beagleboard.orgのBeagleBone Blackページ
- BeagleBone BlackでAndroidの下回りを学ぼう (公開版)
- BeagleBone Black Breakers
日経Linuxなどの記事で常連の米田さんによる書籍も出ています。
Androidのインストール
BeagleBone Blackに、Androidをインストールしてみましょう。
作業環境はUbuntu 12.04を使っています。
一番シンプルな方法は、SoC製造元のTIで配布しているバイナリを、SDカードに焼いて起動することです。
TIでは、BeagleBone Blackを対象に、AM335xについてのサポートページの中で、自社製のボードと同様のサポート情報を提供しています。
TIのサポートページは、日本語のページもありますが、情報が少ないので英語ページを見ます。
ビルド済みイメージファイルの取得
英語のページから、以下のDev Kitのページを開きます。現在の最新版は、Android 4.2.2です。
ページの下のほうに、"Pre-built Images"の項目があり、そこにBeagleBone Blackのリンクがありますので、そこをクリックしてダウンロードします。ここでは、wgetコマンドを使ってダウンロードしました。
~$ mkdir bbb
~$ cd bbb
~/bbb$ wget http://downloads.ti.com/sitara_android/esd/TI_Android_DevKit/TI_Android_JB_4_2_2_DevKit_4_1_1/exports/TI_Android_JB_4.2.2_DevKit_4.1.1_beagleboneblack.tar.gz
ダウンロードしたアーカイブを展開します。展開してできたbeagleboneblackを見てみましょう。
~/bbb$ tar zxf ../TI_Android_JB_4.2.2_DevKit_4.1.1_beagleboneblack.tar.gz
~/bbb$ cd beagleboneblack/
~/bbb/beagleboneblack$ ls
Boot_Images Filesystem Media_Clips README.txt START_HERE mkmmc-android.sh
ディレクトリが4つと、README、実行用のシェルスクリプトファイルが入っています。それぞれの内容を見てみましょう。
Boot_Imagesディレクトリには、4つのファイルが入っています。
~/bbb/temp/beagleboneblack$ cd Boot_Images/
~/bbb/temp/beagleboneblack/Boot_Images$ ls
MLO u-boot.img uEnv.txt uImage
MLOは、初期起動プログラムです。MLOは、第二弾のブートローダーであるu-boot.imgをロードして起動します。uEnv.txtは、u-boot用の設定ファイルです。uImageは、u-bootから起動するLinux kernelで、u-bootから起動できるようにヘッダが付けられたものです。
Filesystemディレクトリには、rootfs.tar.bz2が1つだけ入っていました。これは、Androidのrootファイルシステムのアーカイブです。
~/bbb/temp/beagleboneblack/Boot_Images$ cd ../Filesystem/
~/bbb/temp/beagleboneblack/Filesystem$ ls
rootfs.tar.bz2
Media_Clipsディレクトリには、画像、音声、動画などのサンプルファイルが入っています。
~/bbb/temp/beagleboneblack/Filesystem$ cd ../Media_Clips/
~/bbb/temp/beagleboneblack/Media_Clips$ ls
Audio Images Video
START_HEREディレクトリには、UserGuideのHTMLファイルが入っています。
~/bbb/temp/beagleboneblack/Media_Clips$ cd ../START_HERE/
~/bbb/temp/beagleboneblack/START_HERE$ ls
Setup.htm Setup_files
README.txtには、SDカードや、内蔵eMMCへのAndroidの書き込み方法が書かれてます。基本的には、mkmmc-android.shスクリプトで行います。
README for preparing SD/MMC/Micro-SD CARD for booting Android
Pre-Requesites
- Need to have an SD/MMC/Micro-SD card with atleast 2GB of size.
- The script needs to be invoked from ubuntu linux machine 8.04 or above.
- User needs to have sudo privileges.
(略)
ビルド済みイメージファイルをSDカードに書き込む
インストール用のmicroSDカードを用意します。容量は2GB以上のものが必要です。ここでは8GBのものを用意しました。
microSDカードは、USBカードリーダーに差し込んで、PCに差し込みます。dmesgコマンドの出力を見ると、認識したデバイス名がわかります。この場合、sdcとして認識しています。
[ 7255.526629] scsi 2:0:0:0: Direct-Access Generic STORAGE DEVICE 9404 PQ: 0 ANSI: 0
[ 7255.529122] sd 2:0:0:0: Attached scsi generic sg2 type 0
[ 7255.638698] sd 2:0:0:0: [sdc] 15278080 512-byte logical blocks: (7.82 GB/7.28 GiB)
[ 7255.640317] sd 2:0:0:0: [sdc] Write Protect is off
[ 7255.640328] sd 2:0:0:0: [sdc] Mode Sense: 03 00 00 00
[ 7255.641933] sd 2:0:0:0: [sdc] No Caching mode page present
[ 7255.641944] sd 2:0:0:0: [sdc] Assuming drive cache: write through
[ 7255.647113] sd 2:0:0:0: [sdc] No Caching mode page present
[ 7255.647123] sd 2:0:0:0: [sdc] Assuming drive cache: write through
[ 7255.649898] sdc: sdc1
[ 7255.654226] sd 2:0:0:0: [sdc] No Caching mode page present
[ 7255.654237] sd 2:0:0:0: [sdc] Assuming drive cache: write through
[ 7255.654243] sd 2:0:0:0: [sdc] Attached SCSI removable disk
インストールスクリプトは、日本語シェル環境ではうまく動作しないので、まずは設定を変更しておきます。sdcへの書き込みを行います。
~/bbb/temp/beagleboneblack$ export LANG=C
~/bbb/temp/beagleboneblack$ sudo ./mkmmc-android.sh /dev/sdc
sudoのパスワード確認の後、sdcで間違いないか確認が出ます。間違いなければ、yとリターンを入れます。書き込みにはやや時間がかかります。
Assuming Default Locations for Prebuilt Images
All data on /dev/sdc now will be destroyed! Continue? [y/n]
y
[Unmounting all existing partitions on the device ]
umount: /dev/sdc: not mounted
umount: /dev/sdc1: not mounted
[Partitioning /dev/sdc...]
Disk /dev/sdc doesn't contain a valid partition table
DISK SIZE - 7822376960 bytes
CYLINDERS - 951
[Making filesystems...]
[Copying files...]
[Copying START_HERE folder to boot partition]
[Done]
Doneが表示されたら作業は終わりです。
Android起動用SDカードの内容
作成したSDカードの中身を見てみましょう。
$ sudo fdisk -l /dev/sdc
Disk /dev/sdc: 7822 MB, 7822376960 bytes
255 heads, 63 sectors/track, 951 cylinders, total 15278080 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Device Boot Start End Blocks Id System
/dev/sdc1 * 63 144584 72261 c W95 FAT32 (LBA)
/dev/sdc2 144585 3951989 1903702+ 83 Linux
/dev/sdc3 3951990 7759394 1903702+ 83 Linux
/dev/sdc4 7759395 15277814 3759210 c W95 FAT32 (LBA)
中は4つのパーティションに分かれています。
- sdc1: 起動用のパーティション
- sdc2: rootfs: Androidのシステム
- sdc3: usrdata Android用の内蔵データ領域
- sdc4: data AndroidのSDカード相当の外部データ領域
sdc1の内容は、起動ファイル以外にも、START_HEREディレクトリがコピーされていました。u-bootの設定ファイルの中も見ておきます。
$ sudo mount /dev/sdc1 /media
$ ls /media/
MLO START_HERE u-boot.img uEnv.txt uImage
$ cat /media/uEnv.txt
bootargs=console=ttyO0,115200n8 androidboot.console=ttyO0 mem=512M root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait init=/init ip=off
bootcmd=mmc rescan ; fatload mmc 0 81000000 uImage ; bootm 81000000
uenvcmd=boot
$ sudo umount /media/
sdc2の内容は、rootfs.tar.bz2が展開されたものです。
$ sudo mount /dev/sdc2 /media
$ ls /media/
data init.am335xevm.rc init.usb.rc system
default.prop init.am335xevm.usb.rc lost+found ueventd.am335xevm.rc
dev init.goldfish.rc proc ueventd.goldfish.rc
fstab.am335xevm init.rc sbin ueventd.rc
init init.trace.rc sys
$ sudo umount /media/
sdc3の内容は、からっぽです。
$ sudo mount /dev/sdc3 /media
$ ls /media/
lost+found
$ sudo umount /media
sdc4の内容は、Media_Clipsディレクトリの内容がコピーされていました。
$ sudo mount /dev/sdc4 /media
$ ls /media/
Audio Images Video
$ sudo umount /media
BeagleBone BlackでAndroidを起動する
BeagleBone Blackに、作成したmicroSDカードを挿入し、microHDMI-HDMIアダプタを接続し、HDMIモニタに接続します。今回はUSB給電するため、付属のminiUSBから給電接続します。
ANDROIDロゴが表示されて、Androidが起動します...
ロゴループして起動しないじゃん... orz
と、思ったら、初回起動にえらく時間がかかっただけでした。気長に待ってください。
起動してしまえば、あとは普通にAndroidです。マウスやキーボードをつないで使ってみてください。