一种分片更新ubi卷的方式(基于ubiupdatevol,拓展fifo支持)

ubi卷的更新方式

对于ubi卷,不能像普通块设备同样进行随机读写。每次更新须要从头写入。
具体的,须要在打开对应的设备以后,先执行一个ioctl UBI_IOCVOLUP,同时传入要更新的数据大小。
随后开始写入数据。写入能够分屡次,但必须写满ioctl指定的须要更新的数据量。
写入足够的数据量以后,ubi才算更新完成。提早中断的话,该卷会被破坏,只能从新开始一次更新才能修复它。html

fd = open("/dev/my_volume");
ioctl(fd, UBI_IOCVOLUP, &image_size);
write(fd, buf, image_size);
close(fd);

ubiupdatevol工具

mtd-utils 系列工具中,提供了ubiupdatevol工具,可用于更新ubi卷。node

基本的用法很简单,如帮助文件所示,直接传入要更新的设备和要更新的数据文件便可。
ubiupdatevol会自动得到文件的大小,再完成ioctl和写入。
固然也能够经过-s指定要更新的数据大小,经过--skip跳过部分源文件的长度。
若是对ubi卷执行-t,则等同于擦除该卷的数据。网络

ubiupdatevol version 2.0.1 - a tool to write data to UBI volumes.

Usage: ubiupdatevol <UBI volume node file name> [-t] [-s <size>] [-h] [-V] [--truncate]
            [--size=<size>] [--help] [--version] <image file>

Example 1: ubiupdatevol /dev/ubi0_1 fs.img - write file "fs.img" to UBI volume /dev/ubi0_1
Example 2: ubiupdatevol /dev/ubi0_1 -t - wipe out UBI volume /dev/ubi0_1

-t, --truncate             truncate volume (wipe it out)
-s, --size=<bytes>         bytes to read from input
    --skip=<bytes>         leading bytes to skip from input
-h, --help                 print help message
-V, --version              print program version

为ubiupdatevol拓展fifo功能

ubiupdatevol工具使用起来,一个不方便的地方就是,必须将要更新的数据事先准备好,保存在本地,一次性传递给它。工具

这种要求有时候是知足不了的。例如在空间有限的嵌入式设备上,更新一个卷的数据可能须要分屡次,每次从网络上下载一部分,更新进去,再下载一部分,以此循环。
此时通常须要本身写一个应用来完成。此处提供另一种思路,即扩展ubiupdatevol工具。能够为ubiupdatevol工具拓展一个fifo功能,当传入-f参数时,让ubiupdatevol建立一个有名管道(named fifo),并阻塞在这个管道上,每读到一笔数据就写入卷中,直到从管道读取到足够长度的数据,再删除管道,完成本次更新。
长度能够在调用时使用-s参数指定,未指定的话直接取卷的大小便可。code

这样对于其余程序来讲,调用ubiupdatevol生成用于更新的fifo以后,就能够直接打开fifo文件,分屡次写入数据便可。在写完有效数据以后,能够再往fifo中写入足够多的0数据,以填满整个卷。htm

例如blog

ubiupdatevol /dev/ubi0_1 -f
dd if=newdata.part1 of=/dev/ubi0_1_fifo
dd if=newdata.part2 of=/dev/ubi0_1_fifo
dd if=/dev/zero of=/dev/ubi0_1_fifo

原文:http://www.javashuo.com/article/p-autjjwjn-gh.htmlip

相关文章
相关标签/搜索