嵌入式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

【生成C01/C10材料常数excel表】

计算橡胶件的邵尔硬度和C01/C10材料常数

weixin_46153372的博客 1932

2025-08-19利用opencv检测图片中文字及图片的坐标

该代码实现了图片中中文文本的检测与位置计算功能。主要使用CnOcr库进行OCR识别,结合OpenCV和PIL库处理图像。功能包括:1)检测图片中的中文文本及位置坐标;2)计算每个文本的像素宽度和高度;3)在原图上绘制文本边界框并标注识别结果。代码通过put_chinese_text函数解决中文显示问题,最终输出各文本内容、坐标位置及尺寸信息。适用于需要获取图片中文字精确位置的应用场景。

m0_58149406的博客 394

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

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

strongerHuang 4326

Dify 从入门到熟悉100 天的学习大纲

理解 Dify 的核心概念,熟悉操作界面,并能创建简单的 AI 应用。祝你在这 100 天的旅程中学有所成,成为一名优秀的 AI 应用开发者!掌握生产环境部署、监控、调优,并关注 Dify 生态和前沿动态。探索多模态、Agent、API 集成、性能优化等高级主题。掌握工作流编排、高级提示词技巧、知识库优化等核心功能。

IT深耕十余载,大道之简 1735

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

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

2563

Gamma变换算法之Matlab&FPGA实现

Gamma映射原理 什么是Gamma曲线 人眼的感光与光强并不是呈线性关系的,而是呈非线性关系(指数型关系,如下图左-曲线。在低照度下,人眼更容易分辨出亮度的变化,随着照度的增加,人眼不易分辨出亮度的变化。而图像传感器与输入光强呈线性关系(如下图左-直线)。从图中可见,当传感器感光在20%左右时,人眼感光响应达到了50%,人眼对低照度的变化更为敏感。从下图右侧可见,Reference Tone为人眼感光50%的亮度,而传感器在感光50%时则相对暗的多(见Select,近似中性灰)。这种将原始图像通过映射操

CrazyBingo的博客 7405

MAX30102心率血氧传感器:从原理到实践的可穿戴健康监测方案

本文深入解析MAX30102心率血氧传感器的工作原理及在可穿戴健康监测中的实践应用。通过反射式光电容积脉搏波(PPG)技术,该传感器能精准测量心率和血氧饱和度,具备低功耗、高抗干扰等优势。文章详细介绍了信号处理算法、硬件连接技巧及创新应用场景,为开发者提供全面的解决方案。

weixin_29184371的博客 282

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

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

weixin_34401479的博客 514

ICC2 实战秘籍:create_workspace 命令全解析

必选项:工作区名称,这可是创建工作区的 “身份证”,必不可少。技术数据选项匹配:优先考虑用 -technology 直接加载技术文件,这是获取最新、最准确技术数据的首选路径;要是已经有合适的技术库了,那 -use_technology_lib 引用现有技术库也能快速上手。精度设置优先规则:技术文件自动配置排在第一位,能自动适配就别手动操心;要是自动配置不理想,那就显式指定 scale_factor;实在没要求,就用默认配置,但得清楚它的精度限制。

weixin_50820814的博客 1124

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

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

Biao 1万+

版电力系统故障录波_故障录波识图与典型故障波形分析

1、设置故障录波的目的故障录波装置是对电力系统运行状况进行监控的一种自动化设备。系统正常运行时,录波装置不启动录波,当系统发生故障时,通过启动录波装置迅速启动录波器录波,直接记录反应故障装置安装处系统故障的电气量。2、故障录波的作用(1)正确评价继电保护和自动装置的工作。(2)正确分析事故的原因并研究防止对侧。(3)发现继电保护和自动装置缺陷。(4)发现一次设备缺陷,及时消除隐患。(5)帮助寻找故...

weixin_42495661的博客 1万+

UCIE Specification详解(三)

Protocol Layer(协议层)以及Die-to-Die Adapter

Crazzy_M的博客 1759

嵌入式Linux根文件系统制作

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

wei_Embedded_z的博客 1461

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

制作嵌入式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

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

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

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

Naisu的各种笔记 8062

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

嵌入式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、付费专栏及课程。

余额充值