マルチプラットフォームとマルチデバイスの実証
Mitsutaka Amano
MIRACLE LINUX CORPORATION
2010/12/09 Copyright(c)2000-2010 MIRACLE LINUX CORPORATION. All Rights Reserved. 2
何やってる人?
● 執筆活動
● 日経Linux ライター
● 情報処理学会 会誌「情報処理」10月号「Google Chrome OSの構成から見るセキュリティ対策」
● 講演活動
● Open Source Conference
● LinuxCon Japan 2010
● Japan Linux Conference 2010
● MeeGo関連各種等
何やってる人?
● コミュニティ活動
● Moblin
–
開発ツールのメンテナ、日本語化作業、各種講演等● MeeGo
–
Netbook 日本語版イメージ公開–
各種H/Wへの移植等● 仕事
● 組込み系Linuxプラットフォームの開発
● tweet on @mitsutaka_amano
概要
概要
● MeeGoの特徴はいろいろあります
● アプリケーション標準APIとしてQt
● MTF(MeeGo Touch Framework)
● x86, ARMプラットフォームサポート
2010/12/09 Copyright(c)2000-2010 MIRACLE LINUX CORPORATION. All Rights Reserved. 6
概要
● マルチプラットフォームサポートの意味
● x86 ... SSSE3命令セットサポート以上のIA
–
Atom, Core 2等● ARMv7(SoCs)
–
Freescale i.MX51–
TI OMAP3–
Marvell Dove/Armada–
Qualcomm Snapdragon–
NVIDIA Tegra–
などなど概要
● 使われているモノ
● Atom, Core 2
–
ネットブック、ラップトップ、IA組み込みボード● Freescale i.MX51
–
SHARP Netwalker(Ubuntu)● TI OMAP3
–
Nokia N900(Maemo5)● Marvell Dove/Armada
–
Quanta EBOX● Quallcomm Snapdragon
–
NexusOne, HTC Desire..(Android)● NVIDIA Tegra
–
LuvPad, Dynabook AZ..(Android)2010/12/09 Copyright(c)2000-2010 MIRACLE LINUX CORPORATION. All Rights Reserved. 8
概要
● 世の中にある多くの製品でMeeGoが動作する
● 様々なターゲットデバイスで利用できる
これがMeeGoの特徴
テーマ
● どうやって移植するのか?
● 既に別のOSが動いている製品でも移植 可能なのか?
● Android端末等
2010/12/09 Copyright(c)2000-2010 MIRACLE LINUX CORPORATION. All Rights Reserved. 10
Agenda
● Android端末の特徴を知る
● 移植方法
● 移植例: NexusOne
● 今後の課題/他のケース
● まとめ
Android端末の特徴を知る
2010/12/09 Copyright(c)2000-2010 MIRACLE LINUX CORPORATION. All Rights Reserved. 12
Android端末の特徴
● MTD(Memory Technology Device)を使ってフラッシュメモリに パーティションを構築
$ cat /proc/mtd
dev: size erasesize name mtd0: 000e0000 00020000 "misc"
mtd1: 00500000 00020000 "recovery"
mtd2: 00280000 00020000 "boot"
mtd3: 09100000 00020000 "system"
mtd4: 05f00000 00020000 "cache"
mtd5: 0c440000 00020000 "userdata"
例: Nexus One
Android端末の特徴
● Android独自の用途別に従ってパーティション分けされている
$ cat /proc/mtd
dev: size erasesize name mtd0: 000e0000 00020000 "misc"
mtd1: 00500000 00020000 "recovery"
mtd2: 00280000 00020000 "boot"
mtd3: 09100000 00020000 "system"
mtd4: 05f00000 00020000 "cache"
mtd5: 0c440000 00020000 "userdata"
起動時のスプラッシュ画面等
Android復元/アップデート時の起動パー ティション
通常の起動パーティション
実行ファイル(Androidアプリ)、ライブラリ等 の読み込み用途のファイル
ダウンロードファイルのキャッシュ等 ユーザーの設定情報(ブックマーク、メール
、電話帳、接続済みAP情報等)
2010/12/09 Copyright(c)2000-2010 MIRACLE LINUX CORPORATION. All Rights Reserved. 14
Android端末の特徴
● recovery, bootそれぞれにカーネルイメージ、カーネルパラ メータ、initrdが組み込まれている
$ cat /proc/mtd
dev: size erasesize name mtd0: 000e0000 00020000 "misc"
mtd1: 00500000 00020000 "recovery"
mtd2: 00280000 00020000 "boot"
mtd3: 09100000 00020000 "system"
mtd4: 05f00000 00020000 "cache"
mtd5: 0c440000 00020000 "userdata"
起動時のスプラッシュ画面等
Android復元/アップデート時の起動パー ティション
通常の起動パーティション
実行ファイル(Androidアプリ)、ライブラリ等 の読み込み用途のファイル
ダウンロードファイルのキャッシュ等 ユーザーの設定情報(ブックマーク、メール
、電話帳、接続済みAP情報等)
zImage + cmdline + initrd zImage + cmdline + initrd
Android端末の特徴
● initrdをルートファイルシステムとして利用する
● /proc, /dev, /systemなど各種必要なディレクトリをマウント
zImage + cmdline + initrd
rootfs / rootfs ro ...
tmpfs /dev tmpfs rw ...
devpts /dev/pts devpts rw ...
proc /proc proc rw ...
sysfs /sys sysfs rw ...
/dev/block/mtdblock3 /system yaffs2 ro ...
/dev/block/mtdblock4 /cache yaffs2 rw ...
/dev/block/mtdblock5 /data yaffs2 rw ...
/dev/block/mmcblk0p1 /mnt/sdcard vfat rw ....
...
フラッシュメモリ上のsystem, cache, dataをyaffs2でマウント
SDカードのマウント
移植方法
移植方法:考え方
● 二つの視点で考える
● カーネルのロード方法
–
どこから起動できるのか?–
どの起動方法がベストプラクティスか?● ルートファイルシステムの場所
–
どこに置けるか?–
どれだけの容量が必要なのか?How?
Where?
2010/12/09 Copyright(c)2000-2010 MIRACLE LINUX CORPORATION. All Rights Reserved. 18
dev: size erasesize name mtd0: 000e0000 00020000 "misc"
mtd1: 00500000 00020000 "recovery"
mtd2: 00280000 00020000 "boot"
mtd3: 09100000 00020000 "system"
mtd4: 05f00000 00020000 "cache"
mtd5: 0c440000 00020000 "userdata"
カーネルのロード方法:その1
● boot領域を上書きする
● 電源ONでそのまま起動
● 効果
–
端末単体で起動できる–
最も簡単な起動方法● 懸念点
–
Androidが起動できなくなるカーネルのロード方法:その2
zImage
dev: size erasesize name mtd0: 000e0000 00020000 "misc"
mtd1: 00500000 00020000 "recovery"
mtd2: 00280000 00020000 "boot"
mtd3: 09100000 00020000 "system"
mtd4: 05f00000 00020000 "cache"
mtd5: 0c440000 00020000 "userdata"
● PC経由からカーネル転送、ロード
● fastbootコマンドでzImageを転送
● 効果
–
フラッシュメモリ上には影響がない–
Androidの環境は保持される● 懸念点
–
起動するたびにPCが必要になる2010/12/09 Copyright(c)2000-2010 MIRACLE LINUX CORPORATION. All Rights Reserved. 20
dev: size erasesize name mtd0: 000e0000 00020000 "misc"
mtd1: 00500000 00020000 "recovery"
mtd2: 00280000 00020000 "boot"
mtd3: 09100000 00020000 "system"
mtd4: 05f00000 00020000 "cache"
mtd5: 0c440000 00020000 "userdata"
カーネルのロード方法:その3
● recovery領域を上書きする
● 電源ON→リカバリモードで起動
● 効果
–
端末単体で起動できる–
Androidとのデュアルブート化● 懸念点
–
recovery領域からAndroidの復元/アップデートができ なくなるdev: size erasesize name mtd0: 000e0000 00020000 "misc"
mtd1: 00500000 00020000 "recovery"
mtd2: 00280000 00020000 "boot"
mtd3: 09100000 00020000 "system"
mtd4: 05f00000 00020000 "cache"
mtd5: 0c440000 00020000 "userdata"
ルートファイルシステムの場所:その1
● system領域
● yaffs2のファイルシステムイメージを作成
● fastbootで上書き
● 効果
–
system領域のみでルートファイルシステムを構築でき る● 懸念点
–
Androidが起動できなくなる2010/12/09 Copyright(c)2000-2010 MIRACLE LINUX CORPORATION. All Rights Reserved. 22
dev: size erasesize name mtd0: 000e0000 00020000 "misc"
mtd1: 00500000 00020000 "recovery"
mtd2: 00280000 00020000 "boot"
mtd3: 09100000 00020000 "system"
mtd4: 05f00000 00020000 "cache"
mtd5: 0c440000 00020000 "userdata"
ルートファイルシステムの場所:その2
● userdata領域
● yaffs2のファイルシステムイメージを作成
● fastbootで上書き
● 効果
–
userdata領域のみでルートファイルシステムを構築で きる–
system領域よりちょっと大きい● 懸念点
–
Android上のユーザーデータが保証できなくなるルートファイルシステムの場所:その3
dev: size erasesize name mtd0: 000e0000 00020000 "misc"
mtd1: 00500000 00020000 "recovery"
mtd2: 00280000 00020000 "boot"
mtd3: 09100000 00020000 "system"
mtd4: 05f00000 00020000 "cache"
mtd5: 0c440000 00020000 "userdata"
● SDカード
● PC上でルートファイルシステムを書き込む
● ext2, ext3, ext4ファイルシステムで作成
● 効果
–
フラッシュメモリ上には影響がない–
GB単位で十分なスペースを確保できる● 懸念点
–
SDカードが必要(強いて言えば)2010/12/09 Copyright(c)2000-2010 MIRACLE LINUX CORPORATION. All Rights Reserved. 24
移植方法:まとめ
system領域 userdata領域 SDカード
bootから起動 Androidとの完全な
置き換え
ディスク領域小
Android起動不可
ディスク領域中 Androidとのデュア
ルブート化 ディスク領域大
recoveryから起動Android起動不可
ディスク領域小 Android起動不可
ディスク領域中 Androidとのデュア
ルブート化 ディスク領域大
PCから起動 Android起動不可
ディスク領域小 Android起動不可
ディスク領域中 フラッシュメモリを
一切使わない最も 安全な方法
ディスク領域大
移植例:NexusOne
2010/12/09 Copyright(c)2000-2010 MIRACLE LINUX CORPORATION. All Rights Reserved. 26
移植例: NexusOne
dev: size erasesize name mtd0: 000e0000 00020000 "misc"
mtd1: 00500000 00020000 "recovery"
mtd2: 00280000 00020000 "boot"
mtd3: 09100000 00020000 "system"
mtd4: 05f00000 00020000 "cache"
mtd5: 0c440000 00020000 "userdata"
● MeeGo 1.1, Android 2.2.1デュアルブート
● 以下の組み合わせで移植
● カーネルのロード方法 その3(boot領域からの起動)
● ルートファイルシステムの場所 その3(SDカード)
● 更にrecovery領域をAndroidのboot領域に置き換え
準備: ハードウェア
dev: size erasesize name mtd0: 000e0000 00020000 "misc"
mtd1: 00500000 00020000 "recovery"
mtd2: 00280000 00020000 "boot"
mtd3: 09100000 00020000 "system"
mtd4: 05f00000 00020000 "cache"
mtd5: 0c440000 00020000 "userdata"
● NexusOne本体
● PC(Ubuntu 10.04)
● USB-microUSBケーブル
● SDカード
● mmcblk0p1 ... vfat(Androidのメディア保存用)
● mmcblk0p2 ... ext3(MeeGoルートファイルシステム)
2010/12/09 Copyright(c)2000-2010 MIRACLE LINUX CORPORATION. All Rights Reserved. 28
準備: ソフトウェア
dev: size erasesize name mtd0: 000e0000 00020000 "misc"
mtd1: 00500000 00020000 "recovery"
mtd2: 00280000 00020000 "boot"
mtd3: 09100000 00020000 "system"
mtd4: 05f00000 00020000 "cache"
mtd5: 0c440000 00020000 "userdata"
● Androidビルド済みソースツリー
● fastboot
● Android端末の制御ツール
● <Androidのソースツリー>/out/host/linux- x86/bin/fastboot
● mic2
● MeeGoのイメージ作成ツール
● /etc/apt/sources.listに以下を記述
– deb http://repo.meego.com/tools/repos/ubuntu/10.04/ /
●
$ sudo apt-get update; apt-get install mic2
手順1: MeeGoルートファイルシステムの構築
dev: size erasesize name mtd0: 000e0000 00020000 "misc"
mtd1: 00500000 00020000 "recovery"
mtd2: 00280000 00020000 "boot"
mtd3: 09100000 00020000 "system"
mtd4: 05f00000 00020000 "cache"
mtd5: 0c440000 00020000 "userdata"
● kickstartファイルの入手
● http://wiki.meego.com/images/Meego-handset-armv7l- nexusone-1.1.ks
● mic2実行
● $ sudo LANG=C mic-image-creator -c meego-handset-armv7l-nexusone-
1.1.ks -f loop --run-mode=0 --arch=armv7l
2010/12/09 Copyright(c)2000-2010 MIRACLE LINUX CORPORATION. All Rights Reserved. 30
手順1: MeeGoルートファイルシステムの構築
dev: size erasesize name mtd0: 000e0000 00020000 "misc"
mtd1: 00500000 00020000 "recovery"
mtd2: 00280000 00020000 "boot"
mtd3: 09100000 00020000 "system"
mtd4: 05f00000 00020000 "cache"
mtd5: 0c440000 00020000 "userdata"
● パーティション作成
● mmcblk0p1 ... vfat(Androidのメディア保存用)
● mmcblk0p2 ... ext3(MeeGoルートファイルシステム)
● microSDへコピー
●
tar xvf meego-handset-armv7l-nexusone-1.1-<タイムスタンプ>-rootfs.tar.gz
-C <microSDのマウントポイント>
手順2: カーネルの作成
dev: size erasesize name mtd0: 000e0000 00020000 "misc"
mtd1: 00500000 00020000 "recovery"
mtd2: 00280000 00020000 "boot"
mtd3: 09100000 00020000 "system"
mtd4: 05f00000 00020000 "cache"
mtd5: 0c440000 00020000 "userdata"
boot.img
zImage + cmdline + initrd
● MSM(Qualcomm Mobile Station Modem)向けAndroidカーネル を使用する
● git://android.git.kernel.org/kernel/msm.git
● android-msm-2.6.32ブランチを使用する
● NexusOne Android 2.2と同等のカーネル
● $ git clone git://android.git.kernel.org/kernel/msm.git -b android-msm-2.6.32
android-msm-2.6.32
2010/12/09 Copyright(c)2000-2010 MIRACLE LINUX CORPORATION. All Rights Reserved. 32
手順2: カーネルの作成
dev: size erasesize name mtd0: 000e0000 00020000 "misc"
mtd1: 00500000 00020000 "recovery"
mtd2: 00280000 00020000 "boot"
mtd3: 09100000 00020000 "system"
mtd4: 05f00000 00020000 "cache"
mtd5: 0c440000 00020000 "userdata"
boot.img
zImage + cmdline + initrd
● kernel configuration
● テンプレートとしてmahimahi_defconfigを使用
– $ cp arch/arm/configs/mahimahi_defconfig .config
● initrdを使わないので以下を無効にする
– # CONFIG_BLK_DEV_INITRD is not set
● X.Orgを使うので、Virtual Terminal(仮想端末)を有効にす る
–
CONFIG_VT=y
–
CONFIG_CONSOLE_TRANSLATIONS=y
–
CONFIG_VT_CONSOLE=y
–
CONFIG_VT_HW_CONSOLE_BINDING=y
手順2: カーネルの作成
dev: size erasesize name mtd0: 000e0000 00020000 "misc"
mtd1: 00500000 00020000 "recovery"
mtd2: 00280000 00020000 "boot"
mtd3: 09100000 00020000 "system"
mtd4: 05f00000 00020000 "cache"
mtd5: 0c440000 00020000 "userdata"
boot.img
zImage + cmdline + initrd
● コンパイル
● Androidのprebuiltにあるクロスコンパイラを使用
–
git://android.git.kernel.org/platform/prebuilt.git
● パスを通す
– $ export PATH=$PATH:<Androidのソースツリー>/prebuilt/linux-
x86/toolchain/arm-eabi-4.4.0/bin
● make
– $ make oldconfig ARCH=arm CROSS_COMPILE=arm-eabi-
– $ make zImage modules ARCH=arm CROSS_COMPILE=arm-eabi-
2010/12/09 Copyright(c)2000-2010 MIRACLE LINUX CORPORATION. All Rights Reserved. 34
手順3: MeeGo用boot.imgの作成
dev: size erasesize name mtd0: 000e0000 00020000 "misc"
mtd1: 00500000 00020000 "recovery"
mtd2: 00280000 00020000 "boot"
mtd3: 09100000 00020000 "system"
mtd4: 05f00000 00020000 "cache"
mtd5: 0c440000 00020000 "userdata"
boot.img
zImage + cmdline + initrd
● boot.imgとは
● boot領域、recovery領域で使えるイメージファイル
● kernel(zImage) + cmdline + initrdの結合
● mkbootimgコマンドで作成する
–
git://android.git.kernel.org/platform/system/core.git
手順3: MeeGo用boot.imgの作成
dev: size erasesize name mtd0: 000e0000 00020000 "misc"
mtd1: 00500000 00020000 "recovery"
mtd2: 00280000 00020000 "boot"
mtd3: 09100000 00020000 "system"
mtd4: 05f00000 00020000 "cache"
mtd5: 0c440000 00020000 "userdata"
boot.img
zImage + cmdline + initrd
● boot.imgの材料を揃える
● kernel(zImage)
–
手順2で作ったzImage● cmdline
–
init=/sbin/init rootwait root=/dev/mmcblk0p2 rootfstype=ext3 rw noinitrd
● root= ... ルートファイルシステムの場所
● noinitrd ... initrdを使わない
● initrd
–
空のinitrdを作成する– $ echo -n | sudo cpio -o -H newc | sudo gzip > boot.img-ramdisk-
meego.cpio.gz
2010/12/09 Copyright(c)2000-2010 MIRACLE LINUX CORPORATION. All Rights Reserved. 36
手順3: MeeGo用boot.imgの作成
dev: size erasesize name mtd0: 000e0000 00020000 "misc"
mtd1: 00500000 00020000 "recovery"
mtd2: 00280000 00020000 "boot"
mtd3: 09100000 00020000 "system"
mtd4: 05f00000 00020000 "cache"
mtd5: 0c440000 00020000 "userdata"
boot.img
zImage + cmdline + initrd
● boot.imgを作成する
● $ mkbootimg --cmdline 'init=/sbin/init rootwait root=/dev/mmcblk0p2
rootfstype=ext3 rw noinitrd' --kernel zImage --ramdisk boot.img-ramdisk- meego.cpio.gz --base 0x20000000 -o boot.img-meego
–
--cmdline ... 前述のcmdlineを記述–
--kernel ... 前述のzImageファイルを追加–
--ramdisk ... 前述で作成した空のinitrdファイル–
--base ... NexusOneのベースアドレス–
-o ... 出力先ファイル名手順4: 起動準備
dev: size erasesize name mtd0: 000e0000 00020000 "misc"
mtd1: 00500000 00020000 "recovery"
mtd2: 00280000 00020000 "boot"
mtd3: 09100000 00020000 "system"
mtd4: 05f00000 00020000 "cache"
mtd5: 0c440000 00020000 "userdata"
● NexusOneをfastbootが使えるようにする
● 電源+ボリュームダウンで起動
● FASTBOOTを選択
● PCとNexusOneを接続(udevの設定が必要)
●
SUBSYSTEM=="usb", ATTRS{idVendor}=="0bb4",
SYMLINK+="android_fastboot", MODE="0666"
2010/12/09 Copyright(c)2000-2010 MIRACLE LINUX CORPORATION. All Rights Reserved. 38
手順5: Flashへ上書き
dev: size erasesize name mtd0: 000e0000 00020000 "misc"
mtd1: 00500000 00020000 "recovery"
mtd2: 00280000 00020000 "boot"
mtd3: 09100000 00020000 "system"
mtd4: 05f00000 00020000 "cache"
mtd5: 0c440000 00020000 "userdata"
● fastbootでboot領域をMeeGo用boot.imgに上書き
● $ fastboot flash boot boot.img-meego
● fastbootでrecovery領域をAndroid用boot.imgに上書き
● $ fastboot flash recovery boot.img
● イメージバックアップから入手
boot.img recovery.img
手順6: 起動
dev: size erasesize name mtd0: 000e0000 00020000 "misc"
mtd1: 00500000 00020000 "recovery"
mtd2: 00280000 00020000 "boot"
mtd3: 09100000 00020000 "system"
mtd4: 05f00000 00020000 "cache"
mtd5: 0c440000 00020000 "userdata"
● MeeGoの起動方法
● 電源ボタンで起動
–
boot領域(MeeGo) -> microSDのMeeGo● Androidの起動方法
● 電源+ボリュームダウンで起動
● RECOVERYを選択
–
recovery領域(Android) -> 通常起動今後の課題/別のケース
今後の課題
● ハードウェアレンダリングを有効にする
● libEGL, libGLESv2の互換性の問題で難しい、、
● 周辺装置の対応
● ボタン、トラックボール、センサ、カメラ等
● 電話機能の対応
● ATコマンドの調査が必要
● ofono(Open Source Telephony)の拡張
2010/12/09 Copyright(c)2000-2010 MIRACLE LINUX CORPORATION. All Rights Reserved. 42
注意事項
● バックアップを忘れずに!(nandroid etc)
● YOUR OWN RISK!
● カスタマイズしたイメージの書き換え
● BootloaderのUnlockが必要
● メーカーの保証対象外になる
● Lock状態に戻せない機種がある
● イメージの書き換え方法
● fastbootで上書きできるとは限らない
● recovery領域のinitrdからイメージの書き込みを行う
● 必要に応じてroot化も必要
よくある質問
● 製品ではなく開発ボードの場合は?
● フラッシュメモリの構成をユーザーが変更可能
● 製品よりも自由度が高い(移植が簡単)
● Androidカーネルのコンフィグレーションが有効化されても MeeGoは動く?
● 動く。むしろ活用できる
● CONFIG_USB_ANDROID_ADB=y
–
Android Debug Bridge(USB経由でファイル転送、シェ ル操作)が使える● MeeGo UXを動かす上で最低限必要なのは?
● ハードウェアアクセラレーションのサポート
2010/12/09 Copyright(c)2000-2010 MIRACLE LINUX CORPORATION. All Rights Reserved. 44
別のケース
● TOSHIBA AC100(Dynabook AZ)
● NVIDIA Tegra2
● L4T(Linux For Tegra)を使ってイメージ書き換え
● 以下の組み合わせで移植
● カーネルのロード方法 その3(recovery領域からの起動)
● ルートファイルシステムの場所 その3(SDカード)
● Ubuntuの動作実績あり
● http://tosh-ac100.wetpaint.com/page/Ubuntu
● 音声出力、HDMI出力が難
まとめ
2010/12/09 Copyright(c)2000-2010 MIRACLE LINUX CORPORATION. All Rights Reserved. 46
まとめ
●
Android端末でもMeeGo(==Linux)は動かせる
●
動かし方は機器によって様々
●
クローズドドライバ、ライブラリと整合すること
が優先
各種URL
● MeeGo公式サイト
● http://meego.com
● MeeGo技術ドキュメント
● http://wiki.meego.com
● Android端末系移植ドキュメント
● http://wiki.meego.com/ARM/MSMQSD
● 今回の移植手順
● http://blog.mitsutaka.org/2010/11/meego-11-for- nexusone-status-and-how-to.html
● http://blog.mitsutaka.org/2010/11/meego-11-for- nexusone-status-part2-and.html
2010/12/09 Copyright(c)2000-2010 MIRACLE LINUX CORPORATION. All Rights Reserved. 48