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. 初探SpringMVC,走进SpringMVC的世界

    1.Springmvc入门 1.1.Springmvc是什么 SpringMVC是Spring中的一个组件,目前(2019)在互联网公司用的很多,是必需学习的一门框架技术!SpringMVC用于web ...

  2. HTML、CSS基础知识

    前端基础 1. CSS 8 1.1. CSS叫做层叠样式表,用来设置页面中元素的样式.背景颜色.字体颜色.字体大小... 8 1.2. CSS负责结构.表现.行为中的表现 8 1.3. 编写的位置 8 ...

  3. EasyCode实现数据库到Swagger全自动化

    简介 EasyCode是基于IntelliJ IDEA开发的代码生成插件,通过自定义生成模板可以完成定制化的 Mapper Service Controller 生成,结合数据库 Comment还可以 ...

  4. PHP基于Redis实现轻量级延迟队列

    延迟队列,顾名思义它是一种带有延迟功能的消息队列. 那么,是在什么场景下我才需要这样的队列呢? 一.背景 先看看一下业务场景: 1.会员过期前3天发送召回通知 2.订单支付成功后,5分钟后检测下游环节 ...

  5. Eclipse中查看JAVA源代码显示SOURCE NOT FOUND解决办法

    Problem:Java利用快捷键查看源代码显示Source not found 出现问题的原因:JDK目录下缺失src.zip文件只有javafx-src.zip src.zip文件:Java所有类 ...

  6. C# VS2019 WebService创建与发布,并部署到Windows Server 2012R

    前言 上一次数据库灾备和性能优化后,数据库专家建议,在不扩容的情况下,客户端不能再频繁的扫描数据库了!一句惊醒梦中人,因为我也发现数据库越来越卡了,自从上个项目上线后,就出现了这个情况.后来分析其原因 ...

  7. 微信浏览器跳转浏览器下载app解决方案

    新版本微信浏览器中,已禁用下载APP应用,只支持打开微信合作商APP下载,所以无法通过微信浏览器直接下载APP应用.列举微信浏览器下载APP的种解决方案: 方案:通过Url 跳转到手机默认浏览器,或者 ...

  8. Linux查看系统基本信息、版本信息等

    Linux下如何查看版本信息, 包括位数.版本信息以及CPU内核信息.CPU具体型号 1.uname -a   (Linux查看版本当前操作系统内核信息) 2.cat /proc/version (L ...

  9. css4——浮动

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  10. 用workspace管理工程,并解决多静态库依赖

    from:http://www.cnblogs.com/perryxiong/p/3759818.html   最近我在项目中遇到一些工程之间的管理问题. 模型: 其中 库A 是一个公共的基础静态库, ...