UBIFS

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

一、 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 挂载文件系统。

<think>首先,用户的问题是关于如何提取UBIFS文件系统中的文件。系统级指令要求我使用正确的LaTeX格式,使用中文回答,生成相关问题,并在引用段落末尾添加引用标识。 从引用中,我看到几个关键点: - 引用[1]:描述了如何设置参数使用ubifs作为根文件系统。 - 引用[2]:介绍UBIFS文件系统,包括压缩特性。 - 引用[3]:详细说明了在Ubuntu下提取、修改、解包打包UBI/UBIFS镜像文件的步骤。 - 引用[4]:解释了mkfs.ubifs的-F参数的作用。 用户意图是提取UBIFS文件系统中的文件,所以我应该基于引用[3],因为它提供了具体的操作步骤。 我的回答结构需要清晰,逐步解决问题。确保回答真实可靠,基于提供的引用。 步骤: 1. **准备环境**:在Ubuntu系统上安装必要的软件包。 2. **加载内核模块**:模拟NAND设备。 3. **处理MTD设备**:格式化并附加UBI。 4. **挂载文件系统**:访问UBIFS文件。 5. **提取文件**:从挂载点复制文件。 引用标识:在引用段落末尾添加[^数字],例如[^3]。 生成相关问题:在回答末尾,添加相关问题部分。 LaTeX格式: - 行内数学表达式用$...$,例如变量名。 - 独立公式用$$...$$,但在这个上下文中,可能不需要数学公式,除非有计算。如果有变量,比如大小,可以用$...$。 回答结构: - 引言:简要说明提取UBIFS文件系统文件的步骤。 - 逐步指南:详细步骤。 - 结论:总结。 - 相关问题:生成2-3个相关问题。 完整回答: 1. 使用中文。 2. 引用[3]是最相关的,所以我会主要参考它。 3. 添加引用标识。 相关问题建议: 1. 如何修改UBIFS文件系统中的文件? 2. 如何重新打包UBIFS镜像? 3. UBIFS文件系统的优势是什么? 最终输出: - 回答部分。 - §§相关问题§§部分。</think>### 提取UBIFS文件系统中的文件 UBIFS(Unsorted Block Image File System)是一种针对闪存设备优化的文件系统,常用于嵌入式系统。要提取UBIFS文件系统中的文件,需要在Linux环境下(如Ubuntu)模拟闪存设备并挂载UBIFS分区。以下是基于引用[3]的详细步骤,确保操作安全可靠。整个过程需要管理员权限,并假设您已有UBIFS镜像文件(例如 `rootfs.ubifs`)。 #### 步骤1: 准备环境 首先,在Ubuntu系统上安装必要的软件包。这些工具包括MTD实用程序、文件系统操作工具等: ```bash sudo apt-get update sudo apt-get install mtd-utils git binwalk ``` 这些软件包提供了处理UBIFS镜像的基础功能[^3]。 #### 步骤2: 加载内核模块 加载必要的内核模块以模拟NAND闪存设备。这允许您将UBIFS镜像挂载到系统中: ```bash sudo modprobe mtd sudo modprobe mtdblock sudo modprobe ubi sudo modprobe ubifs # 模拟NAND设备,参数根据您的镜像调整(例如,块大小ID字节) sudo modprobe nandsim first_id_byte=0x98 second_id_byte=0xaa third_id_byte=0x90 fourth_id_byte=0x15 block_size=126976 ``` 此步骤创建了一个虚拟MTD设备(如 `/dev/mtd0`),用于后续操作[^3]。 #### 步骤3: 格式化并附加UBI卷 将UBIFS镜像写入模拟的MTD设备,并创建UBI卷: ```bash # 查看MTD设备信息(确认设备如 /dev/mtd0 存在) sudo mtdinfo /dev/mtd0 # 格式化MTD设备(-s 参数指定子页大小,-O 参数指定最小I/O单位,通常为2048) sudo ubiformat -s 2048 -O 2048 /dev/mtd0 # 重新附加UBI设备 sudo ubiattach -p /dev/mtd0 -O 2048 # 创建UBI卷(-N 指定卷名,-s 指定大小,需匹配镜像文件大小,例如49MiB) sudo ubimkvol /dev/ubi0 -N volume1 -s 49MiB # 将UBIFS镜像写入卷(例如 rootfs.ubifs) sudo ubiupdatevol /dev/ubi0_0 rootfs.ubifs ``` 这里,`ubiupdatevol` 命令将镜像文件写入卷,确保数据完整性[^3]。注意:镜像大小必须准确,否则可能导致错误(可用 `ls -l rootfs.ubifs` 检查文件大小)。 #### 步骤4: 挂载UBIFS文件系统并提取文件 挂载UBI卷到目录,然后访问复制文件: ```bash # 创建挂载点 sudo mkdir /mnt/ubifs # 挂载UBIFS文件系统 sudo mount -t ubifs /dev/ubi0_0 /mnt/ubifs # 进入挂载点查看文件 cd /mnt/ubifs ls -l # 列出所有文件 # 提取文件(例如复制到主目录) cp -r /mnt/ubifs /home/yourusername/extracted_files ``` 现在,文件已提取到 `/home/yourusername/extracted_files` 目录。完成后,卸载文件系统以释放资源: ```bash sudo umount /mnt/ubifs sudo ubidetach -p /dev/mtd0 ``` 此过程允许您安全访问UBIFS内容,而无需实际硬件[^3]。 #### 注意事项 - **压缩特性**:UBIFS使用LZO或zlib压缩(引用[2]),如果文件已压缩(如MP3),提取可能不会减少大小,但操作不影响原始数据。 - **错误处理**:如果遇到ECC错误(常见于NAND闪存),确保镜像创建时使用 `mkfs.ubifs` 的 `-F` 参数修复空间问题(引用[4])。 - **性能**:在虚拟机中操作可能较慢,建议使用物理Ubuntu系统。 通过以上步骤,您可以高效提取UBIFS文件系统中的文件。整个过程基于标准Linux工具,确保可靠性[^3]。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值