嵌入式Linux的应用程序升级文件制作

嵌入式的OTA升级 浅谈 简介 OTA升级是嵌入式设备几乎都有的一项功能。对于简单的设备来说,例如单片机设备,OTA升级需要将新的固件刷写到FLASH上即可;对于高级一点的Linux设备来说,更加复杂,首先需要对ROM进行分区,再决定升级方式,是单备份升级还是双备份升级。 本文主要讲解嵌入式设备的OTA升级流程架构,虽然会涉及到一些实现细节,但是并不会事无巨细的讲解每一步操作。 ​ 升级的本质 所谓的升级,无非是使用新的程序替换旧的程序。 ​ 但是,就像一个人不借助镜子永远看不到自己的眼睛一样,程序也永远不能自己替换自己。因此,程序 阅读详情

简述

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

有的嵌入式系统的应用程序分区用的也是可读写的,那比较方便,把文件打包然后解压到对应的分区目录下替换即可。有的是应用分区做成只读,这样需要将应用程序打包做成flash镜像,下载到设备上更新到flash上。

不论是那种方式,对于应用程序来说都需要打包起来,可以是压缩包,也可以是镜像文件。这些文件在导入到系统进行升级的时候,我们都需要对这个文件做一些必要的验证,比如:版本号、版本标志、校验等;版本号一般用于显示提醒;版本标志是针对该型号设备的不同配置所做的标记(如几个串口、是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 <version no> <flag info>"
	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 0
Number of inodes 10
Number of files 4
Number of fragments 1
Number of symbolic links  2
Number of device nodes 0
Number of fifo nodes 0
Number of socket nodes 0
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] = {0};
    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);               //读取版本标识信息

个人微信公众号

微信公众号

ubuntu 软件包管理之二制作升级包 Deb 包(Debian 软件包)是一种用于在 Debian 及其衍生发行版(例如 Ubuntu)中分发和安装软件的标准包装格式。它们构成了 Debian Linux 发行版中的软件包管理系统的核心组成部分,旨在简化软件的分发、安装、更新和卸载流程。:我们将介绍 Deb 包的基本概念,包括其结构、元数据和工作原理。您将了解如何识别、查找和理解 Deb 包,以及它们在系统中的重要性。:我们将详细讨论如何创建自定义的 Deb 软件包。 阅读详情

相关推荐

嵌入式Linux系统在线升级策略:必备知识与实现方法

本文介绍了嵌入式Linux系统在线升级的两种常用方法:基于分区的在线升级方法和增量升级方法。基于分区的在线升级方法通过切换系统分区来实现升级,而增量升级方法则只升级发生变化的部分,以减少数据量和时间。基于分区的在线升级方法是将Linux系统划分为两个独立的分区,分别为当前运行的系统分区和升级后的系统分区。升级过程中,首先在升级后的系统分区中进行升级操作,然后切换系统引导到升级后的系统分区,最后再在当前系统分区中进行升级后的系统的验证和清理操作。这种方法可以减少升级的数据量和时间,提高升级效率。

Orion_O的博客 761

制作一个嵌入式Linux的应用程序升级文件

简述 嵌入式Linux系统一般是将应用程序与文件系统、内核、资源文件等放在不同的分区,产品量产后内核、文件系统这些一般不会升级,应用程序可能升级会比较多一些。 有的嵌入式系统的应用程序分区用的也是可读写的,那比较方便,把文件打包然后解压到对应的分区目录下替换即可。有的是应用分区做成只读,这样需要将应用程序打包做成flash镜像,下载到设备上更新到flash上。 不论是那种方式,对应应用程序来说都需要打包起来,可以是压缩包,也可以是镜像文件。这些文件在导入到系统进行升级的时候,我们都需要对这个文件做一些必要的

风声的专栏 1579

使用Updater Script自制Android升级包

然后进入设备的Recovery模式(请查阅设备制造商的说明来了解如何进入Recovery模式),选择"Install"或"Apply update"选项,并选择刚才复制的升级包进行安装。完成Updater Script脚本编写后,我们需要将脚本与升级包中的文件一起打包。在Android系统中,Updater Script是一种重要的脚本语言,用于创建自定义的升级包。该文件将包含升级包的安装脚本。在安装过程中,Updater Script将按照脚本中定义的操作执行相应的任务,完成升级包的安装。

AlianBlank的博客 569

制作简单的`linux`可执行bin包,做升级文件

制作简单的linux可执行bin包,做升级文件 简单是升级操作,可以通过tar -czPf 压缩包名 需要的文件……来将需要升级的文件打包,然后命令行解压升级。 我的思路是,有一个升级清单文件,是json格式,里面定义自己要升级的文件及要做的操作,例如: { "ui": "dist.zip", # 如果升级前端写dist.zip,否则为空 "middleware": [ # 列表中写入所有更新的文件,否则为空 "middleware/app/check/views.so", "middlew

贵有恒,何必三更眠五更起;最无益,只怕一日曝十日寒 1433

开关电源EMI滤波设计:如何通过Cx和Cy电容精准抑制共模与差模干扰?

本文深入解析了开关电源EMI滤波设计中Cx和Cy电容的核心作用。Cx电容并联于火线与零线之间,专用于抑制差模干扰;Cy电容连接于火线/零线与地之间,则负责泄放共模干扰。文章详细阐述了二者选型、安规要求及PCB布局要点,并提供了基于测试频谱的实战调优策略,是解决电源传导噪声问题的实用指南。

7z8x2c4v6b9的博客 466

DeepSeek-OCR又更新:一起看下OCR1和OCR2

DeepSeek-AI 最近又又开源了,这次是DeepSeek-OCR2,结合之前发布的DeepSeek-OCR ,可以发现DeepSeek走出了一条不同于主流 OCR 方案的技术路线。第一代模型探索了**“视觉作为文本压缩介质”的可行性,打破了传统的序列长度限制;第二代模型则通过“Visual Causal Flow(视觉因果流)”**架构,将因果推理引入视觉编码器,解决了复杂排版下的阅读顺序难题。本文将从架构设计、逻辑结构、训练范式及工程实现四个维度,深度剖析这两代模型的异同与创新。

kakaZhui的博客 623

嵌入式本地和远程升级程序的方法

关注+星标公众号,不错过精彩内容来源|优快云作者 |li_wen01嵌入式Linux设备要进行软件升级有很种多方式方法,总的来说可以分为本地升级和远程升级。本地升级包括升级工具升级,存储介质升级等,远程升级是指通过网络进行程序升级。这里介绍一种同时至此本地和远程升级的方法,以供参考。本地升级 (1)升级工具升级现在的升级工具有很多,不同的芯片支持不同的工具,比如j...

strongerHuang 4326

从零构建:用Arduino和MCP2515模块搭建你的第一个CAN Bus网络

本文详细介绍了如何使用Arduino和MCP2515模块从零搭建CAN Bus网络,实现温湿度数据的传输与显示。涵盖硬件连接、软件配置、发送端与接收端代码实现,以及系统调试和进阶应用,帮助初学者快速掌握CAN总线通信技术。

d6e7f8的博客 831

一种嵌入式Linux本地和远程升级程序的方法!

嵌入式Linux设备要进行软件升级有很种多方式方法,总的来说可以分为本地升级和远程升级。本地升级包括升级工具升级,存储介质升级等,远程升级是指通过网络进行程序升级。这里介绍一种同时至此本地和远程升级的方法,以供参考。本地升级(1)升级工具升级现在的升级工具有很多,不同的芯片支持不同的工具,比如jlink,串口等,海思的芯片提供Hitool升级工具。升级工具升级直接参考芯片...

2563

点云欧式聚类快速了解

一种基于欧氏距离度量的聚类算法基于KD-Tree的近邻查询算法是加速欧式聚类算法的重要预处理方法KD-Tree是由二分搜索树演变而来的用于大规模高维度数据查找场景当中的索引结构,主要用于最近邻查找和近似最近邻查找。将整个空间划分为二叉树的形式,方便有效找到最近邻点云处理算法库PCL,是比较重要的,在后续会继续学习,然后发出更优质的文章。

xiaobaiwsc的博客 1722

地球引擎初级教程:Python API 的安装和介绍

地球引擎的 Python API 提供了许多功能和工具,用于访问和处理地理空间数据。连接到地球引擎在编写地球引擎的 Python 脚本时,首先需要连接到地球引擎服务器。import ee # 初始化地球引擎 ee . Initialize()这将初始化地球引擎并建立与服务器的连接。加载和显示图像使用地球引擎的 Python API,您可以加载和显示卫星图像。import ee# 初始化地球引擎# 加载 Landsat 8 影像# 显示影像print('影像 URL:', url)

UePostscript的博客 1007

嵌入式Linux开发全流程解析:从Bootloader到应用部署实战指南

嵌入式系统开发是构建智能设备的核心技术,其原理在于为特定硬件平台定制精简、高效的操作系统。通过交叉编译技术,开发者能够在x86主机上生成ARM等架构的可执行代码,实现软硬件协同。这项技术的核心价值在于平衡性能、功耗与成本,为物联网、工业控制、消费电子等领域提供稳定可靠的软件基础。在应用场景中,嵌入式Linux系统通常由Bootloader引导程序、Linux内核和根文件系统三大组件构成,并通过NFS网络文件系统等工具实现高效开发调试。本文以嵌入式Linux开发为例,深入剖析了从环境搭建、系统构建到应用部署的

weixin_34401479的博客 514

《网络安全自学教程》- MySQL脱库原理和步骤

MySQL脱库,脱库的原理,怎么脱库,脱库的步骤,一库三表六字段

wangyuxiang946的博客 1万+

一种嵌入式linux本地和远程升级程序的方法

嵌入式linux设备要进行软件升级有很种多方式方法,总的来说可以分为本地升级和远程升级。本地升级包括升级工具升级,存储介质升级等,远程升级是指通过网络进行程序升级。这里介绍一种同时至此本地和远程升级的方法,以供参考。 本地升级: (1)升级工具升级 现在的升级工具有很多,不同的芯片支持不同的工具,比如jlink,串口等,海思的芯片提供Hitool升级工具。升级工具升级......

Biao 1万+

全面指南:PyTorch与ROCm版本兼容性及多版本环境管理

本文详细介绍了在AMD GPU上配置PyTorch开发环境的完整流程,重点解决版本兼容性和多版本ROCm环境管理问题。主要内容包括:1) PyTorch与ROCm版本对应关系查询;2) 四种查看ROCm版本的方法;3) 使用update-alternatives管理多版本ROCm;4) 环境变量配置与冲突解决方案;5) 完整的验证流程和性能测试方法。文章提供了最佳实践建议和故障排除清单,帮助开发者快速搭建稳定高效的深度学习开发环境,充分发挥AMD GPU硬件性能。通过系统化的验证流程确保各组件协同工作,解决

数字人生 606

借助AI高效写出结构严谨、内容专业的课题申报书:10大核心模块拆解(附实用提示词)

在很多老师和科研人员眼中,写一份高质量的课题申报,确实是一件非常困难的事。难就难在不只是要说清楚写了什么研究内容,还要体现申报书的可行性和创新性。七哥除了自己写课题,也经常指导会员同仁使用高级学术版搞定课题的申报工作,摸索出了一套行之有效的借助AI申报课题的技巧,在这篇文章中,我将给大家点明课题申报书的10大核心模块的写作技巧,还会给大家一些提示词模板供大家参考,如果你也正准备申报课题,那么这篇文章一定不要错过!特别说明的是,提示词的使用并不是一蹴而就的,是专业思考的延伸和AI化专业表达,过程中需要多次的调

智能AI让学术科研更容易 441

嵌入式Linux根文件系统制作

一个完整的嵌入式Linux系统,包含uboot,Linux内核,根文件系统三个部分。其启动顺序为,在系统刚一上电的时候,先执行uboot,由uboot引导内核,内核启动成功之后挂载根文件系统。根文件系统挂载成功以后,嵌入式Linux系统就启动成功了。在开发板上看到的现象是:用户可以在串口控制台上输入命令与Linux系统进行交互。可以将文件系统在字面上分为俩部分来理解,一部分是文件,一部分是系统。那文件系统是不是可以理解成是组织和管理文件的一个系统呢。

wei_Embedded_z的博客 1461

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

制作嵌入式Linux根文件系统

文章目录1. 获取BusyBox源码2. 解压源码并进入根目录3. 配置BusyBox3-1. 选择编译静态库3-2. 选择交叉编译工具链3-3. 选择安装目录3-4. 编译安装 1. 获取BusyBox源码   Busybox的官方源码下载路径为:https://busybox.net/downloads/。   目前最新版本为busybox-1.29.3.tar.bz2。 2. 解压源码并进入...

zhangyzh656的博客 9012

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

嵌入式Linux系统镜像制作(基于SD卡)

嵌入式Linux在开发过程中对于软件方面通常是 bootloader、linux kernel、rootfs、applications 分开进行处理的,但到了生产阶段这样就不方便了。比较常见的做法是将所有内容整合到一起制作成系统镜像,这样在生产的时候只要烧录系统进行即可。这篇文件将介绍基于SD卡的系统镜像制作方法。......

Naisu的各种笔记 8062

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

嵌入式Linux系统-升级包中的脚本

脚本在Linux系统中具有很大的作用,在嵌入式Linux系统里,同样具有很大的作用,前面写过启动预留脚本、U盘自动运行脚本,今天介绍的是升级包中的脚本。 设计一个嵌入式Linux升级包 嵌入式Linux系统的升级包,可以升级内核、文件系统、应用程序、配置文件、资源文件等等,所以在设计升级包时,一定要考虑到可以升级多种文件载体,而不是只针对一种文件的升级。 记得刚毕业工作的时候,产品做升级功能,刚开始做了内核、文件系统、应用程序的升级包,后来由于客户需要,需要远程升级资源文件,然后就在升级类型中又加了一种.

风声的专栏 1222

嵌入式linux-根文件系统制作

如嵌入式Linux文件系统中通常不会放置内核源码,因而存的 常不会放置内核源码,因而存的 常不会放置内核源码,因而存放源码的 /usr/src目录是不必要的, 甚至连头文件也不需要,即/usr/include目录也不必要;这里只是拷贝动态链接库。要构建一个可用的Linux根文件系统,需要的二进制和库都不少,完全从零开始也是不现实的,推荐参考其它现有可用的文件系统,在原基础上按需修改;,目录里都是二进制命令工具,这还不足以构成 一个可用的根文件系统,必须进行其它完善工作,才能构建一个可用的根文件系统。

yinzhongzhang的博客 1143

linux嵌入式在线升级,一种嵌入式固件在线升级方法与流程

本发明涉及计算机嵌入式软件领域,特别涉及一种嵌入式固件在线升级方法。背景技术::传统的嵌入式终端设备,由于资源和环境条件的限制,在生产阶段就需要将软件代码固化,设备出厂后是无法在现场在线修改的。一旦出现升级需求,要么是设备返厂维修,要么是在现场拆机更换部件板或替换程序存储芯片。为了能够满足客户持续变化的需求,延长产品的生命周期,需要不断完善嵌入式终端设备功能,在线升级能力显得非常重要。常见的升级方...

weixin_36373787的博客 1293

arm linux升级程序,嵌入式Linux固件升级

嵌入式Linux固件升级开发需求·基于TCP/IP完成驱动模块和应用程序的更新、升级特殊声明该文档中驱动程序和应用程序统称为“固件”。·主机:VMWare--Fedora 9·开发板:yc2440--64MB Nandflash;Kernel:2.6.24.4·编译器:arm-linux-gcc-4.0.0设计原理图说明:·开发板启动FileServer应用程序,作为TCP/IP的...

weixin_34226837的博客 1047

嵌入式linux应用的制作与固件烧录的概述

一、在ARM linux 下,一般而言,产品在启动的过程中应该加载模块,最简单的方法是修改启动过程的rc脚本(/etc/init.d/rcS),增加ismod /../xxx.ko这个命令。 例如:加载/lib/modules/2.6.26.5/s3c2410_buttons) cd /lib/modules/2.6.26.5 insmod s3c2410_buttons mknod /dev/matrix_button c 232 0 其中最后一行表示的意思是在ARM系统中建立设备文件,其主设备...

卤煮小鱼的博客 1786

远程升级嵌入式开发板的固件和应用程序

嵌入式Linux固件升级 2018年03月26日 10:41:11 青竹雨仙 阅读数:718 嵌入式Linux固件升级 开发需求 • 基于TCP/IP完成驱动模块和应用程序的更新、升级 特殊声明 该文档中驱动程序和应用程序统称为“固件”。 • 主 机:VMWare–Fedora 9 • 开发板:yc2440–64MB Nandflash;Kernel:2.6.24.4 • 编译器:arm-lin...

3536
上一篇: tcp端口转发工具
下一篇: ffmpeg从摄像机抓拍一张图片
fensnote
博客等级 码龄7年 11粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值