专栏首页QB杂货铺一种分片更新ubi卷的方式(基于ubiupdatevol,拓展fifo支持)

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

ubi卷的更新方式

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

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

ubiupdatevol工具

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

基本的用法很简单,如帮助文件所示,直接传入要更新的设备和要更新的数据文件即可。 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参数指定,未指定的话直接取卷的大小即可。

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

例如

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

原文:https://www.cnblogs.com/zqb-all/p/11074500.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • cp: 无法创建普通文件 : 文件已存在

    看了下 Makefile,这句非常简单,就是 cp ./xxx ../xxx 而已,本身没什么问题。

    zqb_all
  • 【swupdate文档 一】嵌入式系统的软件管理

    嵌入式系统变得越来越复杂, 它们的软件也反映了这种复杂性的增加。 为了支持新的特性和修复,很有必要让嵌入式系统上的软件 能够以绝对可靠的方式更新。 在基于...

    zqb_all
  • ubuntu14.04编译vim8.1

    由于我希望能在无sudo权限机器,所以决定安装到~/usr目录下。这个可以通过 --prefix指定

    zqb_all
  • 浏览器存储之cookie

    城市中的游牧民族
  • 【swift学习笔记】六.访facebook登录页面

    代码最下边有下载地址。 做这个demo的主要心得就是自适应所有的屏幕,要先布局大的框架,再一步一步设置小的细节。 看一下效果 ? 再看一下自动适应所有屏幕的效果...

    lpxxn
  • Laravel调试利器:Laravel Debugbar

    Laravel Debugbar用于直观的显示调试及错误信息,提高开发效率。以及可以提供项目优化。

    无道
  • 用40行Python代码 实践高大上的人脸识别

    很多人都认为人脸识别是一项非常难以实现的工作,看到名字就害怕,然后心怀忐忑到网上一搜,看到网上N页的教程立马就放弃了。这些人里包括曾经的我自己。其实如果如果你不...

    IT派
  • 产品经理的需求池管理

    需求池可以理解成一个产品迭代依据的库,数据库记录各种数据,那么需求池记录的是各种需求。

    靠谱先生
  • libevent源码深度剖析十二 让libevent支持多线程

    (1)libevent源码深度剖析一 序 (2)libevent源码深度剖析二 Reactor模式 (3)libevent源码深度剖析三 libevent基本使...

    范蠡
  • 40行代码的人脸识别实践

    很多人认为人脸识别是非常难以实现的工作,看到名字就害怕,看到网上N页的教程立马就放弃了。包括曾经的我自己。其实如果你不是非要深究其中的原理,只是要实现这一工作的...

    刘潇龙

扫码关注云+社区

领取腾讯云代金券