OpenRT固件更新流程
????? 本文檔適用於分析OpenRT核心網路由器相關問題的技術人員。
?
2 固件更新需求
????? OpenRT系統包含系統鏡像、配置文件、Web頁面、內核模塊、業務APP等多個組件。系統更新操作可能涉及多個部分,需要對多個組件進行更新。這對OpenRT的維護人員提出了很高的要求,增加了維護成本。因此需要設計一套方便簡潔的系統固件升級流程,簡化OpenRT的維護流程,減低使用門檻,提高OpenRT核心網路由系統的競爭力。
?
3 固件更新方案
3.1 基本思路
????? 由於OpenRT系統包含多個組件,因此將所有最新組件打包,以單個文件形式通過Web頁面傳輸到系統後臺。解包後再執行包中對應的腳本進行各組件的替換,以實現OpenRT系統整體更新的目的。
?
3.2 Web文件傳輸
????? OpenRT使用goAhead作為Web服務器,goAhead本身具備文件傳輸功能。其中前端設計需要在表單中添加一個type屬性為file的input,即可實現傳輸更新固件包至後臺的功能。
?
3.3 固件包更新流程
????? 固件更新包是一個tar.gz包,包含OpenRT各組件的最新版本和一個更新腳本update.sh。OpenRT後臺成功獲取到固件更新包後會創建更新標誌文件updating.flg,表明已獲取新版本需要及時更新。解壓此包後通過執行update.sh替換系統內部各組件並重啟,實現系統整體更新,詳細流程如圖 3.1所示。
更新包處理流程可能因為系統斷電等意外情況中斷,導致系統更新出現錯誤。因此需要在每次開機時進行更新檢測,主要檢測是否存在更新標誌文件updating.flg。若發現存在此文件表示上次更新操作意外中斷,這時需重新執行update.sh,完成更新流程。詳細流程如圖 3.2所示。
3.4 更新腳本示例
????? OpenRT涉及功能眾多,每次更新內容千差萬別。可能涉及新的組件,需要添加新的目錄結構。也可能涉及新的配置文件等。因此需要根據每次更新的具體內容設計更新腳本update.sh,腳本的基本功能就是替換、添加、刪除OpenRT文件系統中的各組件,示例如程序清單 3.1所示。
???????????????????????????????????????????????????????????????? 程序清單 3.1 update.sh示例
echo "updating firmware ..." # # dhcpserver # rm /etc/dhcpdconfig.ini cp ./dhcpserver/dhcpdconfig.ini /etc rm_tool -r /var/dhcplease mkdir /var/dhcplease cp ./dhcpserver/dhcpd.leases /var/dhcplease rm_tool -r /apps/dhcpserver mkdir /apps/dhcpserver cp ./dhcpserver/dhcpserver /apps/dhcpserver # # goahead # rm_tool -r /apps/goahead mkdir /apps/goahead cp ./goahead/route.txt /apps/goahead cp ./goahead/goahead /apps/goahead cp ./goahead/gopass /apps/goahead cp ./goahead/webcomp /apps/goahead cp ./goahead/auth.txt /apps/goahead rm /lib/libgoahead.so cp ./goahead/libgoahead.so /lib # # OpenRTCfgTool # rm_tool -r /apps/OpenRTCfgTool/OpenRTCfgTool mkdir /apps/OpenRTCfgTool cp ./OpenRTCfgTool/OpenRTCfgTool /apps/OpenRTCfgTool # # libcomm # rm /lib/libcomm.so cp ./libcomm/libcomm.so /lib # # libnethandle # rm /lib/libnethandle.so cp ./libnethandle/libnethandle.so /lib # # tmstat # rm /lib/modules/trafficStats.ko cp ./tmstat/trafficStats.ko /lib/modules # # web # untar ./web.tar.gz /apps/goahead # # startup # rm /etc/startup.sh cp ./startup.sh /etc/ # # bsp # rm /boot/grldr rm /boot/menu.lst rm /boot/OpenRT-bsp.elf cp ./bsp/grldr /boot cp ./bsp/menu.lst /boot cp ./bsp/OpenRT-bsp.elf /boot echo "update finish."
OpenRT固件更新流程