加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

制作一個(gè)嵌入式Linux應(yīng)用升級文件

2021/09/26
676
閱讀需 10 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

嵌入式Linux升級

嵌入式Linux系統(tǒng)一般是將應(yīng)用程序與文件系統(tǒng)、內(nèi)核、資源文件等放在不同的分區(qū),方便后期升級。產(chǎn)品量產(chǎn)后內(nèi)核、文件系統(tǒng)這些一般不會(huì)升級,應(yīng)用程序可能升級會(huì)比較多一些。

應(yīng)用程序可以是壓縮包,也可以是鏡像文件。這些文件需要加入一些必要的信息,比如:版本號、版本標(biāo)志、校驗(yàn)等;

版本號一般用于顯示提醒;

版本標(biāo)志是針對該型號設(shè)備的不同配置所做的標(biāo)記(如幾個(gè)串口、是4G版還是以太網(wǎng)版等);

文件校驗(yàn)是對文件的合法性進(jìn)行檢查,以免文件錯(cuò)誤導(dǎo)致升級后程序無法啟動(dòng)。

這里主要就是介紹一種將上述信息寫入到升級文件里的一種方法。

升級文件的版本信息、標(biāo)識(shí)、校驗(yàn)添加

這里介紹一種簡單的方式,將信息寫入到升級文件里,驗(yàn)證的時(shí)候再從文件里去取。需要注意的是升級文件一定要小于分區(qū)大小。

下面的制作過程是在虛擬機(jī)Ubuntu系統(tǒng)下面進(jìn)行的,以制作squashfs格式鏡像為例。將版本信息、標(biāo)志以及校驗(yàn)碼都追加在文件的最后。

可以直接用echo命令將這些信息追加在文件的最后,校驗(yàn)碼可以用C寫的一個(gè)小工具添加(參見《給文件加Crc校驗(yàn)》)。

追加版本信息與標(biāo)識(shí)信息的命令如下:

 #注意這里要用">>",而不是">",用">>"是追加,用">"是清空文件重新寫入。
 echo "V1.0.1" >> app.img
 echo "F-P4-4G" >> app.img

示例測試

下面是我測試的一個(gè)制作升級文件的目錄,目錄文件結(jié)構(gòu)如下:

 $ls
 app bin package.sh

app 是應(yīng)用程序的目錄

bin 制作完成的升級文件存放目錄 

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

package.sh腳本內(nèi)容如下:

 #!/bin/sh
 
 if [ $# -ne 2 ]
 then 
  echo "Usage: package.sh <version no> <flag info>"
  exit
 fi
 
 VNum=$1  #版本信息
 Flag=$2  #版本標(biāo)識(shí)信息
 installDir=./bin  #升級文件存儲(chǔ)目錄
 tmpName="app"     
 rootDir="app"     #要打包的應(yīng)用程序目錄
 #***************************************************
 
 Ver=`date '+%Y%m%d'`   #取時(shí)間作為版本信息的一部分
 
 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 #追加標(biāo)識(shí)信息
 addCrc16 $imgName    #校驗(yàn)文件,并把校驗(yàn)碼加入升級文件,addCrc16是c語言寫的一個(gè)給文件添加校驗(yàn)的程序
 rm $imgName   #刪除臨時(shí)文件
 mv $imgName.crc16 $installDir/$imgName 
 
 echo "mkfs ok: $installDir/$imgName"

執(zhí)行該腳本制作文件:

 $./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來查看一下文件,這里只截取最后的一部分看下我們添加的信息。如上下圖,三部分信息已標(biāo)出,在做文件信息的檢測時(shí),就可以讀取文件中的這些信息進(jìn)行判斷處理了。

附C語言讀取文件信息的主要代碼:

 char readBuf[128] = {0};
 FILE *fp = fopen("app.img", "r");
 
 //偏移到版本號開始的位置。
 int ret = fseek(fp,-10L,SEEK_END);
 //讀取版本號
 fread(buf,16,1,fp);               
 
 //偏移到版本標(biāo)識(shí)信息的位置
 ret = fseek(fp,-10L,SEEK_END);  
 //讀取版本標(biāo)識(shí)信息
 fread(buf,16,1,fp);              

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

專注嵌入式Linux應(yīng)用開發(fā),C/C++技術(shù)交流;Qt編程技術(shù)交流。