あれのーと

らくがきちょうです。

ICONIA TAB A500でUbuntuとか

とても久しぶりです。平和ではありませんが元気です。

OSC Tokyoでも展示していましたが、ICONIA TAB A500でlinuxubuntu)を導入してみました。手順が長いので残しておこうかと思います。今回はUbuntuで実施していますが、結局の違いはrootfsの作成方法だけのはずですので、当然ながらDebianでもできる内容かと思います。*1



  • おやくそく
    • 文鎮になってもなんの保証もないので、at own liskです。


用意しておくもの

  • PC
    • Ubuntu11.10が動作して、SDカードが読めて、USBが使えるPC
    • Windowsが動作するPC。

どちらかでadbが使える環境にしてください(ここでは省略)。ちなみにlinuxでadbを使うならwindows側の用途はフルバックアップだけです。

  • microSDカード(microSDHC)

最低4G以上。16GBあれば安心。

  • ICONIA TAB A500

rootedにしておいてください。(ここでは省略)。あと事前にアプリケーションのバックアップとか取っているといいかも(手順内でもフルバックアップはしますが念の為)

  • USBキーボードとか

あると幸せ。

1.Uubntu側での作業(その1)

    • microSDカードのフォーマット

fdiskでmicroSDカードのパーティションを2つにします。fdiskの前にumountしておくこと。1つ目のパーティションは、Android用、2つ目のパーティションはext4でフォーマットします。うちの環境ではこんな感じ。*2

Disk /dev/sdb: 16.0 GB, 16021192704 bytes
ヘッド 204, セクタ 48, シリンダ 3195, 合計 31291392 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスク識別子: 0x00000000

デバイス ブート 始点 終点 ブロック Id システム
/dev/sdb1 48 10497023 5248488 83 Linux ←android
/dev/sdb2 10497024 31285439 10394208 83 Linux ←linux

で、フォーマット。

$sudo mkfs.vfat /dev/sdb1
$sudo mkfs.ext4 /dev/sdb2

終わったら、一旦SDカードを抜き差しして再マウントさせます。

    • mkbootimg

androidのrepoからmkbootimgをビルドするか、http://forum.xda-developers.com/showthread.php?t=562318 から持って行って、パスの通っているところに置きます。

    • クロスビルド環境の作成

クロスビルド用として必要そうなのをインストールします。

$sudo apt-get install build-essential gcc-arm-linux-gnueabi lzop

    • rootstock

Ubuntu上で、rootfsが作成できるようにrootstockをインストール。

$sudo apt-get install rootstock

rootstockでrootfsを作成します。性能面から考えて、lxdeを入れました。

$mkdir /your/path/to/rootfs
$cd /your/path/to/rootfs
$sudo rootstock --fqdn ubuntu --login ubuntu --password ubuntu --imagesize 4G -d natty --seed lxde,gdm

nattyを指定しているのは、そこしか動作確認していないため*3。--seed周りは、この設定だと最低限だったので、もうちょっと試してみるのがいいかも*4。ちょっと時間かかりますが、armel-rootfs-YYYYMMDDHHMM.tgzなファイルができます。不明な点は https://wiki.ubuntu.com/ARM/RootfsFromScratch で。*5

    • rootfsの展開

前手順で作成したrootfsをmicroSDに展開します。

$sudo tar zxvf /your/path/to/rootfs/armel-rootfs-YYYYMMDDHHMM.tgz -C /media/yourlinuxpartition/

    • kernelのgit clone

ChromeOS 2.6.28からブランチしている以下のカーネルソースをgit cloneしておきます。時間かかるよ。

cd /your/path/to/
$git clone https://github.com/astarasikov/iconia-gnu-kernel

    • kernelのビルド

kernelのビルド。

# ARCH指定、CROSS_COMPILE指定
$export ARCH=arm
$export CROSS_COMPILE=arm-linux-gnueabi-
# git cloneしたディレクトリに移動
$cd /your/path/to/iconia-gnu-kernel
# iconia用のdefconfigを実行(以下のコマンドそのままで)
$make iconiaa500_defconfig
# Ncpu * 2で -jxを指定する。2コアなら-j4。
$make -j4 ARCH=$ARCH CROSS_COMPILE=$CROSS_COMPILE zImage modules
# modules用のディレクトリを作成。kernelの中でなくてもいいです。
# 再度生成する場合はrm -rで。
$mkdir /your/path/modules
# モジュールの作成。
$make modules_install INSTALL_MOD_PATH=/your/path/modules/
# iconiaに焼くimageを作成。mkbootimgをつかいます。
$mkdir rc
$export TEGRA=/your/path/to/iconia-gnu-kernel
$mkbootimg --ramdisk /dev/zero --kernel ${TEGRA}/arch/arm/boot/zImage -o ${TEGRA}/rc/newrec.img

できた{TEGRA}/rc/newrec.imgをmicroSDカードのandoroidのパーティションにコピーしておきます

$cp ${TEGRA}/rc/newrec.img /media/yourandroidpartition/.

wifiのファームウェアをmicroSDカードの/media/yourlinuxpartition/lib/firmware/brcm配下にコピーします。ディレクトリはないと思うので作成します。あとで、iconiaから持ってきたbcm4329-fullmac-4.txtもここに入れることになります。

$sudo mkdir -p /media/yourlinuxpartition/lib/firmware/brcm
$sudo cp /your/path/modules/lib/firmware/brcm/bcm4329-fullmac-4.bin /media/yourlinuxpartition/lib/firmware/brcm/

ureadaheadがあると、起動時に刺さってしまうため、microSD上にある/etc/ureadheadを無効化します。

$sudo mv /media/yourlinuxpartition/etc/init/ureadahead.conf /media/yourlinuxpartition/etc/init/ureadahead.disable

2.Windows側での作業
http://forum.xda-developers.com/showthread.php?t=1121543&highlight=itsmagic からitsmagic.zipとbackup_tool.zipをダウンロードしていずれも展開しておきます。
itsmagicは、mmcblk0p7に保存している、各パーティションのchecksumに整合性を取るためのツール。backup_toolはフルバックアップツールです。

    • バックアップ

すでにrootedされているICONIA TABを、windowsに接続して、backup_toolディレクトリにある、01_backup.batを実行します。*6バックアップ後は、backupディレクトリの中に、各パーティションのダンプ(cacheとdataパーテイション以外)、chechsumとuidが記されたテキストファイルがあるかと思います。

    • itsmagicのコピー

itsmagicをandroid側のパーティションにコピーします。

  • ICONIA TABでの作業(その1)

microSDカードをICONIA TABに差し込んで起動します。

    • itsmagicの導入
    • adb shellでICONIA TABにアクセスして、itsmagicを/data/localの配下にコピーして、755のパーミッションを与えます。

adb shellでアクセス
$ su
# cp /mnt/external_sd/itsmagic /data/local
# chmod 755 /data/local/itsmagic

    • nvram.txtのコピー

続けてbcm4329用のモジュール用をlinuxでも有効にするため、nvram.txtをコピー。

#cp /system/etc/nvram.txt /mnt/external_sd/bcm4329-fullmac-4.txt

ICONIA TABからmircoSDカードを抜きます。

3.ubuntu側での作業(その2)
microSDをPCに差し込みます

    • bcm4329-fullmac-4.txtのコピー

bcm4329-fullmac-4.txtをmicroSD側のlinuxパーティションにコピーします。

$sudo cp /media/yourandroidpartition/bcm4329-fullmac-4.txt /media/yourlinuxpartition/lib/firmware/brcm/

microSDカードを抜いて、ICONIA TAB差し込みます。

4.ICONIA TABでの作業(その2)

    • フラッシュイメージの書き込み

adb shellでICONIA TABにアクセスして、先ほど作成したフラッシュイメージをICONIA上の/dev/block/mmcblk0p1に書き込みます。慎重に、ちょう慎重に。書き込みが終わったら、先ほど導入したitsmagicを実行します。

adb shellでアクセス
$ su
# dd if=/mnt/external_sd/newrec.img of=/dev/block/mmcblk0p1
6196+0 records in
6196+0 records out
3172352 bytes transferred in 1.219 secs (2602421 bytes/sec)
# /data/local/itsmagic
Some magic trick by @sc2k on xda
it tricks the bootloader to run any kernel you want.
Thx @Acer for making this so easy.. why did you say the BL is locked if it isn't? :D

USE AT YOUR OWN RISK!

Done. Have fun!

    • ICONIAの電源OFF

いつもどおりに電源OFFにします。

5.ICONIA上でのLinux起動
VolUpを押しながら電源をONにします。"Booting recovery kernel image"と出るまでVolUpボタンを押しておいてください。Xで少しエラーが出た後に、gdmのログイン画面が出るかと思います。rootstockで指定したパスワードでログインしてください。あと、wifiとか設定するかと思いますが、このあたりは難しくないので試してみてください。

  • ひんと
    • wifiを使うときはrfkillを使ってデバイスを有効化しておく必要があります。
  • おまけ
    • bootchart

http://twitpic.com/7cse6z/full

  • 参考

http://forum.xda-developers.com/showthread.php?t=1158260
http://forum.xda-developers.com/showthread.php?t=1197793

*1:advent calendar分のエントリーなので、Debian側にも配慮。。。

*2:linux側は3GB以上にしておいたほうが良いですね。

*3:oneiricの挑戦はみなさん頑張ってください。。

*4:"$sudo rootstock --fqdn ubuntu --login ubuntu --password ubuntu --imagesize 4G -d natty --seed lxde,gdm,rfkill,alsa-utils,wireless-tools,wpasupplicant,ttf-takao"とかですかね。。

*5:Ubuntuにしていない理由はplymouthが。。。という理由もあります

*6:要はこれがあるので、windows環境使っているんですね。 http://forum.xda-developers.com/showthread.php?t=1121543&highlight=itsmagic にあるManual Methodをlinux上でやる方法もあります。