= YAFFS = -- [김도집] [[DateTime(2005-08-12T02:43:39)]] [[TableOfContents]] == yaffs란 == Yaffs는 Yet Another Flash File System에서 머리 글자만 딴 것이다. 이것은 임베디드 시스템의 NAND 플래시를 위한 저널링 가능한 파일 시스템이다. yaffs 사이트는 [http://www.aleph1.co.uk/yaffs/]이다. === yaffs의 구조 === yaffs의 구조를 알기 위해서는 yaffs 사이트의 문서를 참고하든지, 아니면 소스를 직접 봐야 할 것이다. 그 어느 것도 제대로 하지 않았으므로 알지 못한다. 그러나 대충 짐작컨대, yaffs의 경우 [jffs2]와 달리 커널 스레드로 동작하는 garbage collector을 두고 있는 것 같지는 않다. 아마도 write 시점에 이와 비슷한 일을 처리하는 것이 아닌가 싶다. 이에 대한 것은 좀 더 공부가 필요할 듯 싶다. 혹, 이에 대해 안다면 여기에 그 내용을 적어주면 무지 고마울 것이다. :) === 라이선스 === yaffs는 두 가지의 라이선스를 채용하고 있는 것으로 보인다(정확히 확인하지 않았다. 게을러서 확인하고 싶지도 않지만 확실히 하고자 한다면 yaffs 사이트에서 확인하기 바란다). 하나는 GPL이고 다른 하나는 yaffs 만의 또 다른 라이선스 정책일 것이다. == yaffs 소스 구하기 == 소스는 cvs를 통해 다운 받을 수 있다. cvs에서 다운 받을 수 있는 모듈은 다음과 같다. * yaffs * yaffs2 === yaffs 소스 구하기 === {{{ cvs -d:pserver:anonymous@cvs.aleph1.co.uk:/home/aleph1/cvs login cvs -z3 -d:pserver:anonymous@cvs.aleph1.co.uk:/home/aleph1/cvs co yaffs }}} login시에 password를 묻는데 이때는 엔터만 치면 된다. === yaffs2 소스 구하기 === {{{ cvs -d:pserver:anonymous@cvs.aleph1.co.uk:/home/aleph1/cvs login cvs -z3 -d:pserver:anonymous@cvs.aleph1.co.uk:/home/aleph1/cvs co yaffs2 }}} login시에 password를 묻는데 이때는 엔터만 치면 된다. == yaffs 도구 만들기 == yaffs를 위한 도구는 yaffs의 소스의 utils 디렉토리 아래에 있다. yaffs2 소스 디렉토리에는 utils이라는 디렉토리가 없다(짐작컨대 yaffs2도 yaffs의 도구를 사용하는 것으로 보인다). * mkyaffs - NAND 플래시 영역을 yaffs로 초기화 * mkyaffsimage - yaffs용 이미지 생성 yaffs의 도구들은 yaffs/utils 이하에 있다. 빌드하기 위해서는 각각 ''make mkyaffs''와 ''make mkyaffsimage''를 하면 된다. 둘을 모두 빌드하는 경우에는 ''make'' 만 실행 하면 된다. -2005년 8월 13일에 cvs에서 다운받은 소스를 빌들하기 위해서는 리눅스 커널 소스의 driver/mtd/nand/nand_ecc.c 를 복사해서 사용해야 한다(이는 리눅스 커널 2.6.12에서만 확인 한 것이고 다른 버전에서도 그런지는 모르겠다.). 사실 nand_ecc.c 소스가 yaffs 소스에서 포함되어 있어야 할 듯 한데, 아마도 cvs commit 과정 중에 누락된 것이 아닌가 하는 생각이 든다.- yaffs_ecc.[ch]를 사용하면 된다. 단, 함수 명을 define으로 wrapping 하던지, 소스를 수정해서 함수명을 변경해야 할 것이다. == yaffs 이미지 만들기 == 디렉토리를 만들고 그 아래에 파일 시스템의 구성을 만든다. 이후 mkyaffsimage 명령을 이용하여 yaffs 이미지를 만든다. {{{ mkyaffsimage ./target ramdisk.yaffs }}} /!\ 처음에 위 명령이 제대로 실행이 되지 않고 그냥 mkyaffsimage의 사용법만 계속 출력되었다. 확인 결가 mkyaffsimage.c 소스상에서 인자 값이 세개 이하인 경우 사용법을 출력하고 종료하도록 되어 있다. 소스를 수정해서 2개 이하의 인자를 입력 받는 경우에만 사용법을 출력하고 종료하도록 하였다. 사용법을 보더라도 하나의 인자는 선택사항으로 되어 있다. == yaffs 이미지 fusing하기 == === 부트로더에서 yaffs 이미지 fusing하기 === NAND 플래시의 특성상 하나의 1페이지는 256byte의 두 영역과 하나의 16byte의 OOB 영역(또는 spare 영역)으로 구성되어 있다. 즉, 1페이지는 528byte가 된다. 이러한 페이지는 read/write의 단위가 된다. 그러나 실제 데이터를 위해 사용되는 영역은 OOB를 영역을 제외한 512byte이다. 페이지는 블록을 구성하는데, 하나의 블록은 32개의 페이지로 이뤄진다. 하나의 블록 크기 중 OOB 영역을 제외하면 16Kbyte가 된다. 블록은 erase 단위가 된다. 따라서 블록내의 한 페이지만을 erase 하고자 한다면 그 페이지가 속한 하나의 블록 전체를 erase 해야만 한다. /!\ NAND 플래시는 페이지 크기가 256byte, 512byte (+16byte OOB), 2Kbyte (+64byte OOB) 등의 크기를 갖는다. 일반적을 512byte 크기의 페이지가 널리 사용되나 2GB이상의 NAND 플래시에서는 2Kbyte가 하나의 페이지가 크기가 된다. yaffs 이미지를 fusing 할 때는 yaffs 이미지를 위한 '''NAND 플래시의 첫번재 블록은 비워두고 두번째 블록부터 fusing을 해야 한다'''. '''그리고 yaffs 이미지는 기본적으로 OOB 영역도 생성되어 있으므로 부트로더에서 OOB 영역까지 하나의 데이터 영역으로 보고 yaffs 이미지를 fusing해야 한다.''' /!\ jffs2 이미지는 OOB 영역을 포함하고 있지 않기 때문에 fusing시에 OOB 영역은 쓰지 않는다. === 리눅스 부팅 후 yaffs 이미지 fusing하기 === 예를 들어 /dev/mtd4에 fusing하고자 한다면 먼저 /dev/mtd4를 yaffs 파일 시스템으로 초기화를 한다. {{{ mkyaffs /dev/mtd4 }}} 이후 ramdisk.yaffs 이미지를 fusing하면 된다. {{{ mkyaffs /dev/mtd4 ramdisk.yaffs }}} /!\ mkyaffs를 이용해서 yaffs 이미지를 fusing 하는 경우 mtd에서 ECC를 사용하지 않는 write는 권장하지 않는다는 의미의 메시지로 계속 불평하는 것을 보게 될 것이다. 이는 커널 소스의 mtd/drivers/nand/nand_base.c에서 출력하고 있는 것으로 적당히 수정할 필요가 있을 것이다. == 리눅스 커널에 yaffs 적용하기 == yaffs를 커널에 추가하는 방법은 다음과 같다. 1. 커널 소스내에 fs/yaffs 라는 디렉토리를 만든다. 1. 이 디렉토리에 yaffs의 소스에서 devextras.h yaffs_fs.c yaffs_gets.c yaffs_guts.h yaffs_mtdif.c yaffs_mtdif.h yaffsinterface.h yportenv.h 를 복사해 놓는다. 1. yaffs 소스에서 Makefile.kernel을 fs/yaffs/Makefile로 복사한다. 1. fs/Config.in 에서 다음을 추가한다. {{{ if [ "CONFIG_MTD_NAND" = "y" ]; then tristate "Yaffs filesystem on NAND" CONFIG_YAFFS_FS fi }}} 1. fs/Makefile에 다음을 추가한다. {{{ subdir-$(CONFIG_YAFFS_FS) += yaffs }}} 1. 커널 configuration에서 mtd nand를 설정하고 yaffs fs를 선택한다. 1. 마지막으로 커널을 빌드하면 된다. == yaffs 마운트하기 == {{{ mount -t yaffs /dev/mtdblock4 /yaffs }}} == 참고 == * [http://www.aleph1.co.uk/yaffs/ YAFFS] * [http://www.linux-mtd.infradead.org/ Linux MTD] * [http://kelp.or.kr/korweblog/stories.php?story=05/03/11/8823013&topic=17 Yaffs 파일 시스템 이미지 파일 NAND에 Fusing 방법] - [http://www.kelp.or.kr KELP] * [http://www.aleph1.co.uk/yaffs/yaffs-rootfs-howto.html Brief HOWTO on incorporating yaffs as a root fs] * [http://kelp.or.kr/korweblog/stories.php?story=04/06/30/7742286 YAFFS HOW-TO] - [http://www.kelp.or.kr KELP] * [http://cafe114.daum.net/_c21_/bbs_read?grpid=ZmCn&fldid=Lc5H&page=1&prev_page=0&firstbbsdepth=&lastbbsdepth=zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz&contentval=00002zzzzzzzzzzzzzzzzzzzzzzzzz&datanum=2&head=&subj=U-Boot%3Enand+write.yaffs+%3A+NAND+Flash+Filesystem YAFFS HOW-TO(ALT)] - Daum