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

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

  1. NoSQL生态系统——hash分片和范围分片两种分片

    13.4 横向扩展带来性能提升 很多NoSQL系统都是基于键值模型的,因此其查询条件也基本上是基于键值的查询,基本不会有对整个数据进行查询的时候.由于基本上所有的查询操作都是基本键值形式的,因此分片通 ...

  2. 四种常见的 POST 提交数据方式--good

    HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种.其中 POST 一般用来向服务端提交数据,本文 ...

  3. gopkg:一种方便的go pakcage管理方式

    在使用go的过程中,我们有时候会引入一些第三方库来使用,而通常的方式就是使用go get,可是这样的方式有一个非常严重的问题,假设第三方库更新了相关接口,非常有可能你就无法使用了,所以我们一套非常好地 ...

  4. 四种常见的 POST 提交数据方式 专题

    定义和用法 enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码.默认地,表单数据会编码为 "application/x-www-form-urlencoded". ...

  5. How to make asynchronous HTTP requests in PHP 4种PHP异步执行的常用方式

    [是否等待返回就执行下一步] How to make asynchronous HTTP requests in PHP - Stack Overflow https://stackoverflow. ...

  6. 几种部署Goku API Gateway的方式,最快一分钟可使用上网关

    本文将介绍几种部署Goku API Gateway的方式,最快一分钟可使用上为网关,详情请看全文. 什么是Goku API Gateway? Goku API Gateway (中文名:悟空 API ...

  7. MySql中4种批量更新的方法update table2,table1,批量更新用insert into ...on duplicate key update, 慎用replace into.

    mysql 批量更新记录 MySql中4种批量更新的方法最近在完成MySql项目集成的情况下,需要增加批量更新的功能,根据网上的资料整理了一下,很好用,都测试过,可以直接使用. mysql 批量更新共 ...

  8. sharding-jdbc 分库分表的 4种分片策略,还蛮简单的

    上文<快速入门分库分表中间件 Sharding-JDBC (必修课)>中介绍了 sharding-jdbc 的基础概念,还搭建了一个简单的数据分片案例,但实际开发场景中要远比这复杂的多,我 ...

  9. Spring的三种通过XML实现DataSource注入方式

    Spring的三种通过XML实现DataSource注入方式: 1.使用Spring自带的DriverManagerDataSource 2.使用DBCP连接池 3.使用Tomcat提供的JNDI

随机推荐

  1. 护网杯2019 mergeheap --pwn

    护网 又是签到 一天 这道题一开始 不懂得如何泄露 libc 信息,就蒙了  后来群里师傅也是刚刚好 做出 到这里 我就接着做了 . 先看下保护,发现  全开了 然后 就看下流程 大概 就是添加  c ...

  2. python基础-面向对象编程之封装、访问限制机制和property

    面向对象编程之封装 封装 定义:将属性和方法一股脑的封装到对象中,使对象可通过"对象."的方式获取或存储数据. 作用:让对象有了"."的机制,存取数据更加方便 ...

  3. 元数据管理的重要性 - xms

    什么是元数据?引用百科的描述就是:元数据(Metadata),又称中介数据.中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息: 看起来有点抽象 ...

  4. php之自动加载(懒加载)

    有A类和B类,如果在A类实例化B类,最简单直接的方法就是在B中使用include require_once A的文件,但是这种方法显然是不友好的,在框架中叶不是这么做的,在框架中使用的是自动加载的机制 ...

  5. 05-kubernetes Pod控制器应用进阶

    目录 Pod 资源 标签 给资源打标签 标签选择器 Pod 生命周期 实际操作 livenessProbe 实战 livenessProbe exec 测试 livenessProbe httpGet ...

  6. Layui下拉3级联动

    这里我就不给大家详细说明了直接附图: js代码: layui.use(['layer', 'form','xform','layer'], function () { var element = la ...

  7. 这货到底还是不是垃圾?【垃圾回收GC算法JVM篇四】

    目录 1.判断对象是否存活的JVM两种计数算法 2.垃圾收集算法 3.垃圾回收算法小结 垃圾收集 Garbage Collection 通常被称为"GC", 在jvm 中,程序计数 ...

  8. python读写配置文件使用总结与避坑指南

    关于今天的内容 最近拿python在写项目部署的相关集成代码,本来两天的工作量,硬是在来回的需求变更中,拖到了一周的时间.今天算是暂时告一段落了.这次由于涉及多个系统的调用和配置参数,代码开发中出现了 ...

  9. 使用SSH服务远程管理主机(使用密钥)

    使用ssh服务远程管理主机 SSH是建立在应用层和传输层基础上的安全协议,目的是要在非安全网络上提供安全的远程登录和其他安全网络服务. 通过SSH连接可以远程管理Linux等设备,默认linuxssh ...

  10. 一文搞懂V8引擎的垃圾回收

    引言 作为目前最流行的JavaScript引擎,V8引擎从出现的那一刻起便广泛受到人们的关注,我们知道,JavaScript可以高效地运行在浏览器和Nodejs这两大宿主环境中,也是因为背后有强大的V ...