포럼 회원으로 등록하신분만 다운로드가 가능합니다. 최대 업로드 가능한 용량은 20MB 입니다.

이 글이 도움이 될 지는 모르겠지만
제 mail로 질문이 들어와서 여기에도 구성할 때의 주의사항을 말씀드립니다.

Linux system에서 root filesystem으로 사용할 수 있는 filesystem에는 여러가지가 있습니다.
몇가지 예를 든다면, RAM Disk, Cramfs, Squashfs. ext2, ext3 등이 있습니다.
이중 가장 많이 사용되는 것이 RAM Disk 이죠 Android도 Ram Disk를 기본으로 하고 있습니다.
그 다음에 주로 사용되는 것이 Cramfs와 Squashfs 인데요..이 둘은 read only filesystem입니다.
따라서 한번 image로 만든 다음 rootfs로 사용되면 다시 image를 NAND에 구울 때 까지는 절대 변경 할 수 없다는 것입니다.
ext2와 ext3는 NAND에서는 rootfs로 사용하기가 힘듭니다.
NAND의 기본 filesystem은 JFFS2와 YAFFS인 MTD용 filesystem 입니다.
이 두가지 filesystem외에는 write operation을 사용할 수가 없지요..
이유는 NAND의 bad block 때문입니다.
여기까지 기본적인 설명 이었구요...
 
이제 본격적인...^^;;
Android를 NAND에 넣고 싶다면 Android 구조를 파악하셔야 합니다.
Android는 기본적으로 rootfs와 system, data, cache, sdcard를 기본으로 하고 있습니다.
여기서 rootfs는 RAM Disk에서 system, data, cache는 MTD filesystem인 YAFFS에서, sdcard는 SDCARD에서 사용됩니다.
 
Android를 NAND에 올리기 전 가장 먼저 해야 할 일은 이 구조에 맞게 NAND에 파티셔닝을 해야 한다는 것입니다.
각각의 파티션을 나누어서 각 이미지를 write 해야 하구요...
각 파티션을 YAFFS로 rootfs에 mount 해야 합니다.
이것은 init.rc 파일을 분석하시면 감이 오실 것입니다.
일반적인 linux script와는 달라서 처음에 힘들더라구요..^^;;
 
0x00000000-0x00040000 : "Bootloader"
0x00040000-0x00400000 : "Kernel"
0x00400000-0x03400000 : "Root - Cramfs"
0x03400000-0x10000000 : "File System"
 
만약 이렇게 4개의 파티션으로 나누어져 있는 NAND가 있다면 파티션을 6개로 나누어야 합니다.
1. Bootloader
2. Kernel
3. Rootfs (Cramfs)
4. system - 대략 60MB 정도
5. userdata - 대략 50MB 이상
6. Cache - 나머지
 
이러한 작업이 끝이 나면
rootfs 구성을 해야 하는데요..
Android platform을 build하면 생성되는 root라는 디렉토리를 이용하여
rootfs를 구성하시면 됩니다.
단 NFS용 rootfs는 system과 data를 모두 rootfs에 넣어야 하지만
NAND에 넣을 rootfs는 system과 data를 넣으면 안됩니다.
이유는 조금 전에서 파티션을 나누고 부팅이 될 때 rootfs로 system과 data가 init에 의해 mount 될 것이기 때문입니다.
다음으로 init.rc 파일을 수정해야 합니다.
init.rc파일이 RAM Disk를 기본으로 하고 있기 때문에 rootfs의 내용을 변경하는 작업이 들어가 있거든요..
그 부분을 주석처리 하여 막아야 합니다.
왜냐하면 Cramfs는 read only filesystem이라서 변경이 불가능 하기 때문이죠..^^
 
주석처리 해야 할 부분은
=================================
symlink /system/etc /etc
mkdir /system
mkdir /data 0771 system system
mkdir /cache 0770 system cache
mkdir /sqlite_stmt_journals 01777 root root
 
mount rootfs rootfs / ro remount
=================================
이 부분 입니다.
이 부분을 주석처리 한 만큼 앞으로 cramfs image로 rootfs를 구성할 root안에
이것들을 모두 해줘야 합니다.
기본적으로 system, data 폴더는 생성되어 있으니까..
아래 명령으로 설정 하면 됩니다.

=================================
ln -s /system/etc etc
chown 0:0 system
chown 1000:1000 data
chmod 0771 data
mkdir cache
chown 1000:2001 cache
chmod 0777 cache
mkdir sqlite_stmt_journals
chown 0:0 sqlite_stmt_journals
chmod 01777 sqlite_stmt_journals
=================================

Android는 각각의 process 마다 UID/GID를 갖고 있습니다.
물론 root는 0번이구요...
system은 1000번 입니다.
또한 cache는 2001번 입니다.
원래 Linux에서는 UID/GID를 /etc/passwd, /etc/group 라는 파일을 통하여 커널에서 관리 하게 되어 있는데요..
Android는 따로 파일이 없고 platform source 내부에 system/core/include/private/android_filesystem_config.h 파일이 있는데
여기에 모든 UID/GID가 명시되어 있습니다.
따라서 platform을 build하게 되면 해당 헤더파일을 참조하게 되고
Android framework에서 관리를 하게 됩니다.
이는 Android 만이 가지는 security 방법입니다.
각각의 process 마다 UID/GID를 갖고 있기 때문에 다른 process가 생성한 파일에는 접근을 하지 못하는 것이죠..
(갑자기...삼천포로...^^;;)

아무튼 여기까지 변경 후에 mtd mount 하는 곳을 변경 하셔야 하는데요..
mount yaffs2 mtd@system /system
 
제가 Android에 mtd로서는 해본적이 없어서 이 부분을 그대로 사용해도 될지는 모르겠지만
한번 test 해보세요...
혹시나 mount가 되지 않는다면
아래와 같이 변경 해야 할 것입니다.
mount yaffs2 /dev/mtdblock4 /system
 
init process의 소스를 보니까...수정 안해도 될 것 같네요..^^;;;
 
이렇게 변경을 하고 cramfs image를 생성 하시면 됩니다.
말로는 이렇게 하지만 가장 우선시 되는것이 init.rc 스크립트 파일의 분석입니다.
일반 linux shell script파일과 달라서 분석하는것이 쉽지는 않겠지만
이것의 분석이 완료 되어야 Android를 자유자재로 다룰 수 있을 것입니다.
 
여기까지 했으면 거의 끝난거나 다름 없습니다.^^
이제 build된 Android platform에는 system.img, userdata.img이 생겨 있을 텐데요..
이 이미지들은 YAFFS2 filesystem으로 구성된 image 입니다.
이것을 그대로 각각의 partitoin에 write하시면 됩니다.
 
계속 말씀 드리지만 porting 작업에 있어서
처음부터 NAND에 image를 넣을려고 하면 문제 발생시 원인을 찾기가 힘듭니다.
NAND 문제 인지 아니면 image의 문제 인지 kernel 문제 인지...등등등.....
따라서 NFS booting을 통해 debuging 하시는게 좋을 것입니다.

여기까지 읽어주시느라 수고하셨습니다..^^

고현철

2009.04.09 16:34:18
*.94.41.89

mtd의 경우 mount시 device를 직접 지정하지 않아도 되더군요(위에서 언급했듯이)

mtd의 partition name중 system 이란 녀석이 있으면 찾아서 자동으로 마운트 해 줍니다.

예를 들어, /dev/mtdblock5가 "system"으로 되어 있을 경우

mount yaffs2 mtd@system /system

이렇게 해 주면 자동으로 /dev/mtdblock5를 찾아서(이름이 system이므로) /system에 mount해 줍니다.

참, 김영문님 yaffs2로 혹시 arm11(ex> 6410)에서 mtd에 올려서 성공하셨나요?
이상한 점이 좀 보여서요....인터넷서 찾아봐도 arm11에 성공한 사람이 거의 없는 듯 해서요.

그리고, 자세한 설명 감사드립니다. 내공이 팍팍 묻어나네요.....

김영문

2009.04.10 06:39:32
*.43.37.131

우선 저의 허접한 글을 그렇게 봐주시다니..감사하다는 말부터 드릴께요..^^
그리고 전 주로 회사에서 arm11 (omap2420, omap2430)을 주로 사용하고 있습니다.
그러나 mtd는 사용하지 않습니다.
이유는 OneNAND를 팔아 먹기 위한 FTL&File system solution 만 개발하고 있기 때문이죠..^^;;
mtd가 아닌 OneNAND에 XSR이라는 FTL과 RFS라는 FAT 호환 filesystem 위에서 Android가 동작 하게끔 porting 했었습니다..
mtd에 대해선 저도 초짜인지라...^^;;

mtd인지는 확실하지 않으나 외국의 사이트에서 msm7200, omap2420, PXA310 등 에서 Android가 porting 되어 있는 것을
본 기억이 있습니다..

김한철

2009.04.09 20:47:02
*.45.182.2

제가 메일로 질문한 내용이 올라온듯 하군요.. ㅎㅎ 일단 퍼미션 부분은 제가 함 맞춰 봐야 겠습니다. 
현철님이 올리신글에 대해서는 일단 mtd로 올리면 됩니다. 

제가 지금 걸린거는 안드로이드 쪽에서 system power down 명령을 줘서 커널이 halt 되는 문제가 있어서

그거에서 일주일 가량 울고 있다능... 
또 커널 2.6.27 (안드로이드 git 꺼 이용하다 보니.. 디바이스가 많이 안 잡혀서 nfs도 못해 보고 있다능...  IRQ는 왜 안되는것이얏...)

여튼 문제가  "mtd@system" 이게 잘 안되더군요.

이거 어디서 수정하는지 아시는 분 계시면 저에게 조언좀.. 바뀌지 않아서..

결국 busybox로 시스템을 구성하고 init.rc에서 빼버렸습니다. ㅜ.ㅜ  부팅은 기가차게 되는데..

system halted... 화면에는 안드로이드 power off 화면... 아 슬퍼유~~~
profile

김재훈

2009.04.09 20:48:58
*.162.60.144

조만간 강좌란에 안드로이드 포팅 강좌를 하나씩 올릴 예정 입니다. ^^

최종환

2009.04.09 21:43:17
*.207.130.159

mtd@system은 - > nane 파티션 크기를 지정 하는 부분에서 이름도 지정할수 있는데. 그 부분일것입니다.
보통 커널 부팅하면 nand 장치 잡고 파티션 크기하고 이름 나오는 부분..그 부분일것 입니다.
arch/arm/plat-xx쪽인가 어딘가에 partition.h 에서 지정 하더군요..

김한철

2009.04.09 23:34:23
*.45.182.2

김영문님 글을 읽고 시도를 해보고 있는데 아무래도 cramfs를 이용해서 한다는 것은 무리가 있을수 있겠다는 생각이 드네요.
실제 sqlite_stmt_journals 나 cache는 사용하기 위해서 디렉토리를 만드는듯 한데.
결국 cramfs는 디렉토리 구조상 write가 안되기 때문에 문제가 될듯합니다.

각 디렉토리를 어디엔가 mount를 걸어야 하는건지..

ramdisk를 쓰는게 제일 좋은 방법 같네요.. 지금 생각해 보니깐.. 근데 ramdisk로 바꾸면 CMDLINE을 어떻게 수정해야 하나요?

ramdisk.img는 만들수 있는데 nand에서 사용하는 방법은 제가 잘 몰라서요.. 아시는 분 리플 부탁드립니다..

고현철

2009.04.10 02:08:25
*.94.41.89

제가 howto 올려 놓도록 하겠습니다. 물론 커널 버전이 맞아야 하겠지만요....^^
List of Articles
번호 제목 글쓴이 날짜 조회 수
24 Google Android 커널 버전별 Testing Report [2] 김재훈 2009-05-17 11493
23 Android 동작시 Battery 관련 /sys 파일 에러 & Power off ... [2] 2009-05-09 11010
22 Android 커널 2.6.27~28버젼에서 CONFIG_SUSPEND옵션시 죽는 문... [3] 2009-05-08 10026
21 S3C6410 target으로의 Android porting에 대하여(1) [3] 고현철 2009-04-23 20133
20 Android 초보도 가능한 Touch 잡기. [1] 2009-04-23 12229
19 touch calibrate 방법 file [1] 전병환 2009-04-23 10442
18 Android에서의 Linux Network 환경 설정 방법 [1] 김재훈 2009-04-21 20514
17 PV와 Android [5] 이제현 2009-04-19 18163
16 OpenGL ES와 Android [3] 이제현 2009-04-18 22839
15 Android에서 yaffs2 image 만들때 oobfree 따르도록 수정 file [1] 2009-04-16 11896
14 안드로이드 6410 보드 관련 s3c-ts touch 잡기 [5] 김한철 2009-04-16 13738
13 Android yaffs image 흠..oob가 이상합니다. 2009-04-16 10888
12 File System 관련 문제 및 power off 문제 해결 [3] 김한철 2009-04-14 10202
11 Google Android Kernel-2.6.29 file 관리자 2009-04-14 12085
10 aesop-6410용 android 2.6.24 source file [12] 고현철 2009-04-12 12131
9 android를 6410에 포팅하면서... [7] 전병환 2009-04-10 18227
8 Android Debug Bridge(ADB) 사용 가이드 김재훈 2009-04-09 18864
7 Android Initialization Process 최종환 2009-04-09 24638
6 Android 부팅 및 초기화 절차 김재훈 2009-04-09 17000
» Android용 root filesystem으로 cramfs 구성 할 때의 주의사항 [7] 김영문 2009-04-09 21375

사용자 로그인