UBI文件系统简介 收藏
在linux-2.6.27以前,谈到Flash文件系统,大家很多时候多会想到cramfs、jffs2、yaffs2等文件系统。它们也都是基于文件系统+mtd+flash设备的架构。linux-2.6.27后,内核加入了一种新型的flash文件系统UBI(Unsorted Block Images)。这里简单介绍下UBI文件系统加入的原因,及使用方法。我也是刚接触到这个文件系统,可能有理解不对的地方,也请指正。
一、产生的背景
FLASH具有的“先擦除再写入”、坏块、“有限的读写次数”等特性,目前管理FLASH的方法主要有:
1、采用MTD+FTL/NFTL(flash 转换层/nand flash转换层)+ 传统文件系统,如:FAT、ext2等。FTL/NFTL的使用就是针对FLASH的特有属性,通过软件的方式来实现日志管理、坏块管理、损益均衡等技术。但实践证明,由于知识产权、效率等各方面因素导致本方案有一定的局限性。
2、采用硬件翻译层+传统文件系统的方案。这种方法被很多存储卡产品采用,如:SD卡、U盘等。这种方案对于一些产品来说,成本较高。
3、采用MTD+ FLASH专用文件系统,如JFFS1/2,YAFFS1/2等。它们大大提高了FLASH的管理能力,并被广泛应用。
JFFS2、YAFFS2等专用文件系统也存在着一些技术瓶颈,如:内存消耗大,对FLASH容量、文件系统大小、内容、访问模式等的线性依赖,损益均衡能力差或过渡损益等。在此背景下内核加入了UBI文件系统的支持。
二、用法
环境:omap3530处理器、 (128MByte 16 位NAND Flash) 、linnux-2.6.28内核
1、配置内核支持UBIFS
Device Drivers --->Memory Technology Device (MTD) support --->UBI - Unsorted block images --->Enable UBI
配置mtd支持UBI接口
File systems --->Miscellaneous filesystems --->UBIFS file system support
配置内核支持UBIFS文件系统
2、将一个MTD分区4挂载为UBIFS格式
● flash_eraseall /dev/mtd4 //擦除mtd4
● ubiattach /dev/ubi_ctrl -m 4 //和mtd4关联
● ubimkvol /dev/ubi0 -N rootfs -s 100MiB //设定volume 大小(不是固定值,可以用工具改变)及名称
● mount -t ubifs ubi0_0 /mnt/ubi或mount -t ubifs ubi0:rootfs /mnt/ubi
3、制作UBIFS文件系统
在制作UBI镜像时,需要首先确定以下几个参数:
MTD partition size; //对应的FLASH分区大小
flash physical eraseblock size; // FLASH物理擦除块大小
minimum flash input/output unit size; //最小的FLASH输入输出单元大小
for NAND flashes - sub-page size; //对于nand flash来说,子页大小
logical eraseblock size.//逻辑擦除块大小
参数可以由几种方式得到
1)如果使用的是2.6.30以后的内核,这些信息可以通过工具从内核获得,如:mtdinfo –u。
2)之前的内核可以通过以下方法:
● MTD partition size:从内核的分区表或cat /proc/mtd获得
● flash physical eraseblock size:从flash芯片手册中可以得到FLASH物理擦除块大小,或cat /proc/mtd
● minimum flash input/output unit size:
1)nor flash:通常是1个字节
2)nand falsh:一个页面
● sub-page size:通过flash手册获得
● logical eraseblock size:对于有子页的NAND FLASH来说,等于“物理擦除块大小-1页的大小”
3)也可以通过ubi和mtd连接时的产生的信息获取,如:
#modprobe ubi mtd=4 //ubi作为模块加载
或
#ubiattach /dev/ubi_ctrl -m 4 //通过ubiattach关联MTD
UBI: attaching mtd4 to ubi0
UBI: physical eraseblock size: 131072 bytes (128 KiB)
UBI: logical eraseblock size: 129024 bytes
UBI: smallest flash I/O unit: 2048
UBI: sub-page size: 512
UBI: VID header offset: 512 (aligned 512)
UBI: data offset: 2048
UBI: attached mtd4 to ubi0
更详细的解释参见http://www.linux-mtd.infradead.org/doc/ubi.html#L_overhead
#mkfs.ubifs -r rootfs -m 2048 -e 129024 -c 812 -o ubifs.img
#ubinize -o ubi.img -m 2048 -p 128KiB -s 512 /home/lht/omap3530/tools/ubinize.cfg
-r:制定文件内容的位置
-m:页面大小
-e:逻辑擦除块大小
-p:物理擦除块大小
-c:最大的逻辑擦除块数量
对我们这种情况,文件系统最多可以访问卷上的129024*812=100M空间
-s:最小的硬件输入输出页面大小,如:k9f1208为256(上下半页访问)
其中,ubinize.cfg的内容为:
[ubifs]
mode=ubi
image=ubifs.img
vol_id=0
vol_size=100MiB
vol_type=dynamic
vol_name=rootfs
vol_flags=autoresize
4、利用uboot烧写、启动UBIFS镜像
1)烧写UBIFS镜像
OMAP3 DevKit8000 # mmcinit
OMAP3 DevKit8000 # fatload mmc 0:1 81000000 ubi.img
reading ubi.img
12845056 bytes read
OMAP3 DevKit8000 # nand unlock
device 0 whole chip
nand_unlock: start: 00000000, length: 268435456!
NAND flash successfully unlocked
OMAP3 DevKit8000 # nand ecc sw
OMAP3 DevKit8000 # nand erase 680000 7980000
NAND erase: device 0 offset 0x680000, size 0x7980000
Erasing at 0x7fe0000 -- 100% complete.
OK
OMAP3 DevKit8000 # nand write.i 81000000 680000 $(filesize)
NAND write: device 0 offset 0x680000, size 0xc40000
Writing data at 0x12bf800 -- 100% complete.
12845056 bytes written: OK
烧写过程和烧写内核镜像的过程一致,所以UBI文件系统应该不像yaffs文件系统那样用到了nand的OOB区域。
2)设置UBIFS文件系统作为根文件系统启动的参数
OMAP3 DevKit8000 # setenv bootargs console=ttyS2,115200n8 ubi.mtd=4 root=ubi0:rootfs
rootfstype=ubifs video=omapfb:mode:4.3inch_LCD
OMAP3 DevKit8000 # setenv bootcmd nand read.i 80300000 280000 200000/;bootm 80300000
根文件系统的位置在MTD4上
系统启动时会打印出如下和UBI相关的信息:
Creating 5 MTD partitions on "omap2-nand":
0x00000000-0x00080000 : "X-Loader"
0x00080000-0x00260000 : "U-Boot"
0x00260000-0x00280000 : "U-Boot Env"
0x00280000-0x00680000 : "Kernel"
0x00680000-0x08000000 : "File System"
UBI: attaching mtd4 to ubi0
UBI: physical eraseblock size: 131072 bytes (128 KiB)
UBI: logical eraseblock size: 129024 bytes
UBI: smallest flash I/O unit: 2048
UBI: sub-page size: 512
UBI: VID header offset: 512 (aligned 512)
UBI: data offset: 2048
UBI: attached mtd4 to ubi0
UBI: MTD device name: "File System"
UBI: MTD device size: 121 MiB
UBI: number of good PEBs: 970
UBI: number of bad PEBs: 2
UBI: max. allowed volumes: 128
UBI: wear-leveling threshold: 4096
UBI: number of internal volumes: 1
UBI: number of user volumes: 1
UBI: available PEBs: 0
UBI: total number of reserved PEBs: 970
UBI: number of PEBs reserved for bad PEB handling: 9
UBI: max/mean erase counter: 2/0
以上是从网络下载下来的关于ubifs的操作方法,有一定的参考价值。
以下是从marvell获得操作文档。
Building the mtd-utils
======================
For Debian distribution, you need the following packages installed for
building the head snapshot of mtd-utils,
uuid-dev
liblzo2-dev
libz-dev
Extract the latest snapshot of mtd-utils and go into the sub directory of
'mkfs.ubifs' and then type 'make' to build the mkfs.ubifs utility. Once it
is done, go up one directory and then go into the sub directory 'ubi-tuils'.
Inside that directory, type 'make' again to make the rest of ubi utilities
(ubinfo, ubinize, ubiformat, etc.).
How to find out min. I/O unit size, sub-page size, etc
======================================================
The easiest way to find this out is to attach your MTD device to UBI and
glance to the syslog/dmesg output (erase the MTD device before doing this).
The newest UBI prints something like this:
UBI: attaching mtd0 to ubi0
UBI: physical eraseblock size: 262144 bytes (256 KiB)
UBI: logical eraseblock size: 258048 bytes
UBI: smallest flash I/O unit: 2048
UBI: VID header offset: 2048 (aligned 2048)
UBI: data offset: 4096
UBI: empty MTD device detected
UBI: create volume table (copy #1)
UBI: create volume table (copy #2)
UBI: attached mtd0 to ubi0
UBI: MTD device name: "rootfs"
UBI: MTD device size: 2048 MiB
UBI: number of good PEBs: 8183
UBI: number of bad PEBs: 9
UBI: max. allowed volumes: 128
UBI: wear-leveling threshold: 4096
UBI: number of internal volumes: 1
UBI: number of user volumes: 0
UBI: available PEBs: 8098
UBI: total number of reserved PEBs: 85
UBI: number of PEBs reserved for bad PEB handling: 81
UBI: max/mean erase counter: 0/0
UBI: background thread "ubi_bgt0d" started, PID 254
How to attach an MTD device
===========================
If UBI is compiled into the kernel, the mtd device to attach may be specified
in the ubi.mtd=kernel boot parameter, e.g.,
ubi.mtd=0
(For attaching the first MTD device)
How to Mount a UBI device
=========================
First, you need to create a user volume on the UBI device.
ubimkvol /dev/ubi0 -n 0 -N rootfs -s 4096MiB
The above commands will only work after the correct kernel boot parameter is
specified. Once the user volume is created, you may use the following command
to mount it,
mount -t ubifs ubi0:rootfs /mnt
If there is no need to keep the user volume, you may use the following command
to delete it,
ubirmvol /dev/ubi0 -n 0
How to create UBI images
========================
First, you need to use the mkfs.ubifs utility to create a volume for your root
file system,
mkfs.ubifs -m 2KiB -e 258048 -x lzo -c 8000 -d foxes-rootfs-20081128/ -o system_ubifs.img
(The above command must have root previledge)
Then use the ubinize utility to combine all the volumes you need into a UBI
image,
ubinize -o system_ubi.img -m 2KiB -p 256KiB -s 2KiB ubinize.cfg
In the ubinize.cfg, the following items are specified,
# Section header
[rootfs]
# Volume mode (other option is static)
mode=ubi
# Source image
image=system_ubifs.img
# Volume ID in UBI image
vol_id=0
# Volume size
vol_size=1900MiB
# Allow for dynamic resize
vol_type=dynamic
# Volume name
vol_name=rootfs
# Autoresize volume at first mount
vol_flags=autoresize
How to flash UBI images (and preserve erase counters)
=====================================================
First, you need to detach the ubi device by using the follwing command if the
ubi device is attached,
ubidetach /dev/ubi_ctrl -d 0
The, use the ubiformat utility.
ubiformat /dev/mtd0 -f system_ubi.img
How to use UBIFS as the root file system
========================================
You must specify the following text in the kernel boot parameter,
ubi.mtd=0 root=ubi0:rootfs rootfstype=ubifs rw mtdparts=cafe_nand:2G(rootfs)
More Infromation
================
You may obtain more information at the following web sites,
(1) UBI FAQ and HOWTO (Memory Technology Device (MTD) Subsystem for Linux)
http://www.linux-mtd.infradead.org/faq/ubi.html
(2) UBIFS initial experiments (OLPC)
http://wiki.laptop.org/go/UBIFS_initial_experiments
两者虽有重复的地方,却有互有补充的地方。
以上的指导,可以应付大部分的应用层操作了。