当前位置: 首页 > 科技观察

嵌入式Linux系统在线升级攻略

时间:2023-03-15 18:30:48 科技观察

由于市面上的嵌入式设备大多分散、数量多、部署位置复杂,对这些设备实施单独、局部升级非常费时费力。针对这种情况,本文提出了一种基于Linux系统的嵌入式设备在线、远程、批量升级的策略。设备状态和升级过程通过网页可视化,大大提高了升级效率。嵌入式Linux系统在线升级攻略对于运行Linux系统的嵌入式产品,很多时候我们会在当前版本的内核、驱动或者应用程序中发现bug并进行修复,或者开发出功能更强大、性能更突出的软件。替换升级当前运行设备上的相应程序。很多人的做法是通过为每个设备编写新版本的软件来更新软件版本。如果产品数量少,配送地点比较集中,这种方案有一定的效果。但是当设备数量多、位置分散时,这种本地编程升级的方式会变得非常难操作,升级结果也很难可视化,需要通过串口等终端来确认.对于使用Linux系统且具备上网功能的嵌入式设备,无论接入方式是有线网络、wifi、2G还是4G,本文将提供一种通过服务器后台监控全部或部分上网设备的方法。一种高效、可靠、直观的远程批量升级策略。升级内容可以是内核、驱动程序、文件系统、应用程序或一些配置文件。接下来,首先展示解决方案的架构图,然后逐步描述每个功能或逻辑模块的细节。方案概述本升级方案由三部分组成:后台服务器程序、网页、终端升级程序。升级方案架构图如图1所示。图1升级方案架构图服务器程序服务器程序用于监控终端设备状态,管理升级包,控制升级过程,提供Web端响应和数据库访问。本政策中服务器为apache-tomcat,程序使用javaservlet,数据库为MySQL,网页为JSP编写。您可以使用任何后台语言(如php、python等)来实现本文所描述的服务端功能。服务器功能包括:终端消息处理升级包管理升级命令处理终端消息处理服务器程序通过getParameter("version")获取终端软件版本号,通过queryLatestVersion()查询数据库中最新的软件版本号,然后发送两个进行比较。如果相同,则证明终端设备的软件版本已经是***,返回最新的指令;如果不同,服务器没有收到web用户的升级指令,则通过queryAddress()从数据库中查询最新的升级包地址,返回给终端,以便终端设备从这里下载升级包地址。另外,如果此时用户在web界面执行升级命令,则会将更新命令返回给终端,终端设备执行升级操作。有关详细信息,请参见清单1。清单1.终端消息处理代码片段();if(version.equals(version_latest)){msg="|latest|null|null|";}elseif(UpdateServlet.update_status){msg="|update|"+version_latest+"|null|";UpdateServlet。update_status=false;}else{address_latest=queryAddress();msg="|download|172.x.x.x"+address_latest+"|"+MD5+"|";}out.print(msg);out.flush();输出。close();}升级包管理服务器程序处理从web上传的升级包,首先确认存放升级包的路径是否存在,如果不存在则创建,收到升级包后截取版本号从升级包文件名,然后是文件名、版本号、存放路径信息服务器上的升级包插入到数据库中。同理,服务端程序也响应Web端用户对升级包的修改、删除等操作。详细的升级包管理请见清单2。清单2.升级包管理代码段protectedvoiddoPost(HttpServletRequestrequest,\HttpServletResponseresponse)throwsServletException,IOException{StringuploadPath="/xx/xx";FileuploadDir=newFile(uploadPath);if(!uploadDir()m.exists.){uploadDir().exists.){uploadDir();}try{ListformItems=upload.parseRequest(request);if(formItems!=null&&formItems.size()>0){for(FileItemitem:formItems){if(!item.isFormField()){StringfileName=newFile(item.getName()).getName();Patternp=Pattern.compile("update_package-(.*?).tar.gz");Matcherm=p.matcher(fileName);while(m.find()){version=m.group(1);}StringfilePath=uploadPath+File.separator+fileName;sql="INSERTINTOpackage(name,version,address)\VALUES('"+fileName+"','"+version+"','"+filePath+"');";dbOperate(sql);FilestoreFile=newFile(filePath);item.write(storeFile);request.setAttribute("message",\"PackageHasbeeduploadedsuccessfully!");}}}}catch(Exceptionex){要求est.setAttribute("message","errorinfo:"+ex.getMessage());}}升级命令处理如果用户选择从web升级设备并点击升级按钮,服务器程序将记录该命令,而现在当从终端设备接收到POST消息时,它会向指定的终端发出更新命令。终端收到更新指令后,会执行升级程序。升级完成后,终端会再次定时上报版本号。通过web端的设备列表,您可以查看所有设备的升级结果,将升级过程和结果可视化。终端升级程序终端升级程序由两部分组成:升级管理程序和升级执行程序。本文所述升级策略的前提是构建合理的磁盘和Flash分区,以支持本策略中各种程序的正常运行。终端磁盘分区示例图2.终端设备磁盘分区图图2是此策略的基本闪存分区示例。Flash总容量为128M。第一个分区为boot分区,用于存放启动Linux系统的引导程序,容量为2M;第二个分区为Linux内核分区,用于存放Linux内核镜像文件,容量为8M;三个分区为根文件系统分区,用于存放根文件系统镜像文件,作为用户运行时的操作空间,容量为100M;第四个是备份分区,用于存放需要备份的内容,以便升级完成后复制到新的文件系统中,容量为16M;最后一个是固化信息分区,用于存储设备软件版本号、设备类型、设备id等信息,容量为2M。分区信息仅供参考,分区数量和大小需要根据具体项目进行修改。当然,如果项目没有特殊性,硬件资源与本例相匹配,也可以直接使用这种分区方案。升级管理程序升级管理程序的功能如下:管理软件版本信息POST设备信息到服务器从服务器下载升级包验证、管理升级包启动升级执行程序升级管理程序随系统启动启动并作为守护进程运行。首次运行时,从宏定义中读取软件版本号并固化到info分区中,每隔一段时间从info分区中读取设备类型、设备id、软件版本号。并通过HTTPPOST将此信息发送到服务器。服务器收到设备信息后,解析出软件版本号,与数据库中最新的升级包版本号进行比对。如果升级包的版本号高于设备的版本号,则将下载命令、升级包地址和升级包的MD5码返回给终端设备。表1.终端设备信息消息格式表2.服务器返回消息格式表1和表2分别给出了终端设备发送和服务器返回的消息格式和内容。升级管理程序接收到服务器返回的消息并进行解析,根据不同的指令做出如下响应:如果是download指令,则根据提供的地址下载相应的升级包到终端设备本地的tmp目录下参数1,下载完成后,将升级包的MD5码与参数2中的MD5码进行比对,完成升级包校验。如果是update命令,比较参数1中的版本号和本地tmp目录下升级包的版本号,相同则启动升级执行程序进行升级。如果命令是最新的,则证明当前终端设备的软件版本与服务器中最新升级包的版本相同,已经是最新版本,忽略。升级执行程序的功能如下:解压升级包备份文件格式化内核、文件系统分区将升级包中的文件加载到内核,在文件系统分区上重启操作系统将备份文件复制到升级执行程序升级时的文件系统程序启动后,首先解压升级包,验证检测。如果检测通过,将备份用户文件。需要注意的是,备份分区挂载在文件系统根目录的备份文件夹中,所以备份的方法是将需要备份的文件复制到备份文件夹中,并记录其原路径。接下来就是格式化内核和文件系统分区,然后将升级包中新版本的内核镜像和文件系统镜像写入内核和根文件系统分区,完成新旧替换。然后自动重启操作系统,启动成功后将备份文件复制到对应的文件系统路径下。此时终端设备已经升级,运行新版本的系统和软件。如果升级内容只是一个应用程序或一个配置文件,只需要替换相应的文件即可。设备与服务器交互终端设备通过HTTP协议与服务器进行交互。终端程序每10秒通过HTTPPOST向服务器发送设备信息,服务器根据版本号比较结果和web端升级命令的状态向终端设备返回三个不同的命令。终端通过解析命令做出相应的响应。下载功能调用libcurl库,具有断点续传功能。10秒的请求频率可以根据具体项目应用场景进行调整。如果终端数量比较少,服务器可以承受连接压力,又想更快、更及时的响应,可以考虑将HTTP改为socket长连接的通信方式。Web端Web端提供人机界面供用户进行升级操作,显示、接收、跟踪整个升级过程。用JSP编写。其功能如下:显示设备状态。显示设备在线、离线状态、设备类型、设备ID、软件版本号。升级包管理。显示所有升级包,修改和删除已有的升级包。上传新的升级包。升级运营管理。用户可以从设备列表中选择多台或全部设备,点击升级按钮生成升级说明。总结本文提供了一种远程在线批量升级嵌入式Linux设备的策略。升级内容包括内核、驱动、文件系统、应用程序、配置文件等,可以快速、稳定地完成升级操作。描述服务端程序、终端设备升级程序、Web端功能、设备与服务端交互方式,完整展示升级过程细节,供开发者参考。需要说明的是,在该策略的执行过程中,需要保证升级设备有足够的电量,以保证升级过程的顺利执行。该策略仅提供功能描述。为了保证可靠性和适应更复杂的环境,开发者需要增加双分区开机备份机制。另外,由于升级包存放在tmp目录下,支持的升级包大小受限于物理内存空间。开发者可以将升级包存放在指定的磁盘分区来优化该功能。