고급 개발자로 가는 길

OS/Linux

UBI 혼자 끄적

다크엔지니어 2020. 4. 29. 21:31
반응형

두서 없이 써 나아가보겠다

UBIFS

--------------------
UBI Volume

--------------------
Unsorted block Image UBI

--------------------
MTD Memory technology Device

--------------------
NAND NOR Driver

--------------------
NAND NOR Flash Memory

의 구조라고일단 정리를 해보았다.

- UBI 란

우선 UBI 가 뭐하는 녀석이냐면..
UBI 는 Nand Flash memory 를 management 할 수 있는 system 이다.
UBI 는 disk 와는 다르게 volum 으로 나누어져 있으며 UBI 를 통해 mtd(device) 에 mapping 한다.
UBI 는 logical erase block 126KB 으로 이루어져 있으며, mtd 는 phsical erase block 128KB 로 이루어져있다.
UBI 는 UBIFS 를 통해 관리(interface)가 되며, indexing table에 의해 UBI Filesystem Data를 찾거나 쓸 수 있다.
UBI 는 LEB#0 이 superblock 이다.
UBI 는 결국 UBIFS 라는 Interface 를 이용하여 Nand Flash Memory 에 접근하여 부팅해서 쓴다 이 말을 하고싶었던 거다.


이 외에도 JFFS, YAFFS, FAT, EX2 등이 있고 JFFS TAFFS 는 바로 Block Device Driver 를 통해 MTD Device에 접근하고,
FAT EX2 는 FTL 을 통해 MTD 에 접근한다. FTL도 Device 이다.

참고로 MTD API kernel api - include/linux/mtd/mtd.h   경로에 source 가 존재하며 user api - /dev/mtd0 이다.

          UBI API kernel api - include/linux/mtd/ubi.h   경로에 source 가 존재하며 user api /dev/ubi0 이다.

 

 

- FileSystem

UBIFS 는 Block Device 기반인 HardDriver, MMC, SSD, USB Flash memory, SDcard 등에서는 동작안하고 
오로지 raw flash memory 위에서 동작하게끔 설계되어있다. 즉, UBIFS는 UBI volume 위에서 동작한다. 
이와 다르게 MMC, SD, FAT는 FTL 을통해 emulation 한다. 
UBIFS is Filesystem of FS indexing information 을 flash memory media에 유지함으로써, 마운트 할때마다 미디어 전체를 scan 하지 않는다. 속도가 빨라지는 이유이다.
source 경로는 UBIFS /include/uapi/mtd/ubi-user.h -> /include/mtd/ubi.h -> /fs/ubifs/ubifs.h 이다.

UBIFS Index
 - UBIFS Filesystem 에서 index는 file system의 data 로 UBI volume에 어디에 위치해 있는지 detect 해준다.
   Flash 에 save 되어있기 때문에 total flash media 를 scan 할 필요가 없다. 마운트 할때의 장점이 되겠다.
   Index is b + tree using    즉, ubi Filesystem index -> filesystem data로 flash physical address 를 찾을 수 있도록 해준다. 


 - Master node is Root index node를 가리키고 있으며 Master area(LEB1 and 2) 에 Position 하고 있다.
   mount 할 때 master area 가 scanning 된다.
   Superblock is LEB#0 is Position 하며 UBIFS 에서 read only 로 using.
   Indexing tree의 fanout이나 압축형태zlib or lzo 등을 save 하고 있다.
   mount 할 때 read 된다.

 - Journal , TNC
   Flash 상의 index 에 대한 update 주기를 감소시키기 위한 목적으로 Journal 을 사용한다.
   즉 마운트에도 scan에 좋은 효과를 주겠다. backup 과 비슷하다.
   indexing information is Ram 에서만 변경된다. (TNC) Rom 은 read only 라서 그런듯 하다.
   Tree Node Cache is Indexing tree of lookup speed 향상이 목적
   즉 Journal and Tree Node Cache 는 UBI FS indexing 속도 향상을 위하서이며 이는 mount 할때 도 증명된다.


 - UBI Image 분석 - Mounting UBI Image on PC using nandsim
   Fake MTD device 생성 :: nandsim 을 이용해서 만드는데 modprobe nandsim total_size=32768 을 하면된다.
   cat /proc/mtd 를 치면 mtd size 와 name 이 나온다.
   UBI module로 mtd device를 attach :: modprobe ubi mtd=0
   UBI volume 생성 :: ubimkvol /dev/ubi0 -N rootfs -s 10MiB , rootfs 는 볼륨 이름이다.
   MTD 만들고.. UBI Modlue만들고... attach 하고 ... volume 만들고 뭐 이런순인건가..싶다.

   볼륨 마운트 :: mount -t ubifs ubi0:rootfs /mnt/ubifs  이 방법은 mtd device -> ubi -> ubivolume -> ubifs 등의 순       서로 만들 때 사용하게 된다. 

 

아래 그림은 삼성에서 만든 Nand Flash Memory 이다. 본인이 사용하는 칩이다. 모델명은 K 로시작하는데 까먹었다.. 검색하면 금방 찾는다.. 대중적이라

 

- Image를 통한 nand 접근 방법

Image 는 UBIFS 과 UBI 가 존재한다. 말한 순서대로 생성해야 한다. UBIFS는 UBIVOLUME 에서 존재하며 UBI는 MTD DEVICE 에서 존재한다. management 된다고 보면된다.


ubifs.img 생성

sudo mkfs.ubifs -F -r /disk1/prj/335x/rootfs -m 2048 -e 126976 -c 3390 -o ubifs.img //ubifs image 만들기 
-F filesystem free space 가 첫번째 mount 시 설정한다. 
-r filesystem 파일시스템 이미지 소스가 되는 디렉토리를 표시한다. 
-m 2048 ubi 와 mtd 디바이스에서 사용되는 최소 io 사이즈 1page size L 2048 bytes. 
-e 126976 Erase Block Size 로 ubi 는 rkr physical erase block 의 오버헤드에 대비하여 126KB 이니깐.. 126976 byte 
-c 3990 파일시스템에서의 최대 leb 블록 개수이다. 
-o ubifs.img 출력파일이름이다. 

cat ubifs.ini << ubifs 설정 값이 있는 파일이다. ubifs image 를 통해 생성된다.
[ubifs] 
mode=ubi 
image=ubifs.img 
vol_id=0 
vol_size=480mib 
vol_type=dynamic 
vol_name=rootfs 
vol_flags=autoresize 

ubi.img 생성
ubinize 도구를 이용해서 ubi 이미지 생성한다.
ubinize -o ubi.img -m 2048 -p 128KiB -s 512 ubinize.cfg
   
ubi.img 는 EC header , vid header (leb 관한 정보가 있음)를 분석할 수 있다.
ubifs img 는 common header 등 node 를 공통으로 type 에 따라 관리한다. type 이란 superblock, master, inode, data
등 super, master, master, , , struct ubifs_sb_node, struct ubifs_mst_node  등으로 만들어서 관리한다.. 당연히 leb 등을  관리  한다. struct ubifs_ch 등..inode 에는 대상 inode 가 일반파일인지 디렉터리인지에 대한 타입 하드링크 등 정보있다.
UBI Reader 라는게 있는데 UBIFS 분석도구이다. Python 으로 작성되어 UBI UBIFS image 를 분석하고 정보를 보여주거나 파일를 추출할 수 있는 기능이다.     https://github.com/jrspruitt/ubi_reader  참고
   


- mount를 통한 nand 접근 방법

아래는 Image를 사용하지 않았을 경우에 UBIFS 을 통해 nand flash memory에 접근하는 방법이다.

아래 명령어를 하려면 당연히 uboot 와 kernel 이 이미 올라와있어야 가능한 상황이다.
ubiformat /dev/mtd7 -s 512 -O 2048  // nand flash 초기화, mtd7 을 생성?
ubiattach /dev/ubi_ctrl -m 7 -O 2048  // ubi 를 mtd 7 과 연결
ubimkvol /dev/ubi0 -N rootfs -m // ubi0창치에 rootfs 이라는 volume을 생성
mount -t ubifs ubi0:rootfs /temp   // ubifs 을 ubi0 창치 rootfs volume에 만들어 /temp와 mount 한다.

이제 저 /temp 를 통해 nand flash memory 와 연결할 수 있고 저기에 rootfs 을 복사나 옮겨 놓기만 하면 

마치 nand rom 에 footfs 가 실제로 올라간 것 처럼 사용 가능하다.






부팅할때의 과정을 간략하게 정리해 보자면 아래와 같을 것이다.

             boot ,                                            code,                                          storage 영역
         bl0 bl1 bl2                                        u-boot 
       spl splBack1~3                           i-boot env, linux kernel                                filesystem
  ECC, Bad block menage           ECC wear labelloing , garbage collection        ECC error collection code 


512 byte 당 1bit ECC 가능 1page 서 1bit 가능 2bit 나올시 check 필요하다.

- Gabage Collection
사용가능한 Vaild Page 를 만들고 InVaild Page 를 없엔다.

- ECC Error check correction
Nand Flash memory 는 error 율이 높으므로 ECC 가 필요하며 OOB or SpareArea 서 BadBlockMarker and Hamming,BCH4 8 12 등의 알고리즘을 사용한다. SLC의 경우 Hamming BCH4 로 충분하며 MLC, TLC 의 경우 BCH4 8 12 가 적절하다.
뒤에 숫자의 의미는 Correction 가능한 비트 수 이다. BBM 은 Primary, secondary가 있다. 4비트이며 Bbt0, 1tbB 가 있다. 

 


- binMake 를 활용한 쉬운 포팅 방법


이 전에는 motion board 에 boot mode 를 uart cable 및 ethernet cable 로 booting 하여(100000) serial port 로 연결하여
tera term com port 로u-boot.spl.bin 을 파일 다운로드하고 power on 하고
u-boot.img 파일 다운로드 하고 > Hit any ket to stop autoboot 에서 Enter key 로 uboot 모드에 진입하고
MLO, uboot 이미지를 nand 에 write 한다.
그 다음 boot mode 를 010010 으로 변경하는데 nand boot 이다.
nand boot 를 하는 이유는 MLO, uboot을 nand에 해주었기 때문이다.
또 Enter key로 uboot 모드에 진입 한 후 setenv로 serverip 와 ipaddr gate net rootpath를 설정 한 다음
tftp 로 uImage 를 write to nand 한다. >> 그러면 nand 에 MLO uboot kernel 이 올라가 있는것이다.
마지막으로 rootfs 을 올려야 하는데 ubiformat으로 mtd를 sector(step)을 설정하고 -O 2048(page) 을 설정한다.
그리고 ubiattach /dev/ubi_ctrl -m 7(mtd block) -O 2048(page) 로 mtd 와 ubi 를 연동을 한다.
ubimkvol /dev/ubi0 -N rootfs -m 으로 ubi volume을 생성과 이름은 ubi0 장치의 rootfs 으로 만든다.
mtd ubi ubivolume 가 만들어 졌으므로 mount -t ubifs /dev/ubi0:rootfs /temp 하는데
ubifs으로 /dev/ubi0 장치의 rootfs 인 ubi volume 에 /temp 에서 접속할수 있게 mount 한다는 것이다.


최종적으로 정리하자면
sudo mkfs.ubifs -F -r ~~~/rootfs -m 2048 -e 127~ -c 3390 -o ubifs.img
ubifs.img 를 생성하게 된다. << ubifs는 rootfs 와 volume에 대한 정보를 생성한다고 보면된다.
sudo ubinize -o ubifs.final -p 127KiB~ -m 2048 -s 2048 ubifs.ini
ubifs.final 을 생성하게 된다. << ubi 와 ubi mtd 관련된 정보를 생성하고 ubifs.img 포함된다고 보면된다.
bin2nand 를 줄여서 b2n 이라고 부르고 bin2nand 를 통해 ECC error check correction 을 생성한다.
부가적으로 page , sector (step) , spare 등을 작업 가능하다. final data 를 통해 spare area에 bad block marker와
bch, hamming 등을 만들어 낸다.
최종적으로 ubifs.b2n.fopen 이라는 file 을 얻게 된다. 이 파일은 기존에 만들어져 있는
binMake 파일에 cp 하고 binMake file 에는 MLO, U-boot, ubotfs(kernel), ubifs.b2n.fopen, rsv 등을
하나의 nand.bin file 로 생성하여 최종적으로 bootloader, kernel, rootfilesystem 이 들어가 있는 file 이 된다.
이 파일을 usb 등에 넣어 write nand flash 장비에서 쉽게 nand 에 write 할 수 있고, motion board에 nand 에도 usb에 넣어 쉽게 올릴 수 있다.

반응형

'OS > Linux' 카테고리의 다른 글

uboot 모드 작업하기  (0) 2020.05.09
shell script  (0) 2020.05.08
임베디드 리눅스의 구조  (0) 2020.04.25
Oracle, Ubuntu 18.04 Install  (0) 2020.04.11
Putty, Tera Term VT 사용  (1) 2020.04.09