« LifeTouch NoteにDebianを入れる2 | トップページ | LTN用Debian(Lenny)配布ページ »

2011年5月23日 (月)

LifeTouch NoteにDebianを入れる3

LifeTouch NoteにDebianを入れる2の続き。

必要なもの

  1. android-sdk(mkbootfs、mkbootimg)

リカバリーモード用のinitramfsを書き換える。
リカバリーモードで起動すると、initramfsの/initが実行されるが、
initの中身を書き換えて、SDにLinuxのルートファイルシステムがあれば、
そちらを起動するようにする。
SDカードがなければ通常のリカバリーモードが実行されるようにする。
まずは、リカバリーモード用のパーティションを書き換える必要がある。

リカバリーモード用のパーティションの調べ方。

LTN上のコンソールを表示する。
LTNに端末ソフトを入れるか、PCからLTNへadb軽油で接続する。
リカバリーモード用のパーティションは、ロットとかモデルによって違うかもしれない。
操作を誤ると起動しなくなったり、メーカー修理になることもあるので注意すること。

mountコマンドでマウントされているパーティションを調べる。

$su
#busybox mount
/dev/block/mmcblk3p2 /fdt
/dev/block/mmcblk3p6 /system
/dev/block/mmcblk3p9 /data
/dev/block/mmcblk3p7 /cache
/dev/block/mmcblk3p1 /misc

私のLTNは上記のようになっている。
マウントされていないmmcblk3p3が、リカバリー用パーティションと仮定して、
ddコマンドで中身を取り出し、イメージをSDカードに保存する。

#busybox mount /dev/block/mmcblk2p1 /sdcard
#busybox dd if=/dev/block/mmcblk3p3 of=/sdcard/recovery.img

recovery.imgをzImageとinitramfsに分解する。
これはPC上で行う。

分解用のperlスクリプトがあるみたいだが、リンク切れで入手できなかった。
なので、自分でc言語で抜き出しソフトを書いた。
intel のx86用バイナリを置いておく。

「android_split」をダウンロード

以下のようにするとファイルが抜き出せる。

$android_split recovery.img

できるファイルは3つ。
android.header.bin
android.kernel.bin
android.ramdisk.bin

抜き出したイメージがAndroid用のboot、またはリカバリーイメージでない場合は、
not ANDROID imageと出るので、そのときは違うパーティションで試すこと。

android.header.binはファイル中の先頭から2KBのもの。
ヘッダや起動時にカーネルへ渡すコマンドライン等が入っている。android.kernel.binはzImageそのもの。android.ramdisk.binはinitramfs。

抜き出したinitramfsを以下のようにしてマウントする。
rootになって行う。

#mkdir ramdisk
#cd ramdisk
#zcat ../android.ramdisk.bin | cpio -id

以下のようなファイルがあるはず。

data
default.prop
dev
etc
init
init.goldfish.rc
init.rc
proc
res
sbin
sys
system
tmp
var

起動に必要なファイル(busybox)をramdisk/sbin/にコピーする。
そして必要そうなファイルも用意しておく。
(busyboxは/xxx/yyy/busyboxにある場合)

#cp /xxx/yyy/busybox sbin/
#cd sbin
#chmod 755 busybox
#ln -s /sbin/busybox switch_root
#ln -s /sbin/busybox mount
#ln -s /sbin/busybox umount
#ln -s /sbin/busybox mknod
#ln -s /sbin/busybox cp
#ln -s /sbin/busybox mv
#ln -s /sbin/busybox rm

起動時に表示される画像(ロゴ)もじゃまなので、

ramdisk/のinitlogo.rleをinitlogo.rle.disable等にファイル名を変更しておく。

initの改変

android2.2(froyo)のinit.cに以下のパッチをあてる。
コンパイル済みのバイナリも用意した。

パッチの内容
android-2-2のsystem/core/init/init.cのmain関数。
action_for_each_trigger("init", action_add_queue_tail);
drain_action_queue();
の後に以下のコードを入れる。
init.rcのinitセクションを実行した後に実行されるような箇所。

busyboxのswitch_rootコマンドでrootfsの移行をしている。
(/rootにSDカードをマウントする処理が必要)

//<- for LTN
    {
    static char *argv[] = {"switch_root","/root","/sbin/init","/bin/bash",NULL};

    // SD Card Check
    fd = open("/root/sbin/init",O_RDONLY);
    if (fd >= 0) {
        close(fd);
        umount("/tmp");
        umount("/cache");
        umount("/sys");
        umount("/proc");
        umount("/dev/pts");
        umount("/dev");
        execv("/sbin/busybox",argv);
    }
    }
// ->

「init」をダウンロード

initをramdiskの/にコピーし、実行権限をつけておく。

init.rcの変更をする。
initramfs内で、/rootを作成し、/dev/block/mmcblk2p1(rootfs)をマウントする指示を付け加える。

変更する箇所は以下の場所(+の行。+は含めない)
# create mountpoints
     mkdir /sdcard
     mkdir /misc
     mkdir /staging
     mkdir /system
     mkdir /data
     mkdir /cache
+   mkdir /root
     mount tmpfs /tmp /tmp

...

  # mount mtd partitions
  # Mount /system rw first to give the filesystem a chance to save a checkpoint
  # mount ext2 /dev/block/mmcblk3p6 /system
  # mount ext2 /dev/block/mmcblk3p6 /system ro remount
+  mount ext3 /dev/block/mmcblk2p1 /root
      mount ext3 /dev/block/mmcblk3p7 /cache nosuid nodev
      chown system cache /cache
      chmod 0770 /cache

変更準備が終わったら、新recovery.imgを作る。
ramdiskの階層で以下のコマンドを実行(mkbootimg は長いけど一行で)。

#find . | cpio -o -H newc | gzip > ../android.ramdisk-new.bin
#mkbootimg --cmdline 'mem=384M@0M nvmem=128M@384M vmalloc=256M video=tegrafb console=tty0,115200n8 usbcore.old_scheme_first=1 \
#no_console_suspend tegraboot=sdmmc egrapart=pt:600:80:800,bootloader:680:400:800,fdt:1180:12c00:800, \
#recovery:13d80:a00:800,boot:14800:1000:800,mbr:b80:200:800,system:15880:18000:800, \
#cache:2d900:12c00:800,misc:d80:400:800,staging:40580:1f400:800,userdata:5fa00:35b600:800' \
#--kernel android.kernel.bin --ramdisk android.ramdisk-new.bin --base 0x10000000 -o recovery2.img

 (最初に抜き出したrecovery.imgをとっておけば、いつでも戻せる)

recovery2.imgをSDカードへコピーする。
(/mnt/hd1がSDカードの第一パーティション)

#cp recovery2.img /mnt/hd1/
#umount /mnt/hd1

そして、LTNへSDカードを挿入しAndroidを起動する。
LTN上で端末ソフトを起動し、ddで書き込む。
/dev/block/mmcblk3p3がリカバリーパーティションでない場合は適時読み替えること。

$su
#busybox mount /dev/block/mmcblk2p1 /sdcard
#cd /sdcard
#busybox dd if=./recovery2.img of=/dev/block/mmcblk3p3

Debianのルートファイルシステムが入っているSDをLTNに入れて、
HOMEキーを押しながら電源ONにすると、Debianが立ち上がるはず。


« LifeTouch NoteにDebianを入れる2 | トップページ | LTN用Debian(Lenny)配布ページ »

LifeTouch Note」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: LifeTouch NoteにDebianを入れる3:

« LifeTouch NoteにDebianを入れる2 | トップページ | LTN用Debian(Lenny)配布ページ »