logical_pages_per_block=`expr $pages_per_block - 2`
logical_erase_block_size=`expr $page_size_in_bytes /* $logical_pages_per_block` echo \[$logical_erase_block_size]bytes.\
#Block size = page_size * pages_per_block
block_size=`expr $page_size_in_bytes /* $pages_per_block` echo \[$block_size]bytes.\
#physical blocks on a partition = partition size / block size
partition_physical_blocks=`expr $partition_size_in_bytes / $block_size`
echo \[$partition_physical_blocks]\
#Logical blocks on a partition = physical blocks on a partitiion - reserved for wear level patition_logical_blocks=`expr $partition_physical_blocks - $wear_level_reserved_blocks` echo \[$patition_logical_blocks]\
#File-system volume = Logical blocks in a partition * Logical erase block size fs_vol_size=`expr $patition_logical_blocks /* $logical_erase_block_size` echo \[$fs_vol_size]bytes.\ echo
echo \echo \> $config_file echo \
echo \echo \
echo \echo \echo \echo
# Note: Check necessary program for installation
#echo -n \#check_program mkfs.ubifs ubinize #echo \
#Generate ubifs image echo -n \
./mkfs.ubifs -x lzo -m $page_size_in_bytes -e $logical_erase_block_size -c $patition_logical_blocks -o rootfs_ubifs.img -d $path_to_rootfs check_result
echo -n \
./ubinize -o ubi.img -m $page_size_in_bytes -p $block_size -s $page_size_in_bytes $config_file -v
check_result
rm -f rootfs_ubifs.img rm -f $config_file
(4)将mkfs.ubifs和ubinize以及create-ubifs.sh放置在同一目录下,然后调用create-ubifs.sh即可创建ubifs文件系统,create-ubifs.sh用法如下:
create-ubifs.sh page_size_in_bytes(页大小) pages_per_block(每个扇区的页数量)
partition_size_in_bytes(分区大小) blocks_per_device(扇区数量) path_to_rootfs(文件系统路径) 举例如下:
./create-ubifs.sh 2048 64 83886080 4096 ./rootfs
上面命令的意思是调用create-ubifs.sh将当前目录下的rootfs文件夹的内容制作成ubifs文件系统,nand flash的页大小为2k,每个扇区有64页,
总共有4096个扇区,要制作的文件系统的大小为83886080字节。
第一、什么是ubifs?
由IBM、nokia工程师Thomas Gleixner,Artem Bityutskiy等人于2006年发起,致力于开发性能卓越、扩展性高的FLASH专用文件系统,以解决当前嵌入式环境下以FLASH作为MTD设备使用时
的技术瓶颈。
关键字:
UBI:一种类似于LVM的逻辑卷管理层。主要实现损益均衡,逻辑擦除块、卷管理,坏块管理等。 UBIFS:基于UBI的FLASH日志文件系统。 有关ubifs的详细介绍,请参考:
http://www.linux-mtd.infradead.org/doc/ubi.html http://www.linux-mtd.infradead.org/doc/ubifs.html 第二、为何使用ubifs? 第三、如何得到ubifs?
2.6.22以后,ubifs活跃于git管理工程中:
git://git.infradead.org/ubi-2.6.git
2.6.27以后,ubifs被整合进内核树中,用户只需下载最新内核即可获取ubifs支持。 第四、如何使用ubifs? 软件环境: linux-2.6.28
arm-linux-gcc 3.4.5 硬件环境: s3c2410 k9f1208 一、准备 1、内核 配置的时候选上
1)Device Drivers --->Memory Technology Device (MTD) support --->UBI - Unsorted block images --->Enable UBI
2)File systems --->Miscellaneous filesystems --->UBIFS file system support 2、mtd-utils工具(flash_eraseall、ubiattach、ubimkvol)准备 1)下载(mtd-utils、zlib、lzo)源码
wget http://debian.mirror.inra.fr/debian/pool/main/m/mtd-utils/mtd-utils_20080508.orig.tar.gz wget http://www.zlib.net/zlib-1.2.3.tar.gz
wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.03.tar.gz 2)编译安装zlib tar xzvf zlib-1.2.3.tar.gz
cd zlib-1.2.3
CC=arm-linux-gcc ./configure --shared --prefix=/usr/local/arm/3.4.5/arm-linux make
make install
cd ..
3)编译安装lzo
tar xzvf lzo-2.03.tar.gz cd lzo-2.03
CC=arm-linux-gcc ./configure --host=arm-linux --prefix=/usr/local/arm/3.4.5/arm-linux make
make install cd ..
4)编译mtd-utils
tar xzvf mtd-utils_20080508.orig.tar.gz cd mtd-utils-20080508 修改Makefile文件: #CROSS=arm-linux-
修改为 CROSS=arm-linux- BUILDDIR := $(CROSS:-=) 修改为 BUILDDIR := .
修改ubi-utils/Makefile文件: 添加 CROSS=arm-linux-
修改 ubi-utils/new-utils/Makefile文件: 添加 CROSS=arm-linux-
make WITHOUT_XATTR=1
ubi-utils子目录下生成我们需要的ubiattach、ubimkvol等文件(请确保是交叉编译所得) 3、mtd-utils工具(mkfs.ubifs、ubinize)准备 git-clone git://git.infradead.org/mtd-utils.git
cd mtd-utils/ make
mkfs.ubifs子目录下生成我们需要的mkfs.ubifs工具 ubi-utils/new-utils子目录下生成我们需要的ubinize工具 二、使用
1、使用ramfs或nfs启动系统,执行以下命令挂载ubifs:
1)flash_eraseall /dev/mtd4 2)ubiattach /dev/ubi_ctrl -m 4
3)ubimkvol /dev/ubi0 -N rootfs -s 50MiB
4)mount -t ubifs ubi0_0 /mnt或mount -t ubifs ubi0:rootfs /mnt 2、如果你想使用ubifs为rootfs,把文件系统内容解压到ubifs挂载目录下,并修改内核启动参数为: console=ttySAC0 ubi.mtd=4 root=ubi0:rootfs rootfstype=ubifs
3、如果你想直接在bootloader下烧写ubifs映像,使用以下命令制作ubi烧写映像: mkfs.ubifs -r rootfs -m 512 -e 15872 -c 3303 -o ubifs.img ubinize -o ubi.img -m 512 -p 16KiB -s 256 ubinize.cfg 其中:
1)以上命令的参数可从ubifs挂载信息中提取:
UBI: attaching mtd4 to ubi0 UBI: physical eraseblock size: 16384 bytes (16 KiB) UBI: logical eraseblock size: 15872 bytes UBI: smallest flash I/O unit: 512 UBI: sub-page size: 256 UBI: VID header offset: 256 (aligned 256) UBI: data offset: 512 UBI: attached mtd4 to ubi0 2)配置文件ubinize.cfg的内容为: [ubifs] mode=ubi
image=ubifs.img vol_id=0
vol_size=50MiB vol_type=dynamic vol_name=rootfs vol_flags=autoresize 注:
其他nand flash下ubifs的使用方法类似(参数不同)。
=============================================================================
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文件系统