Programming/android2010. 9. 11. 10:22
안드로이드 개발환경(Android SDK / Eclipde ADT)에는 AVD 라는 것이 존재해서
가상 안드로이드 기기를 구동은 할수 있는데 시스템을 구성하는 rootFS가 존재하지 않고 있다.
그래서 디렉토리를 뒤져보다 보니

platforms 아래의 안드로이드 버전별 디렉토리에 images 라는 녀석이 존재하고
리눅스로 옮겨서 파일종류를 보니, 다음과 같은 내용이 나왔다.

$ file *
NOTICE.txt:   ISO-8859 English text
kernel-qemu:  data
ramdisk.img:  gzip compressed data, from Unix
system.img:   VMS Alpha executable
userdata.img: VMS Alpha executable

$ ll -h
합계 84M
drwxr-xr-x 2 morpheuz morpheuz 4.0K 2010-09-11 10:01 ./
drwxr-xr-x 5 morpheuz morpheuz 4.0K 2010-09-11 10:01 ../
-rwxr--r-- 1 morpheuz morpheuz 307K 2010-09-11 01:04 NOTICE.txt*
-rwxr--r-- 1 morpheuz morpheuz 1.4M 2010-09-11 01:04 kernel-qemu*
-rwxr--r-- 1 morpheuz morpheuz 161K 2010-09-11 01:04 ramdisk.img*
-rwxr--r-- 1 morpheuz morpheuz  78M 2010-09-11 01:04 system.img*
-rwxr--r-- 1 morpheuz morpheuz 3.9M 2010-09-11 01:04 userdata.img*

이름이나 사이즈를 봐서는 system.img가 RootFS일 가능성이 높아 보인다.

Android emulator has 3 basic images on tools/lib/images directory.
    * ramdisk.img
    * system.img
    * userdata.img

system.img and userdata.img have the contents of /system and /data directory on root file system.

[링크 : http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget]

안드로이드 시스템에서 /system은 퍼미션이 되지만
/data는 안되므로 userdata.img를 분석해 보는게 이득이고, 마운트 해야할 파일의 방향이 잡혔다.

그리고 안드로이드는 YAFFS2를 rootFS용 filesystem으로 사용하기 때문에,
일반 PC에서 이러한 rootFS를 열어보기 위해서는 해당 파일 시스템을 지원하는지 봐야 하는데
리눅스에서 /proc/filesystem에 지원하는 파일 시스템이 목록이 나온다.

$ cat /proc/filesystems
nodev   sysfs
nodev   rootfs
nodev   bdev
nodev   proc
nodev   cgroup
nodev   cpuset
nodev   tmpfs
nodev   devtmpfs
nodev   debugfs
nodev   securityfs
nodev   sockfs
nodev   pipefs
nodev   anon_inodefs
nodev   inotifyfs
nodev   devpts
        ext3
        ext2
        ext4
nodev   ramfs
nodev   hugetlbfs
nodev   ecryptfs
nodev   fuse
        fuseblk
nodev   fusectl
nodev   mqueue
nodev   rpc_pipefs
nodev   nfsd
nodev   binfmt_misc

yaffs2는 없으니 아마도.. 커널을 재 컴파일 하는 무시무시한 작업을 해야 할것 같다.
날려도 되는 시스템이지만.. 재구축하기 귀찮아서 두렵다 -_-

음.. UML(User Mode Linux) 란걸로 대체해서 해볼까? 메인 리눅스 날리면 귀찮은디 ㅠ.ㅠ
[링크 : http://user-mode-linux.sourceforge.net/]

아래는 ubuntu 에서 커널 컴파일을 통한 yaffs2 추가하기
[링크 : http://seulkom.tistory.com/34]

아래는 qemu 라는 것으로 AVD 없이 안드로이드를 구동시킨 화면
[링크 : http://www.kandroid.org/board/board.php?board=androidsource&command=body&no=24]
[링크 : http://cs.sch.ac.kr/cs_homepage/seminar/android/Android.htm]




ramdisk.img는 ramfs 이지만 mount로는 보이지않고 cpio로 원래대로 추출(extract) 시켜주어야 나온다.
$ gzip -cd ramdisk.img > ramdisk
$ cpio -iv -F ramdisk
[링크 : http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget]

$ cpio -iv -F ramdisk
data
default.prop
dev
init
init.goldfish.rc
init.rc
proc
sbin
sbin/adbd
sys
system
512 blocks

$ file *
data:              directory
default.prop:      ASCII text
dev:               directory
init:              ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, stripped
init.goldfish.rc:  ASCII English text
init.rc:           ASCII English text
proc:              directory
sbin:              directory
sys:               directory
system:            directory

Posted by 구차니