UBIFS

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/pottichu/article/details/5539923

说是原创, 其实也是对网络上的一些资料的整理,再加上自己的验证。

一、 UBIFS 简介
由IBM、nokia工程师Thomas Gleixner,Artem Bityutskiy等人于2006年发起,致力于开发性能卓越、扩展性高的FLASH专用文件系统,以解决当前嵌入式环境下以FLASH作为MTD设备使用时的技术瓶颈,

开发背景:
FLASH特性:
FLASH是一类电可擦出可编程存储体,在使用方式上与硬磁盘最大不同是:

FLASH文件系统所必须的关键技术:
1. 由于FLASH的“先擦除后写”的特性决定,必须(或者说所被公认为)采用异地更新策略(out-of-place update)。相关问题讨论可参考:
http://www.linux-mtd.infradead.org 文档 A Brief Introduction to the Design of UBIFS。

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使用上的技术瓶颈。但也仍然存在诸多问题:如内存消耗大,对 FLASH容量、文件系统大小、内容、访问模式等的线性依赖,损益均衡能力差活过渡损益。随作FLASH容量逐渐暴涨(我见到的资料已经有 64GFLASH已经实用化),JFFS,YAFFS几乎无法管理如此大的FLASH——虽然JFFS目前还在改进中,但前途不看好,一个很好的例子 JFFS的主要开发者大多倒向了UBIFS。:)
 
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前的准备
1. 获取 ubifs:
   2.6.22以后,ubifs活跃于git管理工程中
  git://git.infradead.org/ubi-2.6.git
   2.6.27以后,ubifs被整合进内核树中,用户只需下载最新内核即可获取ubifs支持。

2. 配置linux内核 (2.6.28 以上 kernel 已经包含 ubifs, 早期的kernel 还得去官网上找找,我的就是 2.6.28)
    配置的时候选上
   1)Device Drivers  --->Memory Technology Device (MTD) support  --->UBI - Unsorted block images  --->Enable UBI
   2)File systems  --->Miscellaneous filesystems  --->UBIFS file system support
    这样我们的内核就支持UBIFS文件系统了

3. UBIFS工具
   mtd-utils工具中提供了对UBIFS的支持,所以我们需要下载和编译这些工具,下载以下几个文件
    1)下载mtd-utils
    wget http://debian.mirror.inra.fr/debian/pool/main/m/mtd-utils/mtd-utils_20080508.orig.tar.gz
    tar xzvf mtd-utils_20080508.orig.tar.gz
    cd mtd-utils-20080508

    2)编译mtd-utils (主要是修改工具链)
     修改Makefile文件:
     #CROSS=arm-linux-
       修改为  CROSS=arm-marvell-linux-gnueabi-
     BUILDDIR := $(CROSS:-=)
       修改为  BUILDDIR := .

       修改ubi-utils/Makefile文件:
       添加    CROSS=arm-marvell-linux-gnueabi-
 
       修改    ubi-utils/new-utils/Makefile文件:
       添加    CROSS=arm-marvell-linux-gnueabi-

     make WITHOUT_XATTR=1

    3) ubi-utils子目录下生成我们需要的ubiattach、ubimkvol等文件(请确保是交叉编译所得) 
    mkfs.ubifs子目录下生成我们需要的mkfs.ubifs工具,通过这个工具我们能打包一个文件夹,生成UBIFS系统镜像,
     我是使用 nfs 启动, 直接解压文件到 flash 上,所以并没有使用 mkfs.ubifs工具.
     另外网络上很多文正提到 zlib、lzo 这两个库,但是我并没有使用到。


三. 如何使用UBIFS

1. 使用nfs启动系统, 首先建立设备节点:
    mknod   /dev/ubi_ctrl c 10 58
    mknod /dev/ubi0 c 250 0

2、 执行以下命令挂载ubifs:
   1)flash_eraseall /dev/mtd4                 #擦出分区
   2)ubiattach /dev/ubi_ctrl -m 4             #建立关联
   3)ubimkvol /dev/ubi0 -N rootfs -s 450MiB   #创建容量, -s 是设置大小
   4)mount -t ubifs ubi0_0 /mnt               # 也可以:mount -t ubifs ubi0:rootfs /mnt


三. uboot 如何支持 UBIFS 为根文件系统启动:
setenv bootargs console=ttyS0,115200 ubi.mtd=4 root=ubi0_0 rootfstype=ubifs ip=192.168.1.101:192.168.1.100::255.255.255.0::usb0:on


下面附上一个我自己通过 nfs 启动以后, 烧写 kernel 和文件系统的脚本。


#!/bin/sh

TestResult()
{
if [ $? -ne 0 ]; then
        echo "$1 faild please check the file"
        exit 1
else
        echo "$1 OK !!!"
        echo " "
fi
}


#Erase the flash partition
echo "--------------Erase the flash partitin----------------"
/mtd-utils/usr/sbin/flash_eraseall /dev/mtd3
/mtd-utils/usr/sbin/flash_eraseall /dev/mtd4

echo "--------------Install kernel and software to flash----------------"
/bin/dd if=/zImage of=/dev/mtdblock3


mkdir -p /mountpoint
mknod   /dev/ubi_ctrl c 10 58
mknod /dev/ubi0 c 250 0

/mtd-utils/ubi/ubiattach /dev/ubi_ctrl -m 4
TestResult "/mtd-utils/ubi/ubiattach /dev/ubi_ctrl -m 4"

/mtd-utils/ubi/ubimkvol /dev/ubi0 -N rootfs -s 450MiB
TestResult "/mtd-utils/ubi/ubimkvol /dev/ubi0 -N rootfs -s 450MiB"

/bin/mount -t ubifs ubi0_0 /mountpoint
TestResult "/bin/mount -t ubifs ubi0_0 /mountpoint"

echo "tar xvf /fs.tar -C /mountpoint please wait"
tar xf /FSSoftware.tar -C /mountpoint
sync
/bin/umount /mountpoint

echo "----------------------------------------------------------------"
echo "         Please set uboot environment:   "
echo "setenv bootargs console=ttyS0,115200 ubi.mtd=4 root=ubi0_0 rootfstype=ubifs ip=192.168.1.101:192.168.1.100::255.255.255.0::usb0:on"
echo "----------------------------------------------------------------"
exit 0

 

另外 ubifs 是一个异步的文件系统, 所以为了掉电的时候数据能保存完整, 最好使用

 

-o sync 挂载文件系统。

展开阅读全文

ubifs文件系统挂载失败

05-24

最近由于工作需求,想做一个ubifs文件系统,但是挂载失败,请大侠帮忙分析一下,错误信息如下:rn[color=#FF0000]UBI: attaching mtd2 to ubi0rnUBI: physical eraseblock size: 131072 bytes (128 KiB)rnUBI: logical eraseblock size: 129024 bytesrnUBI: smallest flash I/O unit: 2048rnUBI: sub-page size: 512rnUBI: VID header offset: 512 (aligned 512)rnUBI: data offset: 2048rnUBI: attached mtd2 to ubi0rnUBI: MTD device name: "nand.rootfs"rnUBI: MTD device size: 235 MiBrnUBI: number of good PEBs: 1873rnUBI: number of bad PEBs: 7rnUBI: max. allowed volumes: 128rnUBI: wear-leveling threshold: 4096rnUBI: number of internal volumes: 1rnUBI: number of user volumes: 0rnUBI: available PEBs: 1851rnUBI: total number of reserved PEBs: 22rnUBI: number of PEBs reserved for bad PEB handling: 18rnUBI: max/mean erase counter: 2/1rnUBI: image sequence number: 0rnUBI: background thread "ubi_bgt0d" started, PID 337rnUBIFS error (pid 1): ubifs_get_sb: cannot open "ubi0:rootfs", error -19rnVFS: Cannot open root device "ubi0:rootfs" or unknown-block(0,0)rnPlease append a correct "root=" boot option; here are the available partitions:rn1f00 16384 mtdblock0 (driver?)rn1f01 5120 mtdblock1 (driver?)rn1f02 240640 mtdblock2 (driver?)rnKernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)rn[<8002a128>] (unwind_backtrace+0x0/0xe0) from [<8030fb8c>] (panic+0x68/0xdc)rn[<8030fb8c>] (panic+0x68/0xdc) from [<80008d58>] (mount_block_root+0x234/0x284)rn[<80008d58>] (mount_block_root+0x234/0x284) from [<80008e8c>] (prepare_namespace+0x88/0x174)rn[<80008e8c>] (prepare_namespace+0x88/0x174) from [<800089e0>] (kernel_init+0x120/0x160)rn[<800089e0>] (kernel_init+0x120/0x160) from [<800268b4>] (kernel_thread_exit+0x0/0x8)[/color]rn我制作ubifs文件系统步骤如下:rn1、在kernel中添加ubifs文件系统相关的选项rn2、制作ubifs.img文件并烧写经nand flash,但是就是挂载不上,请大虾帮忙分析,谢谢 论坛

ubifs 挂载出错

09-01

major minor #blocks namernrn 31 0 1024 mtdblock0rn 31 1 5120 mtdblock1rn 31 2 122880 mtdblock2rn 31 3 1968128 mtdblock3rnrn[root@FORLINX6410]# df -hrnFilesystem Size Used Available Use% Mounted onrn/dev/root 19.2G 12.0G 6.2G 66% /rntmpfs 114.0M 0 114.0M 0% /dev/shmrn/dev/mtdblock2 120.0M 4.7M 115.3M 4% /mnt/diskrnrn我用nfs启动的文件系统,按照步骤rn./flash_erase /dev/mtd3 0 0rn./ubiattach -m 3rn./ubimkvol /dev/ubi0 -N lvapp -s 500MiBrnrnrnUBI: attaching mtd3 to ubi0rnUBI: physical eraseblock size: 524288 bytes (512 KiB)rnUBI: logical eraseblock size: 516096 bytesrnUBI: smallest flash I/O unit: 4096rnUBI: VID header offset: 4096 (aligned 4096)rnUBI: data offset: 8192rnUBI: empty MTD device detectedrnUBI: max. sequence number: 0rnUBI: create volume table (copy #1)rnUBI: create volume table (copy #2)rnUBI: attached mtd3 to ubi0rnUBI: MTD device name: "File System"rnUBI: MTD device size: 1922 MiBrnUBI: number of good PEBs: 3842rnUBI: number of bad PEBs: 2rnUBI: max. allowed volumes: 128rnUBI: wear-leveling threshold: 4096rnUBI: number of internal volumes: 1rnUBI: number of user volumes: 0rnUBI: available PEBs: 3800rnUBI: total number of reserved PEBs: 42rnUBI: number of PEBs reserved for bad PEB handling: 38rnUBI: max/mean erase counter: 0/0rnUBI: image sequence number: -705651541rnUBI: background thread "ubi_bgt0d" started, PID 114rnUBI device number 0, total 3842 LEBs (1982840832 bytes, 1.8 GiB), available 3800 LEBs (1961ize 516096 bytes (504.0 KiB)rnrnrnVolume ID 0, size 1016 LEBs (524353536 bytes, 500.1 MiB), LEB size 516096 bytes (504.0 KiB)nment 1rnrnrn[root@FORLINX6410]# mount -t ubifs ubi0_0 /mnt/ubifsrnmount: mounting ubi0_0 on /mnt/ubifs failed: Device or resource busyrn最后总是提示 这个 挂载失败的错误.ubifs 这个目录是我刚建的,没人用的.rnrn[root@FORLINX6410]# df -hrnFilesystem Size Used Available Use% Mounted onrn/dev/root 19.2G 12.0G 6.2G 66% /rntmpfs 114.0M 0 114.0M 0% /dev/shmrn/dev/mtdblock2 120.0M 4.7M 115.3M 4% /mnt/diskrnrn求教啊~~~实在不知道什么问题了~~~~rn[root@FORLINX6410]# mountrnrootfs on / type rootfs (rw)rn/dev/root on / type nfs (rw,relatime,vers=2,rsize=1024,wsize=1024,namlen=255,hard,nolock,proto=udp,port=65535,timeo=11,retrans=3,sec=sys,addr=192.168.1.27)rndevtmpfs on /dev type devtmpfs (rw,relatime,size=116648k,nr_inodes=29162,mode=755)rnramfs on /etc type ramfs (rw,relatime)rnnone on /proc type proc (rw,relatime)rnnone on /sys type sysfs (rw,relatime)rnnone on /proc/bus/usb type usbfs (rw,relatime)rnnone on /dev type ramfs (rw,relatime)rnnone on /dev/pts type devpts (rw,relatime,mode=622)rntmpfs on /dev/shm type tmpfs (rw,relatime)rnnone on /tmp type ramfs (rw,relatime)rnnone on /var type ramfs (rw,relatime)rn/dev/mtdblock2 on /mnt/disk type yaffs2 (rw,relatime) 论坛

没有更多推荐了,返回首页