임베디드 시스템에서 Rootfs를 UBI, UBIFS 이미지로 만들기.
임베디드 시스템에서 Rootfs를 UBI, UBIFS 이미지로 만들기.
UBI 혹은 UBIFS는 다른 NAND 파일시스템 yaffs에 비해서 OOB를 사용하지 않아서 비교적 NAND 선택에 자유롭다. 4bit 혹은 8bit ECC를 쓴다고 하면 OOB 64바이트가 꽉차서 Yaffs는 사용하지 못하는 경우가 있다.
또한 UBI의 경우 여러개의 UBIFS 이미지를 올려서 마치 하드디스크의 논리 파티션처럼 임베디드에서 구성할 수도 있다. 그리고 논리적인 Mapping을 사용하기 때문에 배드 블럭에도 자유롭다. 배드 블럭이 있다면 이를 Skip하고 맵핑하면 되기 때문에 아예 없는것처럼 쓸 수 있는 것이다. 실제 블럭을 PEB(Physical Erasable Block)이라고 하고 논리적인 블럭을 (LEB, Logical Erasable Block)이라고도 한다. UBI로 이러한 논리적인 파티션을 구성할 경우 LEB에 직접 Access하고 LEB는 실제 PEB로 Mapping이 되어 있다고 한다. 일단 기억상으로는 이러한 장점이 있는 것 같다. 그리고 마운트 속도도 Yaffs보다 빠르다고 한다.
임베디드 시스템에서 Rootfs를 UBI이미지로 만들기 위해서 mkfs.ubifs, ubinize가 사용된다. 해당 유틸은 mtd-utils를 받아서 빌드하거나 우분투나 데비안 계열이라면 아래처럼 설치가능하다.
$ sudo apt-get install mtd-utils
절차는 아래와 같다.
1. 먼저 mkfs.ubifs를 이용해서 UBIFS 이미지를 만든다.
필요한 파라미터
- Eraseblock size (block-size): Calculates the logical erase block size, which is eraseblock_size - 2*Min_i/o_size
= 블럭 사이즈 - 2*페이지 사이즈
- Minimum input/output unit size (page-size) 그냥 페이지 사이즈.
- Sub-page size (usually same as page size) 그냥 페이지 사이즈.
mkfs.ubifs -m 최소입출력사이즈 -e LEB사이즈(Logical Eraserble Block) -c 블럭갯수 -r 이미지디렉토리 target
예를 들어 2K 페이지의 NAND의 경우
Eraseblock size (block-size) = 131072 bytes
Minimum input/output unit size (page-size) = 2048 bytes
Sub-page size (usually same as page size) = 2048 bytes
Required partition size = 23986176 bytes
LEB 계산 = 131072(128KB)-2*2048 = 126976
블럭갯수 = 파티션사이즈/블럭사이즈= 23986176/131072 =183개블럭
이런식으로 명령어를 조합해서 만든다.
mkfs.ubifs -m 2048 -e 126976 -c 70 -r /home/simon/work/rootfs ubifs-system.img
mkfs.ubifs -m 2048 -e 126976 -c 113 ubifs-usr.img
/home/simon/work/rootfs 에 해당 파일시스템이 있고 이것을 ubifs-system.img, ubifs_usr.img로 각각 ubifs가 만들어 진다.
2. UBI 이미지 만들기.
UBI이미지는 이전에 만든 rootfs, usr 2개의 UBIFS 이미지로 만들어진다. 여기에서 ubinize가 사용된다.
ubinize -o 출력파일이름 -p Erasable Block Size(블럭사이즈) -m 최소입출력사이즈(그냥 페이지사이즈) -s sub-page사이즈(이것도 그냥 페이지사이즈) ini파일
ini파일에는 출력이미지에 들어갈 모든 볼륨 파티션에 대한 정보가 들어간다.
[sysfs_volume]
mode=ubi
image=ubifs-system.img //위에서 만든 UBIFS이미지 이름 명시.
vol_id=0
vol_size= 917504 // 70 blocks * block size
ubifs-system.img
vol_type=dynamic
vol_name=rootfs
[usrfs_volume]
mode=ubi //ubi 볼륨으로 만들라고 명시.
image=ubifs-system.img //위에서 만든 UBIFS이미지 이름 명시.
vol_id=1
vol_type=dynamic
vol_name=usrfs
vol_flags = autoresize //남는 공간은 알아서 할당하라는 의미
위에서 만든 2개의 UBIFS 볼륨이 모두 들어가 있다.
위에서 sysfs_volume의 경우 최소 896K는 되어야 한다.
이렇게 ubi_system.ini를 만들고 아래와 같이 ubinize를 실행한다.
ubinize -o system.ubi -m 2048 -p 128KiB -s 2048 ubi_system.ini