嵌入式Linux的OTA更新,現有更新系統的比較
時間:2020-05-07 來源:原創
在基本原理和實現文章中,我們討論了嵌入式Linux更新系統的基礎和實現。在這里,我們討論了一些現成的開源更新系統,這些系統現在可以與您的Embedded Linux項目集成。
此更新系統非常專業,可以立即使用。它使用的雙rootfs更新系統與上一篇文章中描述的系統非常相似。它與U-Boot緊密集成,以便在非引導映像的情況下進行回退。
Mender入門非常容易,因為關于如何設置和集成各種組件的良好分步文檔非常清晰。它們在Raspberry Pi和BeagleBone Black等流行平臺上提供參考實現,它們可以使您了解使其在平臺上工作所需的工作量。
我發現整合和工作大約花了三天時間。為了使其與我的Yocto構建設置(基于Morty)一起使用,進行了許多小的更改。它需要一些OpenEmbedded專業知識來解決這些問題。需要U-Boot專業知識才能正確集成雙啟動機制。
最后,它輸出一個“ sdimg”,其中包含引導加載程序和文件系統,需要以某種方式將其寫入閃存。如何執行此操作取決于您的目標硬件。它還輸出所謂的“工件”,其中包含新的文件系統映像和各種元數據。
可以通過Mender命令行工具進行人工安裝,以進行手動安裝(理論上可以從USB記憶棒擴展到自動安裝)。工件也可以通過Web界面上傳到后端更新Web服務上,并可以從此處下推到各個單元。
控制后端更新服務器的Web界面設計合理,易于使用。設置是通過Docker完成的,這使得初始設置非常簡單。完整的生產就緒系統將需要Docker專業知識。在此Web界面中,您可以在該字段中查看所有當前已部署的設備,并分別或按組向其推送更新。

圖1:Mender包含一個定制的Web界面,用于將更新推送到設備
Mender的大多數都是用Go編程語言編寫的。Go的一些專業知識對于長期采用和生產發布將是必需的。盡管在嵌入式世界中這仍然是一種罕見的語言,但在將來它可能會變得越來越廣泛。
您被綁定到單個硬編碼的引導設備(例如:/ dev / mmcblk0),因此沒有直接的方法允許從多種介質引導。它還對您的系統做出了許多假設,例如引導程序和內核中的各種選項(例如:包括對某些文件系統的支持)。至關重要的是,它要求使用systemd,這可能使其不適用于某些項目。
更新
此更新系統是高度可配置的。您可以使用大多數嵌入式Linux開發人員都熟悉的“ kconfig”系統對其進行配置。有關配置選項的一些示例:它支持多個引導加載程序(U-Boot,GRUB,EFI Boot Guard);它可以根據給定的公鑰對簽名的圖像進行簽名和驗證;它可以支持使用對稱密鑰加密的圖像加密。

圖2:SWUpdate的配置系統
每次更新都包含一個CPIO存檔,其中包含以“ sw-description”文件和執行該更新所需的實際數據文件形式的元數據。通常將包含文件系統列表以及應將文件系統放置在哪些塊設備中。更新文件必須由用戶手動創建。它不會脫離構建系統。
與Mender不同,SWUpdate不會介入并處理有關如何設置系統的詳細信息。Mender將為您修補u-boot環境,SWUpdate將需要您自己制定“乒乓” AB雙重rootfs的底層實現細節。
SWUpdate可以提供命令行安裝。它還提供了類似于Mender的后端更新系統,該系統基于Eclipse hawkBit,它與在名為“ Suricatta”的目標上運行的守護程序一起運行,該守護程序處理對SWUpdate的調用。它還可以在設備本身上運行嵌入式http服務器,從中可以上傳和安裝更新。
默認情況下,它提供精簡的映像配方,旨在作為initramfs恢復映像運行。從到目前為止的經驗來看,該系統似乎是為通過雙重rootfs更新進行恢復分區更新而設計的(在上一篇文章中已討論了它們的優缺點)。將雙重rootfs更新與后臺OTA更新守護程序“ Suricatta”集成在一起似乎是不可能的,或者至少是非常困難的。
大多數SWUpdate用C編寫,因此大多數嵌入式Linux開發人員可以輕松地進行修改或執行調試。開發人員還將“處理程序”的思想納入了應用程序,以允許其他編碼人員輕松擴展。這些可以實現額外的更新功能,例如將固件下載到板上的其他芯片。
像Mender一樣,SWUpdate對用戶提出了一些要求,但由于系統的可配置性,這些要求受到限制,有些甚至是可選的。
RAUC
RAUC被設計為比前兩個更新系統更輕巧的更新系統,主要二進制文件僅約2個。512K與SWUpdate的130萬和Mender的690萬相比(這些是基于Yocto的輸出進行的粗略計算,未考慮依賴關系,不同的構建目標等)。
它從構建系統輸出所謂的“捆綁包”。這些捆綁軟件包含壓縮的文件系統和元數據。它們始終需要進行數字簽名,這是RAUC的核心設計理念。它將文件系統映像編程到各種“插槽”中,然后可以將它們標記為正在工作或損壞或準備進行更新。它將與引導加載程序環境交互以決定是否
RAUC在內核中需要某些選項(例如:對SQUASHFS的支持),并且在根文件系統中也具有某些軟件依賴性。RAUC與SWUpdate一樣,也是用C編寫的。它沒有實現Mender和SWUpdate可以做到的流傳輸。
與SWUpdate一樣,它支持使用Eclipse hawkBit作為后端更新系統,從而使您可以從Web界面下推對設備的更新。

圖3:Eclipse hawkBit可以用作將更新推送到設備的Web界面,可以與RAUC和SWUpdate集成
結束語
在此未提及基于文件的更新系統(如上一篇文章中所述)。為簡潔起見,其他人則錯過了。
使用哪種系統的決定實際上取決于項目。看來Mender可能更容易入門,而SWUpdate可能對于與已經部分內部開發的更新系統集成很有用,并且RAUC可以用作SWUpdate的替代方法。

