一種分片更新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

相關文章
相關標籤/搜索