UBI文件系统分析
UBI文件系统分析
UBI文件系统分析技术一部:曾宪炀L o g o1 2 3 4UBIFS在linux中层次结构图UBIFS介绍UBIFS驱动—UBI子系统UBIFS重要数据结构介绍大纲UBIFS在linux系统中的层次结构图UBIFS分区布局UBIFS的六个分区:1.Super Block:超级块分区(superblock area)使用LEB0。
该区域保存文件系统配置相关信息,如:LEB大小、最大LEB数、日志区域占用的LEB数等。
2.master area:主节点分区(master area)使用LEB1和LEB2。
主分区中包含两个主节点,主节点保存索引树根节点位置、为垃圾回收保留的LEB号、LPT管理的所有LEB脏空间总和等,一般情况下,两个主节点保存着相同数据,主节点大小为512 byte。
3.Journal area:日志分区(journal area)从LEB3开始。
为了降低节点的更新频率,UBIFS中创建了journal区,在其中缓存对节点的修改,然后一次写到Flash上去,这样就降低了更新的频率。
当需要修改索引树叶节点时并不会马上更新闪存上的索引树,首先更新RAM中的TNC,同时将更新信息以日志方式记录在内存中,等到commit时再更新闪存上的索引树。
日志由log和bud组成。
log记录日志位置,log包含两种类型的节点:commit开始节点、引用节点。
commit开始节点记录commit过程的开始,引用节点记录bud的数量。
UBIFS分区布局4.LPT area:LEB属性树分区(LEB Properties Tree area,简称LPT area),跟随在日志之后,LPT 的大小在创建文件系统时确定,LPT使用B+树结构。
该区域除了包含LEB属性树外,还维护一张擦除块表LTAB(LPT area erase blocks)和一张LEB数量信息表LSAVE。
5.Orphan:孤儿分区(orpan area)在log area和main area之间,使用固定数目的LEB。
ubi文件系统原理
ubi文件系统原理
Ubi文件系统,全称为Unsorted Block Images,是一种专为闪存设备设计的卷管理系统。
它能够在单个物理闪存设备上管理多个卷,并在整个闪存芯片上实现损耗均衡。
Ubi文件系统的主要原理如下:
1. 逻辑到物理的映射:Ubi系统将逻辑擦除块(LEBs)映射到物理擦除块(PEBs)上。
这种映射是动态的,意味着一个逻辑擦除块可以被映射到任何一个物理擦除块上。
这种映射由Ubi系统管理,对用户来说是透明的。
2. 损耗均衡:Ubi通过跟踪每个物理擦除块的擦除计数,可以将数据从损耗严重的物理块转移到损耗较少的擦除块,从而实现全局的损耗均衡。
3. 坏块管理:Ubi文件系统可以更好地处理闪存设备上的坏块。
它可以将坏块转换为虚拟块,并将数据移动到其他可用块。
4. 日志型结构:Ubi采用了与JFFS2不同的日志型结构。
它将数据写入闪存设备的空闲块中,同时还会将元数据写入闪存设备的另一个区域。
5. 分区与卷管理:Ubi可以跨多个闪存设备进行分区,并支持多个Ubi卷。
这使得Ubi可以更好地处理大型闪存设备和数据集。
此外,Ubi文件系统还支持动态卷大小调整。
6. 数据加密与压缩:Ubi文件系统具有数据加密和压缩的功能,以提高数据传输速度并增强数据安全性。
总的来说,Ubi文件系统的设计目的是为了提高闪存设备的性能和可靠性,通过动态映射、损耗均衡、坏块管理以及分区管理等手段实现。
UBIFS分析四:write-back
Write-BackUBIFS的设计的时候是支持writeback的,也就是带缓存的。
可以不同步的写进去,这样就降低了文件写入flashmedia中的次数,从而提高了文件系统的效率。
这样的事情都是由后台进程来完成的。
在UBIFS中,这个进程是在attach设备的时候建立的,:当然这个后台进程也可以在内核选项中去掉,Drivers-> Memory Technology Device (MTD) support ->UBI - Unsorted block images->UBI debugging->Do not enable the UBI background thread.下面这段代码是截取的函数mount_ubifs中的一段:c->bgt = kthread_create(ubifs_bg_thread, c, "%s", c->bgt_name);也就是说每一个UBI设备都有一个这样的后台进程。
下面我们来看看这个进程主要的工作:err = ubifs_bg_wbufs_sync(c);if (err)ubifs_ro_mode(c, err);run_bg_commit(c);首先看ubifs_bg_wbufs_sync(c)这个函数,在深入这个函数之前,需要详细的介绍一下这个函数中涉及到得一个极其重要的结构体struct ubifs_wbuf;这个结构体定义在fs/ubifs/ubifs .h中struct ubifs_wbuf {struct ubifs_info *c;void *buf;//数据缓存区int lnum;//缓冲区中的数据将要被写入到哪个lnum中去int offs;//与上面lnum相同,数据写入到lnum中的offsetint avail;//缓冲区中的可用字节数int used;//缓冲区中的已用字节数int dtype;//将要存储在lnum中数据的类型,分为UBI_LONGTERM, %UBI_SHORTTERM,%UBI_UNKNOWN三种,用于GC。
UBI文件系统分析
ubi_err("min. I/O unit (%d) is not power of 2", ubi->min_io_size);
return -EINVAL; }
ubi_assert(ubi->hdrs_min_io_size > 0); ubi_assert(ubi->hdrs_min_io_size <= ubi->min_io_size); ubi_assert(ubi->min_io_size % ubi->hdrs_min_io_size == 0);
ubi->peb_size = ubi->mtd->erasesize; ubi->peb_count = ubi->mtd->size / ubi->mtd->erasesize; Peb_count 是指逻辑块的数目,也就是总的大小除以每一页的大小 ubi->flash_size = ubi->mtd->size;
if (ubi->mtd->block_isbad && ubi->mtd->block_markbad) ubi->bad_allowed = 1;
ubi->min_io_size = ubi->mtd->writesize; ubi->hdrs_min_io_size = ubi->mtd->writesize >> ubi->mtd>subpage_sft; if (!is_power_of_2(ubi->min_io_size)) {
if (mtd->type == MTD_UBIVOLUME) { ubi_err("refuse attaching mtd%d - it is already emulated on " "top of UBI", mtd->index); return -EINVAL;
UBIFS文件系统的移植
UBI文件系统的移植作者:piaozhiye86@首次做UBIFS的移植,不足之处欢迎批评指正。
2010-7-15自从linux2.6.27以后的内核版本都支持UBI文件系统了,新版本的uboot已经支持UBIFS了。
软件平台VMwareFedora-10使用源码:linux-2.6.30.4.tar.bz2u-boot-2010.06-rc1.tar.bz2硬件环境mini2440—64M NAND关于uboot的移植可以参考《嵌入式Linux之我行》中uboot的移植,那里写得比较详细。
我也是参考了其中的文章。
1、uboot的UBI的移植关于uboot的UBI的移植几乎没有说明介绍,移植首先要保证你的flash驱动能够跑起来,我是在nand flash 上跑的UBI。
刚开始的时候我也没有什么头绪,只能够从uboot的readme开始查找一些蛛丝马迹。
- MTD Support (mtdparts command, UBI support)CONFIG_MTD_DEVICEAdds the MTD device infrastructure from the Linux kernel.Needed for mtdparts command support.CONFIG_MTD_PARTITIONSAdds the MTD partitioning infrastructure from the Linuxkernel. Needed for UBI support.因此呢,要UBI支持首先得要MTD支持,因此在配置文件中要添加以上两项的定义。
要移植UBI还要添加:#define CONFIG_CMD_UBIFS#define CONFIG_CMD_UBI总的关于UBI的部分是以下几个宏/****MTD Support (mtdparts command, UBI support)****/#if 1#define CONFIG_MTD_DEVICE 1#define CONFIG_MTD_PARTITIONS 1#define CONFIG_CMD_MTDPARTS#define CONFIG_CMD_UBIFS#define CONFIG_CMD_UBI#define CONFIG_LZO 1#define CONFIG_RBTREE 1#endif同时呢要给NAND建立个默认的分区。
UBIFS文件系统说明文档
UBIFS文件系统说明文档注意:在了解UBIFS之前一定要注意到UBIFS和任何传统的文件系统是不一样的:UBIFS不是运行在block device之上的(如hard disk,MMC/SD卡,USB flash等)。
UBIFS是运行于raw flash之上,请在开始认识UBIFS前确保理解raw flash这个概念。
UBIFS是建立在MTD device基础上的,而不是block device上的。
简介:UBIFS是由NOKIA工程师在赛格德大学帮助下开发的新的Flash文件系统,UBIFS是JFFS2文件系统的下一代产品。
JFFS2运行在MTD设备之上,而UBIFS则只能工作于UBI volume之上。
UBIFS涉及三个子系统:1.MTD子系统,提供对Flash芯片的访问接口,MTD子系统提供了MTD 设备的概念,比如/dev/mtdx,MTD可以认为是raw flash。
2.UBI子系统,为Flash设备提供了耗损均衡(wear leveling)和卷管理(volume management)功能; UBI工作在MTD设备之上,提供了UBI volume;UBI是MTD设备的高层次表示,对上层屏蔽了一些直接使用MTD设备需要处理的问题,比如损耗均衡以及坏块管理。
3.UBIFS文件系统,工作于UBI之上的文件系统。
UBIFS的主要特点:1.可扩展性:UBIFS对Flash 尺寸有着很好的扩展性,也就是说mount时间,内存消耗以及I/O速度都不依赖于Flash 的尺寸,UBIFS可以很好的运行在GB级的 Flashe设备上,当然UBI本身还是有扩展性的问题,但是无论如何UBI/UBIFS都比JFFS2的可扩展性好。
如果UBI 成为瓶颈,可以改进UBI而不需改变UBIFS本身。
2.快速mount:不像JFFS2文件系统,UBIFS在mount阶段不需要扫描整个文件系统,UBIFS mount的时间只是毫秒级,时间不依赖与Flash的尺寸;然而UBI的初始化时间是依赖Flash 的尺寸的,因此必须把这个时间考虑在内。
ubi volume 分卷烧写
文章标题:论ubi volume分卷烧写技术的应用与发展引言:在当今科技快速发展的时代,存储技术一直是备受关注的领域之一。
而ubi volume分卷烧写技术,作为一种新兴的存储技术,正在逐渐引起广泛关注并得到应用。
本文将从深度和广度两个方面对ubi volume分卷烧写技术进行全面评估,并探讨其在未来的发展方向。
一、什么是ubi volume分卷烧写技术?ubi volume分卷烧写技术是指将UBIFS文件系统卷划分成一个个可独立擦除的ubivolume的技术。
其中UBIFS为一种适用于flash存储设备的文件系统,而ubivolume则代表了对UBIFS卷进行烧写的逻辑分区。
该技术的出现,使得在使用flash存储设备时,可以更加高效地进行数据管理与烧写操作。
二、ubi volume分卷烧写技术的应用领域1. 智能设备领域中的应用ubi volume分卷烧写技术在智能设备领域得到了广泛的应用。
由于智能设备的硬件资源有限,对于存储空间的利用要求较高。
而ubi volume分卷烧写技术通过对存储设备进行合理的划分和管理,可以提高存储空间的利用效率,满足智能设备对存储管理的需求。
2. 工业控制领域中的应用在工业控制领域,ubi volume分卷烧写技术的应用同样发挥着重要的作用。
工业控制设备通常需要长时间稳定运行,对存储设备的稳定性和可靠性要求较高。
ubi volume分卷烧写技术可以在一定程度上提高存储设备的稳定性,保证工业控制设备的长时间稳定运行。
3. 其他领域的潜在应用值得注意的是,ubi volume分卷烧写技术所具有的高效管理存储空间的能力,也为其在其他领域的应用打开了新的可能性。
比如在物联网、汽车电子等领域,都有着对存储空间高效利用的需求,ubi volume分卷烧写技术或许会在这些领域有更多的发展空间。
三、ubi volume分卷烧写技术的未来展望ubi volume分卷烧写技术作为一种新兴的存储管理技术,在未来有着广阔的应用前景。
制作ubi文件系统
制作ubi文件系统目录开发环境 (1)Ubi文件系统简介 (1)UBI文件系统前期准备 (2)内核配置 (2)开发板UBIFS工具(flash_eraseall、ubiattach、ubimkvol) (2)主机mtd-utils工具(mkfs.ubifs、ubinize) (4)编译问题 (4)制作ubi文件系统镜像 (5)生成ubifs格式的镜像文件 (5)实际可用的ubi格式镜像 (5)注意事项 (6)文件系统上烧写 (6)通过NFS挂载方式 (6)设置启动参数 (6)将一个分区挂载为ubifs (7)文件系统读写速度测试 (7)ubifs常见指令 (7)开发环境开发环境:vmware+ubuntu10.04开发目录:/home/lisongqing/armLinux源码包:busybox-1.19.2.tar.bz2、linux-3.0.4.tar.bz2交叉编译工具:arm-linux-gcc-4.4.3-20100728.tar.gzUbi文件系统简介由IBM、nokia工程师Thomas Gleixner,Artem Bityutskiy等人于2006年发起,致力于开发性能卓越、扩展性高的FLASH专用文件系统,以解决当前嵌入式环境下以FLASH作为MTD 设备使用时的技术瓶颈(JFFS2、YAFFS2等专用文件系统也存在着一些技术瓶颈,如:内存消耗大,对FLASH容量、文件系统大小、内容、访问模式等的线性依赖,损益均衡能力差或过渡损益等)。
UBI:类似于LVM的逻辑卷管理层,主要实现损益均衡,逻辑擦除块、卷管理,坏块管理等UBIFS:基于UBI的FLASH日志文件系统有关ubifs的详细介绍,请参考:/doc/ubi.html/doc/ubifs.htmlUBI文件系统前期准备内核配置1)Device Drivers --->Memory Technology Device (MTD) support --->enable UBI - Unsorted block images2)File systems --->Miscellaneous filesystems --->UBIFS file system support如果不配置此处,nfs挂载时会出现如下错误:ubiupdatevol: error!: UBI device name was not specified (use -h for help)Kernel panic - not syncing: Attempted to kill init!开发板UBIFS工具(flash_eraseall、ubiattach、ubimkvol)mtd-utils工具中提供了对UBIFS的支持,所以我们需要下载和编译这些工具,下载以下几个文件。
ubifs文件系统挂载及同步
UBIFS分区制作及UBIFS烧写和启动 (转载)相关命令工具ubiattach version 1.0 - a tool to attach MTD device to UB I.Usage: ubiattach <UBI control device node file name>[-m <MTD device number>] [-d <UBI device number>][--mtdn=<MTD device number>] [--devn <UBI device number>]Example 1: ubiattach /dev/ubi_ctrl -m 0 - attach MTD device 0 (mtd0) to UBIExample 2: ubiattach /dev/ubi_ctrl -m 0 -d 3 - attach MTD device 0 (mtd0) to UBI andand create UBI device number 3 (ubi3)-d, --devn=<UBI device number> the number to assign to the newly created UBI device(the number is assigned automatically if this is not specified)-m, --mtdn=<MTD device number> MTD device number to attach-O, --vid-hdr-offset VID header offset (do not specify this unless you really know what you do and the optimal defaults will be used)-h, --help print help m essage-V, --version print program v ersionubimkvol version 1.0 - a tool to create UBI volumes.Usage: ubimkvol <UBI device node file name> [-h] [-a <alignm ent>] [-n <volume ID>] [-N <name>] [-s <bytes>] [-S <LEBs>] [-t <static|dynamic>] [-V] [-m] [--alignment=<alignment>][--vol _id=<volume ID>] [--name=<name>] [--size=<bytes>] [--lebs=<LEBs>] [--type=<static|dynamic>] [--help] [--version] [--maxavsize]Example: ubimkvol/dev/ubi0 -s 20MiB -N config_data - create a 20 Megabytes volumenamed "config_data" on UBI device /dev/ubi0.-a, --alignment=<alignment> volume alignment (default is 1)-n, --vol_id=<volume ID> UBI volume ID, if not spec ified, the volume IDwill be assigned automatically-N, --name=<name> volume name-s, --size=<bytes> volume size volume size in bytes, kilobytes (KiB)or megabytes (MiB)-S, --lebs=<LEBs count> alternative way to give vo lume size in logicaleraseblocks-m, --maxavsize set volume size to maximum available size-t, --type=<static|dynamic> volume type (dynamic, static), default is dynamic-h, -?, --help print help message-V, --version print program versi onThe following is a compatibility option which is deprecated, do not use it-d, --devn=<devn> UBI device number - m ay be used instead of the UBIdevice node name in which case the utility assumesthat the device node is "/dev/ubi<devn>"ubidetach version 1.0 - a tool to remove UBI devices (deta ch MTD devices from UBI)Usage: ubidetach<UBI control device node file name> [-d <UBI device number>] [-m <MTD device number>] [--devn <UBI devic e number>] [--mtdn=<MTD device number>]Example 1: ubidetach /dev/ubi_ctrl -d 2 - delete UBI device 2 (ubi2)Example 2: ubidetach /dev/ubi_ctrl -m 0 - detach MTD device 0 (mtd0)-d, --devn=<UBI device number> UBI device number to delete-m, --mtdn=<MTD device number> or altrnatively, MTD device number to detach -this will delete corresponding UBI device-h, --help print help m essage-V, --version print program v ersionubiformat version 1.0 - a tool to format MTD devices and flash UBI imagesUsage: ubiformat <MTD device node file name> [-h] [-V] [-y] [-q] [-v][-x <num>] [-E <value>] [-s <bytes>] [-O <offs>] [-n][--help] [--version] [--yes] [--verbose] [--quiet][--ec=<value>] [--vid-hdr-offset=<offs>][--ubi-ver=<num>] [--no-volume-table]Example 1: ubiformat /dev/mtd0 -y - format MTD device number 0 and donot ask questions.Example 2: ubiformat /dev/mtd0 -q -e 0 - format MTD device number 0,be quiet and force erase counter value 0.-s, --sub-page-size=<bytes> minimum input/output unit used fo r UBIheaders, e.g. sub-page size in case of NANDflash (equivalent to the minimum input/outputunit size by default)-O, --vid-hdr-offset=<offs> offset if the VID header from s tart of thephysical eraseblock (default is the nextminimum I/O unit or sub-page after the ECheader)-n, --no-volume-table only erase all eraseblock a nd preserve erasecounters, do not write empty volume table-f, --flash-image=<file> flash image file-e, --erase-counter=<value> use <value> as the erase counter value for alleraseblocks-y, --yes assume the answer is "yes" for all questionthis program would otherwise ask-q, --quiet suppress progress p ercentage information-v, --verbose be verbose-x, --ubi-ver=<num> UBI version number to put to EC headers(default is 1)-h, -?, --help print help message-V, --version print program version使用实例将一个MTD分区挂载为UBIFS格式●flash_eraseall /dev/mtd5 //擦除mtd5●ubiattach /dev/ubi_ctrl -m 5 -d 0 //UBI和mtd5关联->ubi0●ubimkvol /dev/ubi0 -n 0 -N rootfs0 -s 256MiB //创建分区ubi0_0设定volume 大小●mount -t ubifs ubi0_0 /mnt/ubi或mount -t ubifs ubi0:rootfs0 /mnt/ubi //挂载烧写UBIFS文件系统映像U-Boot烧写ubifs:(mmc)#mmcinit#fatload mmc 0:1 81000000 ubi.img#nand unlock#nand ecc sw#nand erase 680000 7980000#nand write.i 81000000 680000 $(filesize)NFS文件系统上烧写法一,使用ubiformat工具./ubiformat -q /dev/mtd5 -f ubi.img法二,不必烧写映像,将ROOTFS打包,解压到UBIFSubiattach /dev/ubi_ctrl -m 5 -d 0ubimkvol /dev/ubi0 -n 0 -N rootfs -s 128MiBmount -t ubifs ubi0_0 /mnt/ubi0tar -jxv -C /mnt/ubi0 rootfs.tar.bz2umount /mnt/ubi0UBI文件系统启动设置UBIFS文件系统作为根文件系统启动的参数#setenv bootargs console=ttyAM0,115200n8 ubi.mtd=5 root=ubi0:root fs rootfstype=ubifs init=linuxrc# setenv bootcmd nand read.i 80300000 280000 200000\;bootm 80 300000UBIFS一、UBIFS 简介由IBM、nokia工程师Thomas Gleixner,Artem Bityutskiy等人于2006年发起,致力于开发性能卓越、扩展性高的FLASH专用文件系统,以解决当前嵌入式环境下以FLASH作为MTD设备使用时的技术瓶颈,开发背景:FLASH特性:FLASH是一类电可擦出可编程存储体,在使用方式上与硬磁盘最大不同是:FLASH文件系统所必须的关键技术:1. 由于FLASH的“先擦除后写”的特性决定,必须(或者说所被公认为)采用异地更新策略(out-of-place update)。
ubi文件系统原理
ubi文件系统原理
UBI文件系统(UBIFS)是一个用于嵌入式设备的日志结构文件系统。
它的设计目标是提供高性能、高可靠性和可扩展性,以适应各种嵌入式设备的需求。
UBIFS的核心思想是将闪存设备中的数据组织成一个树状结构,以提高数据的访问效率和可靠性。
这个树状结构被分为多个节点,每个节点对应一个闪存块。
每个节点中包含了数据和元数据,如文件的大小、权限等信息。
UBIFS通过使用日志技术来保证文件系统的一致性,即每次写入操作都会被记录在日志中,以便在系统崩溃或断电时能够恢复数据的完整性。
UBIFS还采用了压缩算法来节省闪存空间的使用。
它使用了一种称为UBI(Unsorted Block Images)的闪存管理层,将闪存设备划分为多个块,并对这些块进行管理和映射,从而提供了灵活的闪存管理功能。
UBIFS可以自动地在闪存设备上执行块的擦除和写入操作,以保证数据的完整性和可靠性。
UBIFS的设计还考虑了嵌入式设备的特殊需求。
它采用了一种称为UBI Fastmap的技术,可以加速文件系统的挂载过程。
此外,UBIFS 还支持闪存设备的坏块管理和wear leveling,以延长闪存设备的使用寿命。
UBIFS是一个专为嵌入式设备设计的高性能、高可靠性的日志结构
文件系统。
它通过使用树状结构、日志技术和压缩算法来提供快速、可靠的数据存储和访问功能。
无论是在智能手机、平板电脑还是其他嵌入式设备中,UBIFS都可以为用户提供优秀的文件系统体验。
它的设计理念和技术特点使得它成为嵌入式设备领域的首选文件系统之一。
UBIFS分析二:重要结构体
UBIFS中的重要的结构体用leeming的话来说,一个大的工程中,最最核心的往往是数据结构体的定义。
所以看代码不急着看c文件,而是主要看document和h文件,来理解设计者的思路,这样才能走对路。
1. struct ubi_deviceUBI中对于一个UBI设备的抽象是以struct ubi_device来定义,其中包括了该UBI设备的各种信息。
struct ubi_device {struct cdev cdev;struct device dev;int ubi_num;//UBI设备的标号,在ubiattach用户程序时以-d选项来输入char ubi_name[sizeof(UBI_NAME_STR)+5];//ubi设备的名称int vol_count;//在该UBI设备中有多少个volumestruct ubi_volume *volumes[UBI_MAX_VOLUMES+UBI_INT_VOL_COUNT];spinlock_t volumes_lock;int ref_count;int image_seq;int rsvd_pebs;//保留的LEB数目int avail_pebs;//可用的LEB数目int beb_rsvd_pebs;//为坏块处理而保留的LEB数目int beb_rsvd_level;//为坏块处理而保留的LEB的正常数目int autoresize_vol_id;int vtbl_slots;int vtbl_size;//volume表的大小(bytes)struct ubi_vtbl_record *vtbl;//内存中volume表的拷贝struct mutex device_mutex;int max_ec;//最大的erase counter/* Note, mean_ec is not updated run-time - should be fixed */int mean_ec;//平均erase counter/* EBA sub-system's stuff */unsigned long long global_sqnum;spinlock_t ltree_lock;struct rb_root ltree;struct mutex alc_mutex;/* Wear-leveling sub-system's stuff */struct rb_root used;//一个红黑树,其中是已用的blcokstruct rb_root erroneous;// RB-tree of erroneous used physical eraseblocksstruct rb_root free;//红黑树的根,其中是没有用到的blockstruct rb_root scrub;//需要擦除的blcokstruct list_head pq[UBI_PROT_QUEUE_LEN];int pq_head;spinlock_t wl_lock;struct mutex move_mutex;struct rw_semaphore work_sem;int wl_scheduled;struct ubi_wl_entry **lookuptbl;// a table to quickly find a &struct ubi_wl_entry object for any physical eraseblock,,一个struct ubi_wl_entry类型的数组,以pnum为下标,记录该UBI设备的每一个blockstruct ubi_wl_entry *move_from;// physical eraseblock from where the data is being moved struct ubi_wl_entry *move_to;// physical eraseblock where the data is being moved toint move_to_put;//标志位,用于标志目的LEB是否被putstruct list_head works;// list of pending worksint works_count;// count of pending worksstruct task_struct *bgt_thread;//UBI的后台进程int thread_enabled;char bgt_name[sizeof(UBI_BGT_NAME_PATTERN)+2];//后台进程的名字struct notifier_block reboot_notifier;//内核通知链/* I/O sub-system's stuff */long long flash_size;//MTD分区的大小int peb_count;//LEB的数目int peb_size;//LEB的大小(每一个block的大小)int bad_peb_count;//坏块数目int good_peb_count;//能使用的LEB数目int erroneous_peb_count;int max_erroneous;int min_io_size;//最小操作单元的大小,也就是一个page的大小int hdrs_min_io_size;int ro_mode;int leb_size;//逻辑块的大小,一般等于peb_sizeint leb_start;//逻辑块块从物理块中那一块开始算,也就是之前的物理块保留用于其他目的int ec_hdr_alsize;// size of the EC header aligned to @hdrs_min_io_sizeint vid_hdr_alsize; //size of the VID header aligned to @hdrs_min_io_sizeint vid_hdr_offset;//VID头部在一块之中的偏移量。
你需要了解UBI系统原理
你需要了解UBI系统原理综述UBI全称Unsorted Block Images,是一种原始flash设备的卷管理系统。
这个系统能在一个物理的flash设备上管理操纵多个卷并且能在整个flash芯片上实现损耗均衡。
从某种意义上说,UBI和LVM有点相似,LVM将逻辑扇区映射到物理扇区上面,UBI映射逻辑擦除块到物理擦除块。
但是除了映射,UBI还实现了全局的损耗均衡和透明的I/O 错误处理。
一个UBI卷就是一串连续的逻辑擦除块。
每一个逻辑擦除块可以被映射到任何一个物理擦除块上面。
这个映射是由UBI管理,这种映射对用户是透明的,同时这种映射也是UBI 实现全局的损耗均衡的基础。
通过每一个物理擦除块记录的擦除计数,可以将数据从损耗严重的物理块转移到损耗较少的擦除块。
UBI卷的大小在卷被创建的时候被指定,这个大小也可以动态的被改变。
有用户空间工具可以用来操作UBI卷。
总共有两种类型的UBI卷,一种是动态卷,一种是静态卷。
静态卷是只读的,内容被CRC-32校验保护。
动态卷可读可写,上层软件负责数据完整性。
UBI能管理flash的坏块,这样上层软件可以不需要考虑坏块。
UBI有一个预留的物理块池,当一个物理擦除块坏掉了,UBI会利用预留的块来替代这个坏块。
UBI将数据从新出现的坏块上转移到预留的好块上面。
这个功能的好处就是应用层软件不会感知到底层的I/O错误。
NAND Flash在读写的时候可能会出现bit翻转,bit翻转可以被ECC校验来纠正,但是这种现象长期积累会导致数据丢失。
UBI将出现bit翻转块上的数据转移到其它块上面。
这种机制叫做冲刷,冲刷过程在后台完成,对上层软件是透明的。
下面是UBI特性的列表1. UBI提供一种卷的机制,可以动态创建、删除、重设置卷大小等操作2. UBI在整个Flash设备上提供了损耗平衡的机制,你可以不断的对某一个逻辑擦除块进。
ubifs的制作,移植的重点详解
ubifs的制作,移植的重点详解PC操作系统:ubuntu 11.10使用的开发板:am335x_evm开发板使用的操作系统:linux 3.2使用的 NAND FLASH的型号:MT29F2G08ABAEAWP在制作 ubifs 文件系统的过程中需要如下:为方便操作,把下面将要安装的数据包的解压文件到存放在:/home/user/mtd再mkdir install,下面将要运行的数据包生成的文件将会存放在:/home/user/mtd/install1),正确安装数据包:zlib-1.2.5;lzo-2.06;e2fsprogs-1.42,mtd-utils-1.5.0这些数据包的版本最好如上所述,否则可能会导致无法生成所需的文件或生成的文件不正确这是制作 ubifs 过程中将要用到的所有的软件包的连接:ubifs1,zlibhost$ tar xvf zlib-1.2.5.tar.gzhost$ cd zlib-1.2.5/host$ ./configure --prefix=/home/user/mtd/install打开其根目录下的 Makefile,替换 gcc, ldshared, cpp, ar , ranlib 为如下:host$ gedit MakefileCC=arm-arago-linux-gnueabi-gccLDSHARED=arm-arago-linux-gnueabi-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.mapCPP=arm-arago-linux-gnueabi-gcc -EAR=arm-arago-linux-gnueabi-ar rcRANLIB=arm-arago-linux-gnueabi-ranlib保存,退出host$ makehost$ make installhost$ cd ..生成的 zlib.a 存放在 /home/user/mtd/install/lib 中;生成的 zlib 的头文件存放在 /home/user/mtd/install/include 中。
ubifs文件系统的制作详解
分类:2012-04-18 21:34 314人阅读(0) 为了更好的理解ubifs根文件系统的制作,首先,我们简单的说一下,系统的组成:bootloader(uboot)的作用就是用来加载操作系统;而嵌入式linux系统由linux 内核和根文件系统两部分构成,两者缺一不可。
所以我们要制作一个UBIFS的根文件系统,首先必须让上面系统组成的几个部分都支持UBIFS文件系统,就得在这几个组成部分添加一些“东西”(支持UBI的配置):(打个我自己理解的比喻吧:“娶媳妇”比作--启动系统,娶媳妇是不是要经过老爸、老妈、丈母娘、岳父的同意和支持?bootloader、parames、kernel、root Filesystem便是老爸、老妈、丈母娘、岳父...O(∩_∩)O~,而你叫"UBI")这篇博文主要是详细解析:uboot中添加对UBIFS文件系统的支持一、移植环境§主机:vmware-redhat5§开发板:mini2440--256MB nandflash§kernel: 编译器:§uboot:二.移植步骤本次移植的功能为:支持UBIFS文件系统1.在include/configs/中添加如下配置:(注意:不同的开发板在include/configs/目录下对应的修改的配置文件不同,我的开发板是mini2440所以修改的是)#define CONFIG_MTD_DEVICE#define CONFIG_MTD_PARTITIONS#define CONFIG_CMD_MTDPARTS#define CONFIG_LZO#define CONFIG_RBTREE#define CONFIG_CMD_UBIFS 到uboot的顶层目录下(可能拿到的uboot已被编译过,所以最好要用此命令清理中间文件)执行命令:make clean(uboot是通用的bootloader,支持多种开发板,所以编译之前先选择使用哪种board)执行命令:make mini2440_config注意:我用的是mini2440开发板,所以要编译这个开发板使用的uboot,所以这里的目标为mini2440_config,表示选择的board是mini2440(mini2440_config在Makefile标准术语称为“目标”,可以在uboot顶层Makefile找到该目标)执行命令(开始编译uboot):make CROSS_COMPILE=arm-linux-分类:2012-04-19 13:55 156人阅读(0) 一、移植环境§主机:vmware-redhat5§开发板:mini2440--256MB nandflash§kernel: 编译器:§uboot:二.移植步骤1.在内核顶层目录下使用命令:make menuconfig ,进入内核配置菜单,添加对UBIFS文件系统的支持。
UBI文件系统测试分析
UBI文件系统测试分析一.环境参数介绍1.测试环境:AM335X开发板2.测试工具:IOzone二.步骤介绍2.1编译安装iozone1.下载iozone,2.解压IOzone,并到源码目录下进行编译:[skyyang@Centos6 current]$ cd iozone3_4303.修改makefile:[skyyang@Centos6 current]$ sudo vim makefile修改makefile如上,这里是指定交叉编译的,因为我是把IOzone放到我的开发板上测试的,因为我的开发板挂载的文件系统就是UBIFS。
交叉编译器是可以自定义的,我的开发板用的交叉编译器是arm-linux-gcc-4.4.3版本的!4.编译iozone:[skyyang@Centos6 current]$ make linux-armBuilding iozone for Linux-arm/opt/arm-linux-4.4.3/bin/arm-linux-cc -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DHA VE_PREAD \-DNAME='"linux-arm"' -DLINUX_ARM -DSHARED_MEM \-Dlinux -D_LARGEFILE64_SOURCE iozone.c \-o iozone_linux-arm.o/opt/arm-linux-4.4.3/bin/arm-linux-cc -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D_LARGEFILE64_SOURCE \以上是部分编译信息,编译完成后生成iozone:[skyyang@Centos6 current]$ file iozoneiozone: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, not stripped5.将生成的iozone拷贝到开发板上:root@ok335x:~/systools# tftp -gr iozone 192.168.4.37我这里使用tftp传输iozone文件6.执行iozone:root@ok335x:~/systools#./iozone -a -n 128m -g 2g -i 0 -i 1 -i 2 -i 5 -f /iozone -Rb ./iozone.xls7.将生成的excel文件传到PC机用于UBIFS测试分析:root@ok335x:~/systools# tftp -pl iozone.xls 192.168.4.37Tftp 命令参数解析:-g:下载文件-r:接收文件-p:传送文件-l:本地主机以下附上一组ME31 POS机上的文件系统性能测试指标:。
UBImkfs.ubifs参数记录
[ubifs] mode=ubi image=ubifs.img vol_id=0 vol_size=960MiB vol_type=dynamic vol_name=rootfs vol_flags=autoresize
mkfs.ubifs 参 数 分 析
博客园 用户登录 代码改变世界 密码登录 短信登录 忘记登录用户名 忘记密码 记住我 登录 第三方登录/注册 没有账户, 立即注册
NAND 硬件结构如下:
UBImkfs.ubifs参 数 记 录
脚本如下
sudo mkfs.ubifs -q -r rootfs_iproute -m 4096 -e 248KiB -c 3840 -o ubifs.img -F
ubinizeБайду номын сангаас参 数
-m 和上面一样 , 一般是 页大小 , 4096 byte
-p 一般是块大小, 256KiB
echo mkfs.ubifs over! sudo ubinize -o ubi.img -m 4096 -p 256KiB ubinize.cfg echo ubinize over!
sync
sudo cp ubi.img ~/image -rf sync sudo rm ubifs.img ubi.img -rf sync echo make file system ok !
-m 最小 I/O 单元大小,一般是页大小, 4096 byte -r 是指定哪个文件系统作为文件系统。 -e 是可擦除逻辑块大小,一般等于 (每块的页数 - 2)* 页大小 = (64byte - 2) * 4096 == 248Kbyte -c 是最大可擦除逻辑块总数,这个是从 ubinize.cfg 里面的 vol_size / ubinize 里面的 -p 参数 = (960 * 1024) / 256 == 3840 -o 生成的 ubifs.img -F 自动调整大小。
需要了解UBI文件系统的详细介绍
需要了解UBI文件系统的详细介绍一、UBI/UBIFS产生背景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文件系统的支持。
二、UBI/UBIFS简单介绍由于超大容量Nand Flash的普及,YAFFS等皆无法再去控制Nand Flash的空间,于是在2006年由IBM与Nokia的工程师Thomas Gleixner,Artem Bityutskiy设计开发了UBI及其UBIFS文件系统,专门为了解决MTD(Memory Technology Device)设备所遇到的瓶颈。
UBIFS通过子系统UBI处理与MTD device之间的动作。
与JFFS2一样,UBIFS 建构于MTD device 之上,因而与一般的block device不兼容。
其中,UBI是一种类似于LVM的逻辑卷管理层。
主要实现损益均衡,逻辑擦除块、卷管理,坏块管理等。
而UBIFS是一种基于UBI的FLASH日志文件系统。
一句话解读就是,UBIFS及其使用的UBI子系统,是一种用在大容量flash上的文件系统。
ubi文件系统原理
ubi文件系统原理
UBI文件系统(Unified Background Intelligent File System)是一种用于嵌入式系统的文件系统,具有自动扩展和自动备份功能。
它的设计初衷是为了解决嵌入式设备中闪存寿命有限的问题。
UBI文件系统的原理是将闪存分成多个物理块,并将这些物理块组织成逻辑块。
每个逻辑块包含数据和元数据,元数据用于管理逻辑块的状态和位置信息。
UBI文件系统使用擦除块作为最小的可擦除单位,擦除块是闪存中一组连续的物理块。
当文件系统写入数据时,UBI文件系统会将数据写入到一个可用的逻辑块中。
当逻辑块写满后,UBI文件系统会选择一个空闲的逻辑块,并将其中的数据重新分布到新的逻辑块中。
这个过程称为擦除块的迁移。
通过迁移数据,UBI文件系统可以实现均衡地使用闪存,从而延长闪存的寿命。
除了自动迁移数据,UBI文件系统还具有自动备份功能。
它会将文件系统的元数据备份到闪存的另一个区域,以防止元数据损坏导致文件系统不可用。
当文件系统启动时,UBI文件系统会检查元数据备份的完整性,如果发现元数据损坏,它会自动恢复备份的元数据。
UBI文件系统的优点是可以动态调整闪存的大小,使得嵌入式设备可以根据需要灵活地分配存储空间。
它还提供了高可靠性和高性能的文件系统操作,适用于各种嵌入式应用场景。
UBI文件系统是一种具有自动扩展和自动备份功能的文件系统,通过数据迁移和元数据备份,实现了闪存寿命的延长和文件系统的可靠性。
它在嵌入式系统中具有广泛的应用前景,可以满足各种存储需求。
ubi详解
ubi详解UBIFS 简介由IBM、nokia工程师Thomas Gleixner,Artem Bityutskiy等人于2006年发起,致力于开发性能卓越、扩展性高的FLASH专用文件系统,以解决当前嵌入式环境下以FLASH作为MTD设备使用时的技术瓶颈,开发背景:FLASH特性:FLASH是一类电可擦出可编程存储体,在使用方式上与硬磁盘最大不同是:FLASH文件系统所必须的关键技术:1. 由于FLASH的“先擦除后写”的特性决定,必须(或者说所被公认为)采用异地更新策略(out-of-place update)。
相关问题讨论可参考:2. 采用异地更新策略就必须(或者说所被公认为)采用日志文件系统来管理。
3. 采用日志文件系统就必须(或者说所被公认为)实现垃圾回收(garbage collection)4. 由于FLASH的物理擦除块(Physical Erase Block)只有有限次有效擦除,所以必须(或者说所被公认为)采用“负载平衡”(我比较喜欢翻译为“损益均衡”——一个经济学术语)(Wear- Leveling)技术,即保证上的(几乎)所有PEB 的擦除次数趋向于均衡化,从而避免小部分PEB大大先于其他PEB而”坏“掉。
当前嵌入式FLASH解决方案多采用:1. 无文件系统直接使用FLASH:缺点很明显2. 采用传统文件系统,如ext2,ext3, FAT16/32, dos,Cramfs 等:这些文件系统本来是为传统的磁盘体开发的,他们无法高效的管理以FLASH作为介质的文件系统,特别是在FLASH的使用寿命上。
于是出现了第3中方案。
3. 采用FTL/NFTL(flash 转换层/nand flash转换层)+传统文件系统:FTL 的使用就是针对FLASH的特有属性,通过硬件的方式来实现日志管理、损益均衡等技术。
但实践证明,由于各方面因素导致本方案有一定的局限性。
4. FLASH专用文件系统,如JFFS1/2,YAFFS等,他们从一定程度上缓解了flash 使用上的技术瓶颈。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/* * Check if we already have the same MTD device attached. * * Note, this function assumes that UBI devices creations and deletions * are serialized, so it does not take the &ubi_devices_lock. */ for (i = 0; i < UBI_MAX_DEVICES; i++) {
ubi->vid_hdr_offset = vid_hdr_offset; ubi->autoresize_vol_id = -1;
mutex_init(&ubi->buf_mutex); mutex_init(&ubi->ckvol_mutex); mutex_init(&ubi->mult_mutex); mutex_init(&ubi->volumes_mutex); spin_lock_init(&ubi->volumes_lock); 初始化信号 ubi_msg("attaching mtd%d to ubi%d", mtd->index, ubi_num);
int err; struct ubi_scan_info *si;
si = ubi_scan(ubi); ********************************************************************* ************* 这儿通过 ubi_scan 函数来扫描 MTD 分区的每一块。具体是调用 static int process_eb(struct ubi_device *ubi, struct ubi_scan_info *si,int pnum) 函数来读取 EC 和 VID 头(即没一块的前两页),在读每一页的时候,会调用 check_pattern 函数来判断这一页是否为空,如果每一页都是空的,那么就会 发现这个 MTD 分区是空的。 ********************************************************************* *************
if (mtd->type == MTD_UBIVOLUME) { ubi_err("refuse attaching mtd%d - it is already emulated on " "top of UBI", mtd->index); return -EINVAL;
} 上面的代码接着检查被 attach 的 mtd 设备时候是一个 mtd volume(卷区), 如果已经是一个 mtd 卷了,那么就不能再被 attach 了。
ubi = ubi_devices[i]; if (ubi && mtd->index == ubi->mtd->index) {
dbg_err("mtd%d is already attached to ubi%d", mtd->index, i);
return -EEXIST; } } //上面的这段代码可以看英文注释,一个 mtd 设备(一个分区)不能被 attach 两次,除非你已经 deatch 了。所以在这段代码的开始就检查被 attach 的 mtd 设备是否已经被 attach 了。
~(ubi->hdrs_min_io_size - 1);
ubi->vid_hdr_shift = ubi->vid_hdr_offset -
ubi->vid_hdr_aloffset;
}
Io_init 剩余的部分就不分析了,比较容易
接着上面 ubi_attach_mtd_dev()往下说:
ubi->peb_buf1 = vmalloc(ubi->peb_size);
ubi_err("min. I/O unit (%d) is not power of 2", ubi->min_io_size);
return -EINVAL; }
ubi_assert(ubi->hdrs_min_io_size > 0); ubi_assert(ubi->hdrs_min_io_size <= ubi->min_io_size); ubi_assert(ubi->min_io_size % ubi->hdrs_min_io_size == 0);
如果在终端输入命令的时候没有带 ubinum,那么就是自动分配 ubinum,系统就 会从 ubi_device[]数组中找出一个没被使用的 ubinum 号
if (ubi_num == UBI_MAX_DEVICES) { dbg_err("only %d UBI devices may be created", UBI_MAX_DEVICES); return -ENFILE;
if (!ubi->peb_buf1)
goto out_free;
ubi->peb_buf2 = vmalloc(ubi->peb_size); if (!ubi->peb_buf2)
goto out_free; 分配两个物理擦除块大小的 buf,具体的用途下面再说
err = attach_by_scanning(ubi); if (err) {
} } else {
if (ubi_num >= UBI_MAX_DEVICES) return -EINVAL;
如果 ubi_num > UBI_MAX_DEVICES,就代表没有空余 ubinum 号可供分配,返回 出错
/* Make sure ubi_num is not busy */ if (ubi_devices[ubi_num]) {
if (ubi_num == UBI_DEV_NUM_AUTO) { /* Search for an empty slot in the @ubi_devices array */ for (ubi_num = 0; ubi_num < UBI_MAX_DEVICES; ubi_num++) if (!ubi_devices[ubi_num]) break;
} Numeraseregions 是扫描 nandflash 得到的信息,如果 numeraseregions 等于 0,代表我们需要 attach 的设备已经擦除过了
if (ubi->vid_hdr_offset < 0) return -EINVAL;
ubi->vid_hdr_offset 显然应该是一个正数,一般是 nandflash 的一页,我们 的 4020 上的 nandflash 页大小为 512 字节,所以 ubi->vid_hdr_offset 为 512. 这儿再稍微说一下,EC header 和 VID header,是记录我们 ubi 管理信息。一 般 EC 在一个擦除块的第一页,所以偏移量为 0,VID 在擦除块的第二页上,所 以偏移量为 512.,在我们 4020 的 nandflash 上,一个擦除块的大小为 16K,也 就是 32 页。 下面接着讲我们的扫描信息写进 mtd 结构体
dbg_err("failed to attach by scanning, error %d", err); goto out_free; }
我们再跟着 attach_by_scanning(ubi)细说 static int attach_by_scanning(struct ubi_device *ubi) {
UBIFS文件系统分析(一):挂载UBIFS的
代码分析
陆陆续续的看 UBIFS 很长时间了,一直没有写出一点东西。因为我在=到能够系 统的理解 UBIFS 的时候再写出一点东西。但是因为工作比较忙,UBIFS 源码读 的断断续续,老是需要复习拾起,比较浪费时间,所以决定写出一点东西,做 个备份吧。 我决定在读 UBIFS 源码之前需要读两份关于 UBIF 设计的文档: 一份是《UBI-Unsorted Block Images》 ubidesign.pdf 另外一份是《A Brief Introduction to the design of UBIFS》 A Brief Introduction to the Design of UBIFS.pdf 这两份简洁的介绍了 UBIFS 设计的一些结构和考虑。 我们按照挂载 ubifs 的工序来分析代码: (1)ubiattach /dev/ubi_ctrl -m 3 (2)ubimkvol /dev/ubi0 -N ubifs -s 15MiB (3)mount -t ubifs ubi0:ubifs /mnt 首先先分析(1),相应的代码是 ubi_attach_mtd_dev()函数,下面我们紧 跟代码来看看究竟干了些什么。 1.ubi_attach_mtd_dev int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, int vid_hdr_offset) { //ubi_num, vid_hdr_offset 是命令传进来的参数
if (ubi->mtd->block_isbad && ubi->mtd->block_markbad) ubi->bad_allowed = 1;
ubi->min_io_size = ubi->mtd->writesize; ubi->hdrs_min_io_size = ubi->mtd->writesize >> ubi->mtd>subpage_sft; if (!is_power_of_2(ubi->min_io_size)) {