对于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);
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工具使用起来,一个不方便的地方就是,必须将要更新的数据事先准备好,保存在本地,一次性传递给它。工具
这种要求有时候是知足不了的。例如在空间有限的嵌入式设备上,更新一个卷的数据可能须要分屡次,每次从网络上下载一部分,更新进去,再下载一部分,以此循环。
此时通常须要本身写一个应用来完成。此处提供另一种思路,即扩展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