이 글이 도움이 될 지는 모르겠지만
제 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 하시는게 좋을 것입니다.
여기까지 읽어주시느라 수고하셨습니다..^^
mtd의 partition name중 system 이란 녀석이 있으면 찾아서 자동으로 마운트 해 줍니다.
예를 들어, /dev/mtdblock5가 "system"으로 되어 있을 경우
mount yaffs2 mtd@system /system
이렇게 해 주면 자동으로 /dev/mtdblock5를 찾아서(이름이 system이므로) /system에 mount해 줍니다.
참, 김영문님 yaffs2로 혹시 arm11(ex> 6410)에서 mtd에 올려서 성공하셨나요?
이상한 점이 좀 보여서요....인터넷서 찾아봐도 arm11에 성공한 사람이 거의 없는 듯 해서요.
그리고, 자세한 설명 감사드립니다. 내공이 팍팍 묻어나네요.....