内核移植和文件系统制作(4):UBIFS根文件系统制作总结

发布者:rho27最新更新时间:2024-07-24 来源: elecfans关键字:内核移植  文件系统  UBIFS  根文件系统 手机看文章 扫描二维码
随时随地手机看文章

UBIFS文件系统简介: 

无排序区块图像文件系统(UnsortedBlock Image File System, UBIFS)是用于固态硬盘存储设备上,并与LogFS相互竞争,作为JFFS2的后继文件系统之一。真正开始开发于2007年,并于2008年10月第一次加入稳定版本于Linux核心2.6.27版。UBIFS最早在2006年由IBMNokia的工程师Thomas Gleixner,ArtemBityutskiy所设计,专门为了解决MTD(MemoryTechnology Device)设备所遇到的瓶颈。由于Nand Flash容量的暴涨,YAFFS等皆无法再去控制Nand Flash的空间。UBIFS通过子系统UBI处理与MTD device之间的动作。JFFS2一样,UBIFS建构于MTD device之上,因而与一般的block device不兼容。JFFS2运行在MTD设备之上,而UBIFS则只能工作于UBIvolume之上。也可以说,UBIFS涉及了三个子系统:

1.      MTD 子系统, 提供对flash芯片的访问接口,MTD子系统提供了MTD device的概念,比如/dev/mtdx,MTD可以认为是raw flash

2.      UBIsubsystem,为flash device提供了wear-leveling和 volume management功能; UBI工作在MTD设备之上,提供了UBI volume;UBI是MTD设备的高层次表示,对上层屏蔽了一些MTD不得不处理的问题,比如wearing以及坏块管理

3.      UBIFS文件系统,工作于UBI之上,必须在Device Drivers中选择支持MTD


以下是UBIFS的一些特点:

Ø     可扩展性:UBIFS对flash 尺寸有着很好的扩展性; 也就是说mount时间,内存消耗以及I/O速度都不依赖与flash 尺寸(对于内存消耗并不是完全准确的,但是依赖性非常的低);UBIFS可以很好的适应GB flashes;  当然UBI本身还有扩展性的问题,无论如何 UBI/UBIFS都比JFFS2的可扩展性好,此外如果UBI成为瓶颈,还可以通过升级UBI而不需改变UBIFS

Ø     快速mount:不像JFFS2,UBIFS在mount阶段不需要扫描整个文件系统,UBIFS mount介质的时间只是毫秒级,时间不依赖与flash的尺寸;然而UBI的初始化时间是依赖flash的尺寸的,因此必须把这个时间考虑在内

Ø     write-back支持:回写或者叫延迟写更准确些吧,同JFFS2的write-through(立即写入内存)相比可以显著的提高文件系统的吞吐量。

Ø     异常unmount适应度:UBIFS是一个日志文件系统可以容忍突然掉电以及unclean重启; UBIFS 通过replay 日志来恢复uncleanunmount,在这种情况下replay会消耗一些时间,因此mount时间会稍微增加,但是replay过程并不会扫描整个flash介质,所以UBIFS的mount时间大概在几分之一秒。

Ø     快速I/O - 即使我们disablewrite-back(可以在unmount时使用-o syncmount选项), UBIFS的性能仍然接近JFFS2;记住,JFFS2的同步I/O是非常惊人的,因为JFFS2不需要在flash上维护indexing data结构, 所以就没有因此而带来的负担; 而UBIFS恰恰是有index数据的。 UBIFS之所以够快是因为UBIFS提交日志的方式:不是把数据从一个地方移动到另外一个位置,而只是把数据的地址加到文件系统的index,然后选择不同的eraseblock作为新的日志块,此外还有multi-headed日志方式等技巧。

Ø     on-the_flightcompression - 存储在flash介质上的数据是压缩的;同时也可以灵活的针对单个文件来打开关闭压缩; 例如,可能需要针对某个特定的文件打开压缩,或者可能缺省方式下支持压缩,但是对多媒体文件则关闭压缩。

Ø     可恢复性 - UBIFS可以从index破坏后恢复; UBIFS中的每一片信息都有一个header来描述,因此可以通过扫描这个flash介质来重构文件系统,这点和JFFS2非常类似;想像一下,如果你擦出了FAT文件系统的FAT表,那么对于FAT FS是致命的错误,但是如果擦除UBIFS的index,你人然可以重构文件系统,当然这需要一个特定的用户空间程序来做这个恢复

Ø     完整性 - UBIFS通过写checksum到flash 介质上来保证数据的完整性,UBIFS不会无视损坏文件数据或meta-data;缺省的情况,UBIFS仅仅检查meta-data的CRC,但是你可以通过mount选项,强制进行data CRC的检查


UBIFS文件系统制作过程:

1,添加内核支持(linux-3.8.0):

  Device Drivers  --->    

<*> Memory Technology Device (MTD) support  --->    

 <*>   Enable UBI - Unsorted block images  --->   

--- Enable UBI - Unsorted block images 

(4096) UBI wear-leveling threshold  

(1)   Maximum expected bad eraseblock count per 1024 eraseblocks

[ ]   UBI Fastmap (Experimental feature)  

< >   MTD devices emulation driver (gluebi)  


  File systems  --->  

 [*] Miscellaneous filesystems  --->   

<*>   UBIFS file system support 

[*]     Advanced compression options 

[*]       LZO compression support

[*]       ZLIB compression support 


make编译即可


2,制作文件UBIFS文件系统镜像

mkfs.ubifs工具制作的文件系统映像,在uboot中烧录这种映像文件的方式过于复杂,既要使uboot支持nandflash分区,又要在uboot中激活这个分区,并通过ubi write命令烧录这个映像。为便于移植,需要用到 mkfs.ubifs,ubinize工具,它的作用是将mkfs.ubifs制作的映像转换为可以直接用nand write命令烧录的映像文件。

由于制作mkfs.jffs2和mkfs.ubifs工具,会同时生成ubinize工具,自己就是按照脚本制作的工具和生成UBIFS文件系统镜像。

(1)制作mkfs.jffs2mkfs.ubifs工具的链接:http://blog.csdn.net/fulinus/article/details/8860836

(2)生成UBIFS的脚本:


注意两点:

mkfs.ubifs工具需要明确的参数:

m:页大小,如上:2K

x: 镜像压缩格式,可选 LZO

e:逻辑可擦除块大小

c: 最多逻辑可擦除数目

r(或d):指定根文件目录树

o:指定生产文件名


ubinize工具需要明确的参数:

需要指定一个配置文件,格式如下:

[ubifs-volume]
mode=ubi
image=filename //文件名称,即mkfs.ubifs文件制作生产文件
vol_id=0
vol_size= filesize //文件大小,按实际情况来定
vol_type=dynamic
vol_name=rootfs
vol_flags=autoresize
vol_alignment=1

m: 页大小,2k

p: 物理块擦除大小

s:一般和页大小一样 2k

v:头部大小,一般是512

o: 指定输出文件


mkfs.ubifs和ubinize用法参考链接:

http://wenku.baidu.com/link?url=ZjS_qifTxWr68prdj780aT6yFp0rD8IbZGFvbT0ASwUhZbvdQBBzyIGTp_d5bbJx5IAb4TJX4CDmdUJ26mRwn2hij7G58X-WHPZVYCpR1MG


UBIFS文件系统介绍:

http://wenku.baidu.com/view/eebeacd9a58da0116c174991.html




制作脚本:

[zhouguangfeng@localhost ubifs]$ vim build_ubifs.sh 


#!/bin/sh

CPU=zhou
rootfs_dir=../rootfs //指定根文件目录,根据根文件目录树而定
partition_sizeM=40
image_name=rootfs_${CPU}.ubifs


if [ ! -d $rootfs_dir ] ; then
    echo 'Miss rootfs source code tree '$rootfs_dir' exit...'
    exit;
fi


#Default setting by UBIFS
sub_page_size=512
vid_head_offset=512


#-m, minimum I/O unit size, it's 2K(the Page size) on K9F2G08, refer to 'UBI: smallest flash I/O unit:    2048' 
page_size_in_bytes=2048
#echo 'Page size [$page_size_in_bytes] bytes.'


#It's 64 pages per block on K9F2G08
pages_per_block=64
block_size_in_bytes=`expr $page_size_in_bytes * $pages_per_block`
#echo '[$pages_per_block] pages per block and [$block_size_in_bytes] bytes'


#It's 2048 blocks on K9F2G08
blocks_per_device=2048
#echo 'Blocks per device  [$blocks_per_device]'


#-e, logical erase block size, fixed on K9F2G08, refer to u-boot information 'UBI: logical eraseblock size:  129024 bytes'
# logical erase block size is physical erase block size minus 1 page for UBI
logical_pages_per_block=`expr $pages_per_block - 1`
logical_erase_block_size=`expr $page_size_in_bytes * $logical_pages_per_block`
#echo 'Logical erase block size:  [$logical_erase_block_size] bytes.'





#The rootfs partition size in bytes
partition_size_in_bytes=`expr $partition_sizeM * 1024 * 1024`
partition_physical_blocks=`expr $partition_size_in_bytes / $block_size_in_bytes`
#echo 'Partition size [$partition_size_in_bytes] bytes and [$partition_physical_blocks] 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 'Logical blocks in a partition [$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 'File-system volume [$fs_vol_size] bytes.'


config_file=rootfs_ubinize.cfg
image_tmp=ubifs-${CPU}.img


set -x

echo ''
echo 'Generating $image_name file by mkfs.ubifs...'
/usr/bin/mkfs.ubifs -x lzo -m $page_size_in_bytes -e $logical_erase_block_size -c $patition_logical_blocks -r
$rootfs_dir -o $image_tmp
set +x


echo
echo 'Generating configuration file...'
echo '[ubifs-volume]' > $config_file
echo 'mode=ubi' >> $config_file
echo 'image=$image_tmp' >> $config_file
echo 'vol_id=0' >> $config_file
echo 'vol_size=$fs_vol_size' >> $config_file
echo 'vol_type=dynamic' >> $config_file
echo 'vol_name=rootfs' >> $config_file
echo 'vol_flags=autoresize' >> $config_file
echo 'vol_alignment=1' >> $config_file
echo


set -x
/usr/bin/ubinize -o $image_name -m $page_size_in_bytes -p $block_size_in_bytes -s $sub_page_size  -O    $vid_head_offset
$config_file

rm -f $image_tmp $config_file
cp $image_name /tftp

set +x

[zhouguangfeng@localhost ubifs]$ sh build_ubifs.sh 

[zhouguangfeng@localhost ubifs]$ ls
build_ubifs.sh  rootfs_zhou.ubifs
[zhouguangfeng@localhost ubifs]$ OK!


使用的linux服务器已经开启tftp,ip为192.168.1.3,最后脚本直接将镜像文件拷贝到/tftp目录下,并在uboot下设置serverip为192.168.1.3。


3,在uboot添加对UBIFS的支持

nandflash分区如下:


Creating 9 MTDpartitions on 'NAND':

0x000000000000-0x000000100000: 'mtdblock0_u-Boot 1MB '

0x000000100000-0x000001000000 : 'mtdbolck1_kernel 15MB'

0x000001000000-0x000002400000: 'mtdbolck2_ramdisk 20MB'

0x000002400000-0x000003800000: 'mtdblock3_cramfs 20MB'

0x000003800000-0x000006000000: 'mtdblock4_jffs2 40MB'

0x000006000000-0x000008800000: 'mtdblock5_yaffs2 40MB'

0x000008800000-0x00000b000000: 'mtdblock6_ubifs 40MB'

0x00000b000000-0x00000d800000: 'mtdblock7_apps 40MB'

0x00000d800000-0x000010000000: 'mtdblock8_data 40MB'

其中kernel和UBIFS镜像文件系统烧写的地址一定要与分区对应,分区mtdbolck1放置内核和分区mtdblock6放置UBIFS,偏移分别为100000和8800000


[ s3c2440@zhou ]# set serverip 192.168.1.3

[ s3c2440@zhou ]# set bubifs 'tftp 30008000 rootfs_zhou.ubifs;nand erase 8800000 2800000;nand write 30008000 8800000 800000'

[ s3c2440@zhou ]# set bootargs_ubifs 'console=ttyS0,115200 mem=64Mubi.mtd=6 root=ubi0:rootfs rootwait rootfstype=ubifs rw'

[ s3c2440@zhou ]# set bootargs  'console=ttyS0,115200 mem=64Mubi.mtd=6 root=ubi0:rootfs rootwait rootfstype=ubifs rw'


[ s3c2440@zhou ]# set bootcmd_rootfs 'nand read 30008000 100000 800000;bootm 30008000'


[ s3c2440@zhou ]# set bootcmd 'run bootcmd_rootfs'

[ s3c2440@zhou ]# save                  
Saving Environment to NAND...
Erasing Nand...
Erasing at 0x60000 -- 100% complete.
Writing to Nand... done
[ s3c2440@zhou ]# pri
cpu=s3c2440
bbl=tftp 30008000 u-boot-$cpu.bin;nand erase 0 100000;nand write 30008000 0 $filesize
norbbl=erase bank 1; tftp 30008000 u-boot-$cpu.bin;cp.b 30008000 0 $filesize
blx=tftp 30008000 linuxrom-$cpu.bin;nand erase 100000 F00000;nand write 30008000 100000 $filesize
bcramfs=tftp 30800000 cramfs-$cpu.rootfs;nand erase 2400000 1400000;nand write 30800000 2400000 $filesize
tb=tftp 30008000 linuxrom-$cpu.bin;bootm 30008000 
bootargs_initamfs=console=ttyS0,115200 mem=64M rw loglevel=7
bootargs_ramdisk=console=ttyS0,115200 root=/dev/ram0 initrd=0x30800000,16M init=/linuxrc mem=64M rw loglevel=7
bootargs_cramfs=console=ttyS0,115200 root=/dev/mtdblock3 rootfstype=cramfs init=/linuxrc mem=64M noinitrd        loglevel=7
bootargs_jffs2=console=ttyS0,115200 root=/dev/mtdblock4 rootfstype=jffs2 init=/linuxrc mem=64M rw noinitrd         loglevel=7
mtdparts=mtdparts=nand0:1m(uboot),15m(kernel),20m(ramdisk),20m(cramfs),20m(jffs2),20m(yaffs2),20m(ubifs),-(users)
baudrate=115200
ethaddr=08:08:11:18:12:27
ethact=dm9000
bootdelay=1
bkr=tftp 30008000 linuxrom-s3c2440_zhou.bin;nand erase 100000 800000;nand write 30008000 100000 800000
bootargs_ubifs=console=ttyS0,115200 mem=64M ubi.mtd=6 root=ubi0:rootfs rootwait rootfstype=ubifs rw
bootcmd_rootfs=nand read 30008000 100000 800000;bootm 30008000
bubifs=tftp 30008000 rootfs_zhou.ubifs;nand erase 8800000 2800000;nand write 30008000 8800000 800000
brdfs=tftp 30008000 ramdisk_zhou.gz;nand erase 1000000 1400000;nand write 30008000 1000000 800000
bootcmd_ramdisk=nand read 30008000 100000 800000;nand read 30800000 1000000 800000;bootm 30008000
bootcmd=run bootcmd_rootfs
bootargs_nfs=noinitrd console=ttyS0,115200 init=/linuxrc mem=64M loglevel=7 root=/dev/nfs rw nfsroot=192.168.1.3:/opt/ ip=192.168.1.224:192.168.1.3:192.168.1.1:255.255.255.0:localhost.com:eth0:off
filesize=2F8910
fileaddr=30008000
gatewayip=192.168.1.1
netmask=255.255.255.0
serverip=192.168.1.3
bootargs=console=ttyS0,115200 mem=64M ubi.mtd=6 root=ubi0:rootfs rootwait rootfstype=ubifs rw
ipaddr=192.168.1.220
stdin=serial
stdout=serial
stderr=serial


Environment size: 2076/131068 bytes

[1] [2]
关键字:内核移植  文件系统  UBIFS  根文件系统 引用地址:内核移植和文件系统制作(4):UBIFS根文件系统制作总结

上一篇:FL2440驱动添加(3)LCD驱动添加学习笔记
下一篇:linux2.4.18内核定时器的使用

推荐阅读最新更新时间:2024-11-13 17:26

stm32——Fatfs文件系统读写文件
因项目需求需要移植fatfs文件系统,参考了正点原子的战舰例程。 使用mcu为stm32f103zet6,spi的sd卡模块,8Gsd卡。例程为mini板(mcu:stm32f103rct6)的 ALIENTEK MINISTM32 实验29 FATFS文件系统实验,zet6的例程由于是sdio模式所以没有选用。 初始化 这里只初始化sd卡.e2prom部分删除了 mem_init(); //初始化内存池 //SD卡检测及初始化 while(SD_Initialize()) //检测不到SD卡 { delay_ms(500); } e
[单片机]
stm32——Fatfs<font color='red'>文件系统</font>读写文件
OK6410A 开发板 (八) 111 linux-5.11 OK6410A tmpfs 文件系统 CONFIG_SHMEM=y & CONFIG_TMPFS=n
公有部分 ▼ variables -shm_mnt ▼ functions -__shmem_file_setup(struct vfsmount *mnt, const char *name, loff_t size, unsigned long flags, unsigned int i_flags) shmem_file_setup(const char *name, loff_t size, unsigned long flags) shmem_file_setup_with_mnt(struct vfsmount *mnt, const char *name, loff_t size, unsigne
[单片机]
Exynos4412 文件系统制作(三)—— 文件系统移植
根文件系统一直以来都是所有类Unix操作系统的一个重要组成部分,也可以认为是嵌入式Linux系统区别于其他一些传统嵌入式操作系统的重要特征,它给Linux带来了许多强大和灵活的功能,同时也带来了一些复杂性。我们需要清楚的了解根文件系统的基本结构,以及细心的选择所需要的系统库、内核模块和应用程序等,并配置好各种初始化脚本文件,以及选择合适的文件系统类型并把它放到实际的存储设备的合适位置 Linux的根文件系统以树型结构组织,包含内核和系统管理所需要的各种文件和程序,一般说来根目录”/”下的顶层目录都有一些比较固定命名和用途。 下面列出了一个Linux根文件系统中的比较常见的目录结构: /bin 存放二进制可执行命令的目录
[单片机]
mini2440使用nfs挂载跟文件系统失败的解决办法
尝试使用nfs挂载跟文件系统时一直失败,错误信息如下 eth0: link down IP-Config: Complete: device=eth0, addr=192.168.56.102, mask=255.255.255.0, gw=192.168.56.1, host=192.168.56.102, domain=, nis-domain=(none), bootserver=192.168.56.101, rootserver=192.168.56.101, rootpath= Root-NFS: unknown option: nfsvers=4 Looking up port of RPC 1
[单片机]
内核移植文件系统制作(2):linux内核最小系统和initramfs文件系统
linux内核最小系统,使用内核版本: 1,FL2440板子的基本硬件:晶振12MHZ CPU 型号为S3C2440,基于ARM920T,指令集ARMV4,时钟主频400MHz SDRAM H57V2562GTR-75C 2片*32MB=64MB,挂载于nGCS6 (0x3000 0000) NANDFLASH 型号:K9F2G08U0B 大小:256MB Network Adapter DM9000AEP 10/100M自适应,挂载于nGCS4 (0x2000 0000) LED 5个LED(LED0~3)I/O口指示灯,LED5电源指示灯,LED9
[单片机]
<font color='red'>内核</font><font color='red'>移植</font>和<font color='red'>文件系统</font>制作(2):linux<font color='red'>内核</font>最小系统和initramfs<font color='red'>文件系统</font>
sysfs platform总线
sysfs 文件系统linux2.6内核引入sysfs文件系统,sysfs可以看成与proc,devfs和devpty同类别的文件系统,该文件系统是虚拟的文件系统,可以更方便对系统设备进行管理。它可以产生一个包含所有系统硬件层次视图,与提供进程和状态信息的proc文件系统十分类似。sysfs把连接在系统上的设备和总线组织成为一个分级的文件,它们可以由用户空间存取,向用户空间导出内核的数据结构以及它们的属性。sysfs的一个目的就是展示设备驱动模型中各组件的层次关系,其顶级目录包括block,bus,drivers,class,power和firmware等. 它把实际连接到系统上的设备和总线组织成一个分级的文件,用户空间的程序
[单片机]
sysfs platform总线
利用MSP430在SD卡上实现FAT32文件系统
经过一周左右时间的摸索,终于明白了如何用msp30在SD卡实现FAT32文件系统,很开心~在学习的过程中,也发现一个问题,就是网上系统地讲SD卡的资料很少,而讲SDHC卡的资料则更少,所以决定写一篇博客与大家分享,由于SDHC卡大部分内容都与SD卡一样,所以下文除非是特别介绍SDHC卡,其余都会以SD卡代替SDHC卡。如果发现文中存在问题,欢迎指正,谢谢。 首先,我们先说明一下本文的主要内容,本文的主要侧重点在于利用msp430(其它单片机应该类似)驱动SD卡。驱动方式选用SPI方式,驱动成功之后,将FAT32文件系统移植过来。所以如果想要仔细学习FAT32文件系统的,可以忽略本文了,想要快速地利用单片机
[单片机]
利用MSP430在SD卡上实现FAT32<font color='red'>文件系统</font>
Linux-2.6.32.2内核在mini2440上的移植(十七)---移植PWM控制蜂鸣器
移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-linux-gnueabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 6,linux 版本:linux-2.6.32.2 7,参考文章: 嵌入式linux应用开发完全手册,韦东山,编著。 Mini2440 之Linux 移植开发实战指南 【1】硬件原理 Mini2440 板带有一个蜂鸣器,它是由PWM 控制的,下面是它的连
[单片机]
Linux-2.6.32.2<font color='red'>内核</font>在mini2440上的<font color='red'>移植</font>(十七)---<font color='red'>移植</font>PWM控制蜂鸣器
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved