Upload
mitz-amano
View
2.357
Download
4
Embed Size (px)
DESCRIPTION
AndroidプラットフォームはAndroidが動作するために設計されており、 Androidを使えばターゲットデバイスの全ての周辺機器を動かすことができるよう提供されている。 しかし、Androidは日に日に進化しているため、古いバージョンでリリースされた端末は、 メーカーがアップデートを提供しない限りそのまま過去の遺物となってしまう。 そこで、MeeGoを始めとした専用デバイスに特化したLinuxディストリビューションをこうした端末に移植することで、 新たな利用価値を発見することができるかもしれない。 本論文では、Androidプラットフォームの特徴とそこへの移植方法について考察し、 さらにMeeGoを実際に移植し動作させた事例ついて紹介する。
Citation preview
2010/11/12 2
自己紹介
● 天野 光隆(あまの みつたか)
● 執筆活動
● 日経Linux ライター
● 情報処理学会 会誌「情報処理」10月号「Google Chrome OSの構成から見るセキュリティ対策」
● 講演活動
● Open Source Conference
● LinuxCon Japan 2010
● MeeGo関連各種等
2010/11/12 3
自己紹介
● コミュニティ活動
● Moblin
– 開発ツールのメンテナ、日本語化作業、各種講演等● MeeGo
– Netbook 日本語版イメージ公開– 各種H/Wへの移植等
● tweet on @mitsutaka_amano
2010/11/12 6
概要
● AndroidとAndroid端末
● Androidは日々進化している
– 1.0, 1.5, 1.6, 2.1, 2.2, 2.3, 3.0....● Android端末も進化している
– 最新ハードウェアの採用
2010/11/12 7
概要
● Androidのリリーススピードついていけてる?
● NexusOne(HTC Passion), HTC Desire, Xperia等
– Qualcomm Snapdragon 1GHz: まだまだ現役● HT-03A(HTC Magic)等
– Qualcomm MSM7201a 528MHz: 使えるが、、– キャリアによってはアップデート予定なし
2010/11/12 8
概要
● Androidが新しくなる度、古い端末が使えなくなっていく
● キャリア(メーカー)がサポートしない
● アップデートが追いつかない
● Androidの要求スペックを満たせない
– 動くけど動作が重すぎる等● 要因
● Androidによってある一定の共通化が達成された
● 機能拡張しやすくなった
● アップデート間隔が短くなった
2010/11/12 9
概要
● 古い端末を蘇らせる
● 新たな可能性
● 今後も、サポートしきれない端末が、増えていく
● 需要も増える?
● 別のOSを動かす
● 新しいバージョンAndroid
● その他のLinux
2010/11/12 12
Android端末の特徴
● MTD(Memory Technology Device)を使ってフラッシュメモリにパーティションを構築
$ cat /proc/mtddev: size erasesize namemtd0: 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
2010/11/12 13
Android端末の特徴
● Android独自の用途別に従ってパーティション分けされている
$ cat /proc/mtddev: size erasesize namemtd0: 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/11/12 14
Android端末の特徴
● recovery, bootそれぞれにカーネルイメージ、カーネルパラメータ、initrdが組み込まれている
$ cat /proc/mtddev: size erasesize namemtd0: 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
2010/11/12 15
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カードのマウント
2010/11/12 17
移植方法:考え方
● 二つの視点で考える
● カーネルのロード方法
– どこから起動できるのか?– どの起動方法がベストプラクティスか?
● ルートファイルシステムの場所
– どこに置けるか?– どれだけの容量が必要なのか? How?
Where?
2010/11/12 18
dev: size erasesize namemtd0: 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が起動できなくなる
2010/11/12 19
カーネルのロード方法:その2
zImage
dev: size erasesize namemtd0: 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/11/12 20
dev: size erasesize namemtd0: 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の復元/アップデートができなくなる
2010/11/12 21
dev: size erasesize namemtd0: 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/11/12 22
dev: size erasesize namemtd0: 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上のユーザーデータが保証できなくなる
2010/11/12 23
ルートファイルシステムの場所:その3
dev: size erasesize namemtd0: 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/11/12 24
移植方法:まとめ
system領域 userdata領域 SDカード
bootから起動 Androidとの完全な置き換えディスク領域小
Android起動不可ディスク領域中
Androidとのデュアルブート化ディスク領域大
recoveryから起動 Android起動不可ディスク領域小
Android起動不可ディスク領域中
Androidとのデュアルブート化ディスク領域大
PCから起動 Android起動不可ディスク領域小
Android起動不可ディスク領域中
フラッシュメモリを一切使わない最も安全な方法ディスク領域大
2010/11/12 26
移植例:NexusOne
● NexusOneでMeeGoを動かす
● MeeGoとは
新しいLinuxディストリビューション(Atom, armv7l)
携帯電話、Netbook、車載機器、家電向け(TV等)
Intel/Nokia主導の開発とOSSコミュニティ
2010/11/12 27
準備
dev: size erasesize namemtd0: 000e0000 00020000 "misc"mtd1: 00500000 00020000 "recovery"mtd2: 00280000 00020000 "boot"mtd3: 09100000 00020000 "system"mtd4: 05f00000 00020000 "cache"mtd5: 0c440000 00020000 "userdata"
● 以下の組み合わせで移植する
● カーネルのロード方法 その2(PCからの起動)
● ルートファイルシステムの場所 その3(SDカード)
● NexusOne
● PC(Ubuntu 10.04)
● USB-microUSBケーブル
● SDカード
● microSD 4GB class6
2010/11/12 28
準備
dev: size erasesize namemtd0: 000e0000 00020000 "misc"mtd1: 00500000 00020000 "recovery"mtd2: 00280000 00020000 "boot"mtd3: 09100000 00020000 "system"mtd4: 05f00000 00020000 "cache"mtd5: 0c440000 00020000 "userdata"
● ソフトウェア
● 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
2010/11/12 29
手順1: MeeGoルートファイルシステムの作成
dev: size erasesize namemtd0: 000e0000 00020000 "misc"mtd1: 00500000 00020000 "recovery"mtd2: 00280000 00020000 "boot"mtd3: 09100000 00020000 "system"mtd4: 05f00000 00020000 "cache"mtd5: 0c440000 00020000 "userdata"
● kickstartファイルの作成(meego-nexusone.ks)
● MeeGoの各種kickstarファイルを参考に
● mic2実行
● $ sudo LANG=C mic-image-creator -c meego-nexusone.ks -f raw --run-mode=0 --arch=armv7l
● ddでmicroSDへコピー
● $ sudo dd if=meego-nexusone-1.1.80.20101024.2322-mmcblk0p.raw of=/dev/sdx(microSDのデバイスファイル) bs=4k
2010/11/12 30
手順2: カーネルの作成
zImage
dev: size erasesize namemtd0: 000e0000 00020000 "misc"mtd1: 00500000 00020000 "recovery"mtd2: 00280000 00020000 "boot"mtd3: 09100000 00020000 "system"mtd4: 05f00000 00020000 "cache"mtd5: 0c440000 00020000 "userdata"
● 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/11/12 31
手順2: カーネルの作成
zImage
dev: size erasesize namemtd0: 000e0000 00020000 "misc"mtd1: 00500000 00020000 "recovery"mtd2: 00280000 00020000 "boot"mtd3: 09100000 00020000 "system"mtd4: 05f00000 00020000 "cache"mtd5: 0c440000 00020000 "userdata"
● 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
2010/11/12 32
手順2: カーネルの作成
zImage
dev: size erasesize namemtd0: 000e0000 00020000 "misc"mtd1: 00500000 00020000 "recovery"mtd2: 00280000 00020000 "boot"mtd3: 09100000 00020000 "system"mtd4: 05f00000 00020000 "cache"mtd5: 0c440000 00020000 "userdata"
● コンパイル
● 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/11/12 33
手順3: 起動
zImage
dev: size erasesize namemtd0: 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"
● fastbootでカーネルを転送、ロード
● $ fastboot -c 'init=/sbin/init rootwait root=/dev/mmcblk0p1 rootfstype=ext3 rw' boot zImage
2010/11/12 35
今後の課題
● ハードウェアレンダリングを有効にする
● libEGL, libGLESv2の互換性の問題
● 周辺装置の対応
● ボタン、トラックボール、センサ、カメラ等
● 電話機能の対応
● ATコマンドの調査が必要
● ofono(Open Source Telephony)の拡張
2010/11/12 36
注意点
● バックアップを忘れずに!(nandroid etc)
● YOUR OWN RISK!
● カスタマイズしたイメージの書き換え
● BootloaderのUnlockが必要
● メーカーの保証対象外になる
● Lock状態に戻せない機種がある
● イメージの書き換え方法
● fastbootで上書きできるとは限らない
● recovery領域のinitrdからイメージの書き込みを行う
● 必要に応じてroot化も必要
2010/11/12 37
別のケース
● TOSHIBA AC100(Dynabook AZ)
● NVIDIA Tegra2
● L4T(Linux For Tegra)を使ってイメージ書き換え
● 以下の組み合わせで移植
● カーネルのロード方法 その3(recovery領域からの起動)
● ルートファイルシステムの場所 その3(SDカード)
● Ubuntuの動作実績あり
● http://tosh-ac100.wetpaint.com/page/Ubuntu
● 音声出力、HDMI出力が難
2010/11/12 39
まとめ
● Android端末でも別のOSは動かせる● 動かし方は機器によって様々● 他のLinuxを動かすためのリソース探しが大変● クローズドドライバが壁になる● 新しい用途が発見できるかもしれない
2010/11/12 43
おまけ
dev: size erasesize namemtd0: 000e0000 00020000 "misc"mtd1: 00500000 00020000 "recovery"mtd2: 00280000 00020000 "boot"mtd3: 09100000 00020000 "system"mtd4: 05f00000 00020000 "cache"mtd5: 0c440000 00020000 "userdata"
● NexusOneのMeeGo, Androidデュアルブート
● 以下の組み合わせで移植
● カーネルのロード方法 その3(boot領域からの起動)
● ルートファイルシステムの場所 その3(SDカード)
● 更にrecovery領域をAndroidのboot領域に置き換え
● SDカードは2パーティション
● mmcblk0p1 ... vfat(Androidのメディア保存用)
● mmcblk0p2 ... ext3(MeeGoルートファイルシステム)