首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何制作一个嵌入式Linux应用升级文件

嵌入式Linux升级

嵌入式Linux系统一般是将应用程序文件系统、内核、资源文件等放在不同的分区,方便后期升级。产品量产后内核、文件系统这些一般不会升级,应用程序可能升级会比较多一些。

应用程序可以是压缩包,也可以是镜像文件。这些文件需要加入一些必要的信息,比如:版本号、版本标志、校验等;

版本号一般用于显示提醒;

版本标志是针对该型号设备的不同配置所做的标记(如几个串口、是4G版还是以太网版等);

文件校验是对文件的合法性进行检查,以免文件错误导致升级后程序无法启动。

这里主要就是介绍一种将上述信息写入到升级文件里的一种方法。

升级文件的版本信息、标识、校验添加

这里介绍一种简单的方式,将信息写入到升级文件里,验证的时候再从文件里去取。需要注意的是升级文件一定要小于分区大小。

下面的制作过程是在虚拟机Ubuntu系统下面进行的,以制作squashfs格式镜像为例。将版本信息、标志以及校验码都追加在文件的最后。

可以直接用echo命令将这些信息追加在文件的最后,校验码可以用C写的一个小工具添加(参见《给文件加Crc校验》)。

追加版本信息与标识信息的命令如下:

#注意这里要用">>",而不是">",用">>"是追加,用">"是清空文件重新写入。

echo "V1.0.1" >> app.img

echo "F-P4-4G" >> app.img

示例测试

下面是我测试的一个制作升级文件的目录,目录文件结构如下:

$ls

app bin package.sh

app 是应用程序的目录

bin 制作完成的升级文件存放目录

package.sh 打包制作脚本,用于生成镜像文件

package.sh脚本内容如下:

#!/bin/sh

if [ $# -ne 2 ]

then

echo "Usage: package.sh "

exit

fi

VNum=$1  #版本信息

Flag=$2  #版本标识信息

installDir=./bin  #升级文件存储目录

tmpName="app"  

rootDir="app"     #要打包的应用程序目录

#***************************************************

Ver=`date '+%Y%m%d'`   #取时间作为版本信息的一部分

echo "start make app img..."

echo $Ver> $rootDir/version

echo $VNum >> $rootDir/version

imgName="test_app-$Ver-V$VNum.img"

echo "app version: $Ver, version num: V$VNum"

echo "make squashfs img ..."

mksquashfs $rootDir $imgName -b 64K -comp xz

echo "package app img ok! "

echo "V$Ver $VNum" >> $imgName   #追加版本信息

echo "F$Flag" >> $imgName #追加标识信息

addCrc16 $imgName    #校验文件,并把校验码加入升级文件,addCrc16是c语言写的一个给文件添加校验的程序

rm $imgName   #删除临时文件

mv $imgName.crc16 $installDir/$imgName

echo "mkfs ok: $installDir/$imgName"

执行该脚本制作文件:

$./package.sh 1.0.1 -P2-4G

start make rootfs...

app version: 20210924, version num: V1.0.1

make squashfs img ...

Parallel mksquashfs: Using 4 processors

Creating 4.0 filesystem on test_app-20210924-V1.0.1.img, block size 65536.

[===================================/] 33/33 100%

Exportable Squashfs 4.0 filesystem, xz compressed, data block size 65536

compressed data, compressed metadata, compressed fragments, compressed xattrs

duplicates are removed

Filesystem size 621.31 Kbytes (0.61 Mbytes)

32.52% of uncompressed filesystem size (1910.41 Kbytes)

Inode table size 302 bytes (0.29 Kbytes)

64.81% of uncompressed inode table size (466 bytes)

Directory table size 155 bytes (0.15 Kbytes)

100.00% of uncompressed directory table size (155 bytes)

Number of duplicate files found

Number of inodes 10

Number of files 4

Number of fragments 1

Number of symbolic links  2

Number of device nodes

Number of fifo nodes

Number of socket nodes

Number of directories 4

Number of ids (unique uids + gids) 1

Number of uids 1

fens (1000)

Number of gids 1

fens (1000)

make suqashfs img ok!

file size = 639000

file crc16 = 0x001d

add crc16 ok!

mkfs ok: ./bin/test_app-20210924-V1.0.1.img

看下文件里添加的信息

文件生成后,让我们来看下升级文件里我们添加的信息。

可以用Uedit来查看一下文件,这里只截取最后的一部分看下我们添加的信息。如上下图,三部分信息已标出,在做文件信息的检测时,就可以读取文件中的这些信息进行判断处理了。

附C语言读取文件信息的主要代码:

char readBuf[128] = {};

FILE *fp = fopen("app.img", "r");

//偏移到版本号开始的位置。

int ret = fseek(fp,-10L,SEEK_END);

//读取版本号

fread(buf,16,1,fp);            

//偏移到版本标识信息的位置

ret = fseek(fp,-10L,SEEK_END);

//读取版本标识信息

fread(buf,16,1,fp);            

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20210930A02O8M00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券