ubifs文件系统挂载及同步
UBI文件系统分析
/* * 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 分区是空的。 ********************************************************************* *************
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在断电时丢失数据的处理方法首先要说的是,文件系统在掉电的时候肯定是有几率丢失数据,因为断电可以在任何情况下发生,如果有数据在内存个中来不及写入,那么内存中的数据就丢失了,而且nand上的未写完的数据,可能因为文件对应的信息没有更新,造成重启后文件系统找不到那个文件,或者文件无法打开。
所以,最牢靠的办法是使用UPS或者后备电池。
UBIFS具有很好的性能,这从ubifs作为rootfs的mount和启动速度就可以看出。
部分原因是ubifs可以说是一个write back的文件系统。
也就是说,ubifs会在内存中维持一个buf,当文件被修改时,只是这个buf的内容被改变,但是不一定会将改动回写到nand;系统会积累一定时间的改动然后再写入,这样能提高系统的性能。
但是这样带来的问题是一旦断电,buf里的改动全部丢失。
解决办法可以有:1. 在kernel的bootargs中加入rootflags=sync,强制使用sync方式mount ubifs,结果就是性能下降2. 在程序中修改了文件内容后,调用fsyncUBIFS是异步文件系统。
正如其它Linux文件系统,它使用页cache。
页cache是由Linux 内存管理单元负责。
页cache很大并可以缓存很多数据。
当我们把一个文件写入文件系统时,事实上我们的数据是先写入了页cache,标记页为“脏”,然后写函数返回,过一段时间后数据正式写入储存介质。
write-buffer是UBIFS自己的缓冲区,工作于页cache和flash之间。
这表示回写并不是写入flash而是写入了write-buffer。
write-buffer是为了改善nand flash性能。
write-buffer的大小通常是nand flash的页大小。
write-buffer的存在可以把一些零散的数据合并起来整页整页地写入到nand flash中。
这不但减少了低速的与flash通信的次数,而且减少了flash中的碎片。
ubifs文件系统挂载及同步
ubifs文件系统挂载及同步UBIFS分区制作及UBIFS烧写和启动 (转载)相关命令工具ubiattach version 1.0 - a tool to attach MTD device to UB I.Usage: ubiattach[-m ] [-d ][--mtdn=] [--devn ]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= 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 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 [-h] [-a ] [-n ] [-N ] [-s ] [-S ] [-t ] [-V] [-m] [--alignment=][--vol _id=] [--name=] [--size=] [--lebs=] [--type=] [--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= volume alignment (default is 1)-n, --vol_id= UBI volume ID, if not spec ified, the volume ID will be assigned automatically-N, --name= volume name-s, --size= volume size volume size in bytes, kilobytes (KiB) or megabytes (MiB)-S, --lebs= alternative way to give vo lume size in logicaleraseblocks-m, --maxavsize set volume size to maximum available size -t, --type= 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= 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"ubidetach version 1.0 - a tool to remove UBI devices (deta ch MTD devices from UBI)Usage: ubidetach [-d ] [-m ] [--devn ] [--mtdn=]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 to delete-m, --mtdn= 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 andflash UBI imagesUsage: ubiformat [-h] [-V] [-y] [-q] [-v][-x ] [-E ] [-s ] [-O ] [-n][--help] [--version] [--yes] [--verbose] [--quiet][--ec=] [--vid-hdr-offset=][--ubi-ver=] [--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= 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= 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= flash image file-e, --erase-counter= use 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= 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)。
基于ARM6410-Ubuntu的NFS挂载方法及驱动模块加载方法
NFS服务器的配置一、NFS服务器端的配置,即共享发布者(一)需启动的服务和需安装的软件1、NFS服务器必须启动两个daemons服务:rpc.nfsd和rpc.mountdrpc.nfsd:用来管理客户端PC是否可以登录。
类似于windows中的共享权限。
rpc.mountd:用来管理客户端pc能够使用的文件安全权限。
如windows中的共享安全权限。
RPC:因为NFS支持的功能很多,所以NFS的功能对应的端口才无法固定,而是采用小于1024的随机端口。
但客户端需要得知服务器的端口才能联机,此时就需要启用RPC服务。
RPC的功能就是指定每个NFS功能的端口号。
并传信息给客户端,让客户端可以连到正确的端口上。
服务器在启动NFS时会随机取用数个端口,并主动向RPC注册,因此RPC知道每个NFS 功能对应的端口。
RPC用111端口监听客户端的请求,并应答正确的端口。
启动NFS前,RPC就要先启动了,否则NFS会无法向RPC注册。
2、NFS 服务器需要安装nfs主程序,nfs-utils和rpc主程序portmap(二)exports服务器的方法:1、NFS文件存取权限因为NFS没有验证机制,当客户端用户访问NFS服务器的共享文件夹时会遇到的权限情况:(1)NFS服务器端用户列表中有与客户端用户名相同的用户名时,客户端可以直接存取共享文件夹。
例:客户端用户为khp,而nfs服务器用户列表(/etc/passwd)中也有khp这个用户名,则将拥有KHP权限。
(2)当访问NFS服务器的客户端用户UID与服务器端UID相同,但用户名却不相同时,客户端将拥有与服务器端UID 相同但不同用户的权限。
例:客户端为501UID,用户名为khp的帐号访问NFS服务器。
NFS服务器用户列表中(/etc/passwd)有uid为501 ,但用户名为pla的用户,所以客户端khp用户可以拥有NFS 服务器pla相同权限。
(3)如果客户端用户UID在NFS服务器端用户列表中不存在时,则以匿名用户的权限访问。
ubi文件系统原理
ubi文件系统原理
UBI文件系统(UBIFS)是一个用于嵌入式设备的日志结构文件系统。
它的设计目标是提供高性能、高可靠性和可扩展性,以适应各种嵌入式设备的需求。
UBIFS的核心思想是将闪存设备中的数据组织成一个树状结构,以提高数据的访问效率和可靠性。
这个树状结构被分为多个节点,每个节点对应一个闪存块。
每个节点中包含了数据和元数据,如文件的大小、权限等信息。
UBIFS通过使用日志技术来保证文件系统的一致性,即每次写入操作都会被记录在日志中,以便在系统崩溃或断电时能够恢复数据的完整性。
UBIFS还采用了压缩算法来节省闪存空间的使用。
它使用了一种称为UBI(Unsorted Block Images)的闪存管理层,将闪存设备划分为多个块,并对这些块进行管理和映射,从而提供了灵活的闪存管理功能。
UBIFS可以自动地在闪存设备上执行块的擦除和写入操作,以保证数据的完整性和可靠性。
UBIFS的设计还考虑了嵌入式设备的特殊需求。
它采用了一种称为UBI Fastmap的技术,可以加速文件系统的挂载过程。
此外,UBIFS 还支持闪存设备的坏块管理和wear leveling,以延长闪存设备的使用寿命。
UBIFS是一个专为嵌入式设备设计的高性能、高可靠性的日志结构
文件系统。
它通过使用树状结构、日志技术和压缩算法来提供快速、可靠的数据存储和访问功能。
无论是在智能手机、平板电脑还是其他嵌入式设备中,UBIFS都可以为用户提供优秀的文件系统体验。
它的设计理念和技术特点使得它成为嵌入式设备领域的首选文件系统之一。
autofs的用法
autofs的用法Autofs是一个在Unix-like操作系统中用于管理文件系统挂载的程序。
它可以根据用户的工作目录自动挂载不同的文件系统。
本篇文章将详细介绍autofs的用法,包括配置文件、挂载规则、使用方法等。
一、Autofs配置文件1. /etc/auto.master:该文件定义了整个系统的挂载点配置。
示例:/mnt/home - /home/*表示将/home目录下的所有子目录挂载到/mnt/home目录下。
2. /etc/auto.nfs:该文件包含了对NFS(Network File System)服务器的挂载规则。
示例:server:/export/home - /mnt/nfshome表示将NFS服务器上的/export/home目录挂载到本地系统的/mnt/nfshome目录下。
二、Autofs挂载规则Autofs会根据当前工作目录的变化,自动判断需要挂载哪种文件系统,并执行相应的挂载操作。
以下是常见的挂载规则:1. 当当前工作目录中的文件名中包含特定前缀时,根据相应的规则挂载文件系统。
2. 当当前用户属于特定的组时,根据相应的规则挂载文件系统。
3. 当用户切换到特定的目录时,根据相应的规则挂载文件系统。
1. 启动autofs:在终端中输入命令systemctl start autofs,即可启动autofs服务。
2. 查看当前挂载情况:在终端中输入命令pwd,查看当前工作目录。
如果当前目录下有特定的文件名前缀,表示autofs正在自动挂载文件系统。
3. 手动挂载:使用mount命令手动挂载某个文件系统。
例如,要挂载NFS服务器上的文件系统,可以输入命令mount -t nfs server:/export/path /local/path。
4. 卸载文件系统:使用umount命令卸载已经挂载的文件系统。
例如,要卸载刚才挂载的文件系统,可以输入命令umount/local/path。
使用ubifs格式的根文件系统
使⽤ubifs格式的根⽂件系统配置内核,使其⽀持ubifs⽂件系统 1)Device Drivers --->Memory Technology Device (MTD) support --->UBI - Unsorted block images --->Enable UBI 2)File systems --->Miscellaneous filesystems --->UBIFS file system support制作ubifs格式的根⽂件系统镜像先说明⼀下,板⼦上既有NorFlash,⼜有NandFlash,其中根⽂件系统和应⽤程序放在NandFlash上,uboot和kernel放在NorFlash上,⽽根⽂件系统所在的mtd设备为mtd2,分区⼤⼩为34MiBuboot kernel rootfs=34MiB app./mkfs.ubifs -v -r ./rootfs -o rootfs.img -m 2048 -e 129024 -c 272 -r:制定⽂件内容的位置 -m:页⾯⼤⼩ -e:逻辑擦除块⼤⼩ -c:最⼤的逻辑擦除块数量mkfs.ubifs -m 2048 -e 129024 -c 1984 -o rootfs.ubifs -x none-m 2048 (Minimum input/output unit size: 2048 bytes)-e 129024 (Default UBI LEB size: 129024 bytes, 126.0 KiB)-c 1984 (Amount of eraseblocks: 1984 (260046848 bytes, 248.0 MiB))-o rootfs.ubifs (output file)-x none (no compression)./ubinize -v -o rootfs.ubi -m 2048 -p 128KiB -s 2048 hi.cfg-p:物理擦除块⼤⼩-m:页⾯⼤⼩-s: 最⼩的硬件输⼊输出页⾯⼤⼩,如:k9f1208为256(上下半页访问)配置⽂件hi.cfg如下:[ubifs] mode=ubi image=rootfs.img vol_id=0 vol_size=34MiB vol_type=dynamic vol_alignment=1 vol_name=rootfs vol_flag=autoresize然后修改uboot的环境变量:setenv bootargs 'mem=288M console=ttyAMA0,115200 root=ubi0:rootfs rw rootflags=sync rootfstype=ubifs ubi.mtd=2mtdparts=hi_sfc:5M(boot),1M(picture);hinand:34M(rootfs),8M(config),86M(app)';保存环境变量,执⾏如下命令setenv ipaddr 192.168.253.132;setenv serverip 192.168.253.130;setenv ethaddr 40:61:86:67:33:47;mw.b 82000000 ff 2200000;tftp 82000000 rootfs.ubi;nand erase 0 2200000;nand write 82000000 0 $(filesize);sf probe 0;sf read 0x82000000 0x100000 0x400000;bootm 0x82000000说明:其实从上⾯的烧写命令可以看出,ubifs格式的镜像中是不包含oob信息的。
ubifs操作实例
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、配置内核支持UBIFSDevice 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/ubi3、制作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。
ubi以及ubifs
ubi以及ubifs1、很多人在linux上面build的时候经常会遇到缺少liblzo.so之类的库文件,我记得的有在编译mplayer会出现这个错误,还有这次使用ubifs的时候也是。
直接使用sudo apt-get install liblzo2-dev安装库文件。
2、ubifs2.1、什么是ubifs?由IBM、nokia工程师Thomas Gleixner,Artem Bityutskiy等人于2006年发起,致力于开发性能卓越、扩展性高的FLASH专用文件系统,以解决当前嵌入式环境下以FLASH作为MTD设备使用时的技术瓶颈。
关键字:UBI:一种类似于LVM的逻辑卷管理层。
主要实现损益均衡,逻辑擦除块、卷管理,坏块管理等。
UBIFS:基于UBI的FLASH日志文件系统。
有关ubifs的详细介绍,请参考:/doc/ubi.html/doc/ubifs.html2.2、如何得到ubifs?2.6.22以后,ubifs活跃于git管理工程中:git:///ubi-2.6.git2.6.27以后,ubifs被整合进内核树中,用户只需下载最新内核即可获取ubifs支持。
2.3、如何使用ubifs?软件环境:linux-2.6.28arm-linux-gcc 3.4.5硬件环境:s3c2410k9f12082.4、准备1、内核配置的时候选上1)Device Drivers --->Memory Technology Device (MTD) support --->UBI - Unsorted block images --->Enable UBI2)File systems --->Miscellaneous filesystems --->UBIFS file system support2、mtd-utils工具(flash_eraseall、ubiattach、ubimkvol)准备1)下载(mtd-utils、zlib、lzo)源码wget /debian/pool/main/m/mtd-utils/mtd-utils_20080508.orig.tar.gzwget /zlib-1.2.3.tar.gzwget /opensource/lzo/download/lzo-2.03.tar.gz2)编译安装zlibtar xzvf zlib-1.2.3.tar.gzcd zlib-1.2.3CC=arm-linux-gcc ./configure --shared --prefix=/usr/local/arm/3.4.5/arm-linuxmakemake installcd ..3)编译安装lzotar xzvf lzo-2.03.tar.gzcd lzo-2.03CC=arm-linux-gcc ./configure --host=arm-linux --prefix=/usr/local/arm/3.4.5/arm-linuxmakemake installcd ..4)编译mtd-utilstar xzvf mtd-utils_20080508.orig.tar.gzcd 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=1ubi-utils子目录下生成我们需要的ubiattach、ubimkvol等文件(请确保是交叉编译所得)3、mtd-utils工具(mkfs.ubifs、ubinize)准备git-clone git:///mtd-utils.gitcd mtd-utils/makemkfs.ubifs子目录下生成我们需要的mkfs.ubifs工具ubi-utils/new-utils子目录下生成我们需要的ubinize工具2.5、使用1、使用ramfs或nfs启动系统,执行以下命令挂载ubifs:1)flash_eraseall /dev/mtd42)ubiattach /dev/ubi_ctrl -m 43)ubimkvol /dev/ubi0 -N rootfs -s 50MiB4)mount -t ubifs ubi0_0 /mnt或mount -t ubifs ubi0:rootfs /mnt2、如果你想使用ubifs为rootfs,把文件系统内容解压到ubifs 挂载目录下,并修改内核启动参数为:console=ttySAC0 ubi.mtd=4 root=ubi0:rootfs rootfstype=ubifs3、如果你想直接在bootloader下烧写ubifs映像,使用以下命令制作ubi烧写映像:mkfs.ubifs -r rootfs -m 512 -e 15872 -c 3303 -o ubifs.imgubinize -o ubi.img -m 512 -p 16KiB -s 256 ubinize.cfg其中:1)以上命令的参数可从ubifs挂载信息中提取:UBI: attaching mtd4 to ubi0UBI: physical eraseblock size: 16384 bytes (16 KiB)UBI: logical eraseblock size: 15872 bytesUBI: smallest flash I/O unit: 512 UBI: sub-page size: 256 UBI: VID header offset: 256 (aligned 256)UBI: data offset: 512UBI: attached mtd4 to ubi02)配置文件ubinize.cfg的内容为:[ubifs]mode=ubiimage=ubifs.imgvol_id=0vol_size=50MiBvol_type=dynamicvol_name=rootfsvol_flags=autoresize。
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 的尺寸的,因此必须把这个时间考虑在内。
UBIFS
UBIFS ⽩⽪书|⼊陣去只因恨鐵不成鋼⼀、Flash⽂件系统设计思路为flash 设计的⽂件系统要求异地更新(out-of-place update)。
这是因为flash 在写之前必须要先擦除,且再次擦除之前只能写⼀次。
如果擦除块(eraseblocks)很⼩且可以快速擦除,那么可以将它们看作磁盘扇区(disk sector),但是实际上不是那种情况。
读出⼀个整块的擦除块,擦除它,再回写更新的数据,所花时间⽐单独在其它已经擦除了的擦除块更新数据长100倍。
换句话说,对于⼀个⼩的更新,在本地更新⽐异地更新更新时间长100倍。
异地更新要求垃圾回收(Garbage Collection)。
当有数据异地更新时,原来的擦除块就可能同时包含有效数据和废弃数据(这些数据在别的地⽅已经更新)。
这样到最后,⽂件系统将⽤完所有空的擦除块,以⾄于每个擦除块包括有效数据和废弃数据。
为了在别的地⽅写新的数据,必须有⼀个擦除块是空的以⾄于可以擦除和重新使⽤。
查找包含许多废弃数据的擦除块,并移动有效数据⾄其它擦除块,这个过程叫垃圾回收。
垃圾回收让我们想起节点结构的好处。
为了能回收⼀块擦除块,⽂件系统必须能确认存储的数据。
这是⽂件系统⾯对的⼀般索引问题的⽭盾。
⽂件系统通常以⼀个⽂件名开始和必须找到属于这个⽂件的数据。
垃圾回收可以开始于任何数据且必须发现这些数据属于哪个⽂件。
解决这个问题的⼀个⽅法是根据⽂件的数据存储元数据(metadata)。
数据和元数据结合在⼀起称为⼀个节点(node)。
每⼀个节点记录着其属于哪个⽂件和这个节点包含着什么数据。
JFFS2和UBIFS都是按照⼀个节点结构设计的,节点结构使能它们的垃圾回收器直接读擦除块,决定哪些数据需要移动,哪些要丢弃,根据实际情况去改变索引。
⼆、UBIFS设计简介JFFS2和UBIFS之间最⼤的不同就是UBIFS将索引存储在flash上,⽽JFFS2存储在内存中,当⽂件系统被挂载的时候,内存将重新建⽴索引。
移植UBIFS文件到DM368成功
移植ubifs到dm368成功我在用TI的dm368开发板,kernel是2.6.32.17,默认的flash文件系统是jffs2,但是jffs2在大分区下,mount速度很慢,而且占用ram较多,因此,我想使用ubifs看看性能是否会更好些。
ubifs的原理和配置过程,很多网页都有介绍的,我给一个链接,大家可以看看,我就不转载了,我重点说我移植过程中遇到并解决的问题。
kerne的配置很简单,2.6.32里面都有,选上并重新编译就好了。
ubiattach、ubimkvol等工具,TI的dvsdk里面自带了,能用,我就偷了个懒,没有重新编译。
很轻松的照着网页说明操作了下,mount 分区也成功了,复制文件也成功了,很高兴:)ubiattach /dev/ubi_ctrl -m 3ubimkvol /dev/ubi0 -N rootfs -s 480MiBmount -t ubifs ubi0_0 /mnt/nand/ -o sync但很快就遇到麻烦了,开发板关机重新启动,我再mout ubi文件系统就出错了,提示了一堆错误,而且分区是空的,之前复制的文件不见了。
问题如下:ubiattach /dev/ubi_ctrl -m 3UBI error: ubi_io_read: error -74while reading 64 bytes from PEB 1662:0, read 64 bytesUBI error: ubi_io_read: error -74while reading 64 bytes from PEB 1663:0, read 64 bytes为了分析问题,我把mtd和ubifs的debug log都打开了,看到了一些信息;#define EBADMSG 74 /* Not a data message *//*Nand returns -EBADMSG on ecc errors, but it returns* the data. For our userspace tools it isimportant* to dump areas with ecc errors !* For kernel internal usage it also mightreturn -EUCLEAN* to signal the caller that a bitflip hasoccured and has* been corrected by the ECC algorithm.* Userspace software which accesses NAND thisway* must be aware of the fact that it deals withNAND*/nand_do_read_opsstats= mtd->ecc_stats;if(mtd->ecc_stats.failed - stats.failed)return-EBADMSG;nand_read_page_hweccstat= chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]);if(stat < 0)mtd->ecc_stats.failed++;elsemtd->ecc_stats.corrected+= stat;看样子,应该是ECC出错了,可是我用的是硬件ECC校验,怎么可能几乎全部的page都出现ecc校验错误了呢?root@dm368-evm:~#flash_eraseall /dev/mtd3root@dm368-evm:~# ubiattach/dev/ubi_ctrl -m 3UBI: attaching mtd3 to ubi0UBI: physical eraseblock size: 131072 bytes (128 KiB)UBI: logical eraseblock size: 129024 bytesUBI: smallest flash I/O unit: 2048UBI: sub-page size: 512UBI: VID header offset: 512 (aligned 512)UBI: data offset: 2048分析下UBI写数据的过程,UBI DBG (pid 1484): ubi_io_write:write 512 bytes to PEB 57:0int ubi_io_write(struct ubi_device*ubi, const void *buf, int pnum, int offset,int len)addr= (loff_t)pnum * ubi->peb_size + offset;err= ubi->mtd->write(ubi->mtd, addr, len, &written, buf);在io_init函数中可以看到几个变量的赋值;ubi->peb_size = ubi->mtd->erasesize;ubi->peb_count = mtd_div_by_eb(ubi->mtd->size,ubi->mtd);ubi->flash_size= ubi->mtd->size;从debug log来看,这里一次写了512字节,从某个block的起始page开始,offset是0;那么到了nand mtd底层驱动,行为就是;nand_write->nand_do_write_ops:subpage= column || (writelen & (mtd->writesize - 1));这里,subpage就是writelen,512;也可以得知一点,ubifs没有使用oob,这跟jffs2和yaffs2是不同的;/*Partial page write ? */if(unlikely(column || writelen < (mtd->writesize - 1))) {cached= 0;bytes= min_t(int, bytes - column, (int) writelen);chip->pagebuf= -1;memset(chip->buffers->databuf,0xff, mtd->writesize);memcpy(&chip->buffers->databuf[column],buf, bytes);wbuf= chip->buffers->databuf;}ret= chip->write_page(mtd, chip, wbuf, page, cached,(ops->mode == MTD_OOB_RAW));下面是write_page函数的代码;static int nand_write_page(structmtd_info *mtd, struct nand_chip *chip,const uint8_t *buf, int page, int cached,int raw){intstatus;chip->cmdfunc(mtd,NAND_CMD_SEQIN, 0x00, page);if(unlikely(raw))chip->ecc.write_page_raw(mtd,chip, buf);elsechip->ecc.write_page(mtd,chip, buf);/** Cached progamming disabled for now, Not sureif its worth the* trouble. The speed gain is not veryimpressive. (2.3->2.6Mib/s)*/cached= 0;这里需要注意的就是raw,如果是MTD_OOB_RAW,那么不会做ECC校验,也不会把ECC码写入OOB;如果是这样,在read的时候也必须指定是MTD_OOB_RAW,不需要ECC校验;否则,就会出现我们最开始看到的错误;if(mtd->ecc_stats.failed - stats.failed)return-EBADMSG;那么,从这里的情况来看,我们可能已经找到出错的原因了;ubi使用了subpage write,而底层nand flash驱动实际上是不支持subpage write的,尽管ubi一次只写了512字节,但这个page的其他部分已经不能再次写入新的数据了。
ubifs 文件系统原理 -回复
ubifs 文件系统原理-回复UBIFS(Unsorted Block Image File System)是为闪存设备设计的一种日志型文件系统。
UBIFS最初由Nokia公司的Jörn Engel为Nokia N770网络平板电脑开发,旨在解决闪存设备上的稳定性和性能问题。
随着闪存技术的不断发展,尤其是在嵌入式和移动设备上的普及,UBIFS在Linux 内核中得到了广泛应用。
UBIFS的设计目标是在相对低成本的闪存设备上提供可靠的文件系统。
相较于传统的日志型文件系统,如JFFS2,UBIFS具有更好的性能和可扩展性。
UBIFS采用了一种称为“Log-Structured”的设计,这意味着所有的文件操作都是追加写入的,而不是修改原有数据。
这种设计避免了闪存设备上的擦除操作,使得UBIFS在闪存设备上的读写速度更快。
UBIFS的核心思想是使用一个称为“UBI”的逻辑存储层,将物理闪存设备抽象为一个逻辑闪存,而不是直接使用块设备接口。
UBIFS将闪存设备分成多个逻辑分区,每个分区由一个或多个物理闪存块组成。
UBIFS使用了一些创新的技术来管理这些逻辑分区,确保数据的安全和一致性。
首先,UBIFS使用了一个称为“LPT(Logical Physical Tree)”的数据结构来管理逻辑地址和物理地址之间的映射关系。
LPT由树状结构组成,每个节点表示一段逻辑地址范围和对应的物理地址范围。
通过LPT,UBIFS 可以根据逻辑地址快速定位到存储在闪存设备上的物理地址,从而提高访问速度。
其次,UBIFS引入了一种称为“Gloabl Mount UBI(GMUBI)”的机制来管理闪存设备的挂载和卸载。
GMUBI是一个全局的,只有一个实例的结构,它保存了所有挂载的UBI实例的信息。
GMUBI负责处理闪存设备的坏块管理、擦除操作、数据校验等。
通过GMUBI,UBIFS可以在多个设备之间共享数据,并保障数据的完整性。
ubifs分区信息详解
ubifs分区信息详解ubi挂载操作:(1)格式化ubi分区ubiformat /dev/mtd* 格式化mtdblock*(2)与ubi建了连接ubiattach /dev/ubi_ctrl -m * mtdblock*与ubi建⽴连接(3)创建volumeubimkvol /dev/ubi* -s 100MiB -N my_ubi_vol 在ubi*上创建⼀个volume,名字为my_ubi_vol,⼤⼩为100MiB(4)挂载ubifsmount -t ubifs /dev/ubi_0 /mnt 挂载对应的/dev/ubi_0,⽽⾮/dev/mtd*(5)卸载ubifsumount /mnt(6)断开ubi连接ubidetach -m *如果/dev/mtd*是⾮ubifs分区,则需要如上流程才能正常挂载使⽤,如果已经格式化为ubifs分区,则只需要ubiattach,即可mount使⽤。
ubi信息查看:crw-rw---- 1 root root 235, 0 Jan 1 00:00 /dev/ubi0crw-rw---- 1 root root 235, 1 Jan 1 00:00 /dev/ubi0_0crw-rw---- 1 root root 234, 0 Jan 1 00:09 /dev/ubi1crw-rw---- 1 root root 234, 1 Jan 1 00:09 /dev/ubi1_0crw-rw---- 1 root root 10, 48 Jan 1 1970 /dev/ubi_ctrl查看ubi相关的节点,如果有两个ubi分区,fs先挂载,则/dev/ubi0_0为fs,/dev/ubi1_0为datals -l /sys/class/ubilrwxrwxrwx 1 root root 0 Jan 1 00:00 /sys/class/ubi/ubi0 -> ../../devices/virtual/ubi/ubi0lrwxrwxrwx 1 root root 0 Jan 1 00:00 /sys/class/ubi/ubi0_0 -> ../../devices/virtual/ubi/ubi0/ubi0_0lrwxrwxrwx 1 root root 0 Jan 1 00:09 /sys/class/ubi/ubi1 -> ../../devices/virtual/ubi/ubi1lrwxrwxrwx 1 root root 0 Jan 1 00:18 /sys/class/ubi/ubi1_0 -> ../../devices/virtual/ubi/ubi1/ubi1_0-r--r--r-- 1 root root 4096 Jan 1 00:00 /sys/class/ubi/version查看ubi节点对应的信息,为link符合链接。
ubifs烧写到nandflash中的几种方法--mfgtool用的是第三种
ubifs烧写到nandflash中的几种方法--mfgtool用的是第三种折腾了好几天,突然柳暗花明,继而思之,发现原来是出门就走错了路,悲剧之余,写下此笔记,以省自己,警他人。
正题,关于UBIFS的介绍在此就不多说,详见:/faq/ubifs.html/faq/ubi.html1. UBIFS文件系统镜像的制作过程1.1 所需的工具制作UBIFS镜像所需的工具有mkfs.ubifs和ubinize,可以通过以下方式获取到此两个工具:1. 方法一:从官网通过git工具下载源码,编译可得之,下载命令:1.git clone git:///mtd-utils.git下载到源码后,编译需要的的软件包有:uuid-dev和lzo,uuib-dev可以通过apt-get直接安装,lzo需要手动下载编译,官方网站为:/opensource/lzo/download/2. 方法二:安装mtd-utils工具包,安装命令为:1.sudo apt-get install mtd-utils不过此方法不保证安装的工具可以正常使用(可能版本过低)。
1.2 UBIFS镜像的制作有了mkfs.ubifs和ubinize两个工具后,就可以制作UBIFS镜像了,注意:在PC上ubuntu使用mkfs.ubifs and ubinize,则我们要用普通的gcc来编译它们,同时在ubuntu上装上lzo库:sudo apt-get install liblzo2-dev具体步骤如下:1. 使用mkfs.ubifs命令将某个文件夹制作为UBIFS镜像,具体命令为:1.mkfs.ubifs -r /tmp/rootfs -m 2048 -e 126976 -c 992 -o ubifs.img以上命令的含义为将/tmp/rootfs文件夹制作为UBIFS文件系统镜像,输出的镜像名为ubifs.img,其中最小输入输出大小为2KiB(2048bytes),一般为页大小;逻辑可擦除块大小为126976=124KiB=(每块的页数-2)*页大小=(64-2)*2KiB ;(每个逻辑块有2页不能被擦除?)最多逻辑可擦除块数目为992(992*128KiB=124MiB),这个可根据ubi volume来设置,实际上是设置此卷的最大容量。
ubifs文件系统的制作过程
ubifs文件系统的制作过程&&遇到的问题及解决方案总结---之一“uboot中添加对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:2.6.29 编译器:arm-linux-gcc-4.3.2.tgz§uboot: u-boot-2008.10二.移植步骤本次移植的功能为:支持UBIFS文件系统1.在include/configs/mini2440.h中添加如下配置:(注意:不同的开发板在include/configs/目录下对应的修改的配置文件不同,我的开发板是mini2440所以修改的是mini2440.h)#define CONFIG_MTD_DEVICE#define CONFIG_MTD_PARTITIONS#define CONFIG_CMD_MTDPARTS#define CONFIG_LZO#define CONFIG_RBTREE#define CONFIG_CMD_UBIFS //要支持ubIfs首先得让uboot支持UBIFS的烧写命令#define CONFIG_CMD_UBI //uboo支持的ubifs烧写命令:1.mtdparts: 用来给NAND分区;/*2.nand erase.part:用来擦除指定分区等这些命令在“UBIFS镜像的制作&&烧写”博文理解*///其次要支持MTD(memory technology device内存技术设备)是用于访问memory设备(ROM、flash)的Linux的子系统#define MTDIDS_DEFAULT "nand0=nandflash0" //同时要给nandlflash建立默认的分区,#define MTDPARTS_DEFAULT"mtdparts=nandflash0:384k(bootloader),"\ //我的分区:"128k(params),"\"5m(kernel),"\"64m(root)"/*还要修改下面几个宏,因为使用UBIFS会占用更多的堆、栈空间*/#define CONFIG_STACKSIZE (512*1024)#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE+1024*1024) #define CONFIG_SYS_GBL_DATA_SIZE 5122.回到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-ubifs文件系统的制作过程&&遇到的问题及解决方案总结---之二“Linux内核中添加对UBIFS文件系统的支持”分类:嵌入式2012-04-19 13:55 156人阅读评论(0) 收藏举报一、移植环境§主机:vmware-redhat5§开发板:mini2440--256MB nandflash§kernel:2.6.29 编译器:arm-linux-gcc-4.3.2.tgz§uboot: u-boot-2008.10二.移植步骤1.在内核顶层目录下使用命令:make menuconfig ,进入内核配置菜单,添加对UBIFS文件系统的支持。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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)。