物聯(lián)網(wǎng)(IoT)的快速增長引發(fā)了數(shù)十億聯(lián)網(wǎng)無線嵌入式設(shè)備的出現(xiàn)。從醫(yī)療設(shè)備到水箱傳感器、智能恒溫器、智能路燈、水監(jiān)測(cè)器等,物聯(lián)網(wǎng)的應(yīng)用范圍比以往任何時(shí)候都要廣。
可能出現(xiàn)什么問題?
這些設(shè)備中的大多數(shù)在設(shè)計(jì)上都不是惡意攻擊的目標(biāo)。嵌入式系統(tǒng)傳統(tǒng)上被認(rèn)為是穩(wěn)定的產(chǎn)品,但實(shí)施成本高昂,投資回報(bào)率(ROI)計(jì)劃在相當(dāng)長的生命周期內(nèi)進(jìn)行。一旦發(fā)貨,它們很少需要更新。開發(fā)更新并在該領(lǐng)域?qū)嶋H應(yīng)用它們的需求和成本隨著智能手機(jī)和操作系統(tǒng)(OS)如Android的爆發(fā)而變得普遍。
突然之間,惡意黑客現(xiàn)在將所有這些易受攻擊的連接設(shè)備作為潛在目標(biāo),這些設(shè)備在不充分的,過時(shí)的操作系統(tǒng)和Linux內(nèi)核上運(yùn)行,這些操作系統(tǒng)和Linux內(nèi)核具有尚未修補(bǔ)的已知漏洞,并且可以遠(yuǎn)程利用!
這不是一個(gè)非常有吸引力的前景。
安全更新:嵌入式與服務(wù)器
如今,一類新的現(xiàn)場(chǎng)軟件更新正在出現(xiàn),這種更新受到安全問題的推動(dòng),但也允許工程師添加新功能和修復(fù)錯(cuò)誤。
對(duì)于嵌入式設(shè)備,固件更新機(jī)制不僅必須安全,而且必須可靠,因?yàn)樗锤鲁晒Γ礋o法恢復(fù)到可恢復(fù)狀態(tài)。軟件更新絕不應(yīng)該破壞設(shè)備,并且應(yīng)該能夠在無人值守的情況下發(fā)生。大多數(shù)更新還必須保留以前的設(shè)備狀態(tài),盡管在某些情況下,恢復(fù)設(shè)備可能涉及重置為默認(rèn)狀態(tài)。
還有原子性問題。Linux服務(wù)器世界習(xí)慣于執(zhí)行基于包的更新,一切似乎都很好。但嵌入式設(shè)備不是服務(wù)器。
服務(wù)器通常位于受控環(huán)境中,可能是安全的,并且具有有保證的電源和網(wǎng)絡(luò)連接。它還駐留在受監(jiān)視的可訪問位置,因此即使不希望用戶進(jìn)行恢復(fù),也可以進(jìn)行用戶干預(yù)。
Linux 服務(wù)器通常依賴于包管理,通常是基于 rpm 的(已修改的黃色狗更新程序或 YUM)或基于 deb 的 (apt),具有執(zhí)行非原子增量更新的依賴關(guān)系解析。更新由軟件包版本更新驅(qū)動(dòng),每個(gè)更新都有一組復(fù)雜的安裝前/安裝后腳本,這些腳本可能會(huì)使系統(tǒng)處于未定義甚至非工作狀態(tài)。
不幸的是,嵌入式設(shè)備可能無法訪問,可能大部分時(shí)間都處于低功耗模式,使用壽命非常長,并且可能遭受可能中斷固件更新的電源或網(wǎng)絡(luò)中斷。
最終,基于包管理器的更新不是原子的,因此很難測(cè)試和支持它們。這通常會(huì)導(dǎo)致丟失對(duì)設(shè)備上固件實(shí)際狀態(tài)的跟蹤,以及可怕的“我上次在此設(shè)備上更新了什么?”問題。這不適用于期望始終一致執(zhí)行的嵌入式系統(tǒng)。
圖像更新
更新嵌入式設(shè)備的傳統(tǒng)且未經(jīng)驗(yàn)證的最佳方法是執(zhí)行整個(gè)映像更新。在裸機(jī)設(shè)備中,這將是包含所有設(shè)備固件的整個(gè)映像。在嵌入式Linux設(shè)備中,這通常轉(zhuǎn)換為分區(qū)更新,因此分區(qū)方案是一個(gè)重要的考慮因素,因?yàn)樗鼤?huì)影響可以執(zhí)行的軟件更新類型。
嵌入式 Linux 設(shè)備通常會(huì)將媒體劃分為可以單獨(dú)更新的不同分區(qū):
引導(dǎo)加載程序分區(qū): 很少(如果有的話)更新,在現(xiàn)場(chǎng)更新嵌入式設(shè)備的引導(dǎo)加載程序?qū)?dǎo)致設(shè)備最終變磚。因此,經(jīng)過深思熟慮的更新機(jī)制會(huì)盡可能避免這種情況。
引導(dǎo)/內(nèi)核分區(qū): Linux 內(nèi)核和相關(guān)工件(如設(shè)備樹和 initramfs 映像)通常出于安全性而不是功能原因而發(fā)生。通常不需要更新。
根文件系統(tǒng)分區(qū): 存儲(chǔ)操作系統(tǒng)文件的位置通常是只讀不可變的。這也很少更新,但如果應(yīng)用程序依賴于此處的庫,則可能會(huì)更頻繁地發(fā)生這種情況。
用戶分區(qū): 用戶應(yīng)用程序和持久性數(shù)據(jù)的存儲(chǔ)位置是最常需要更新的分區(qū)。
基本上,映像固件更新的范圍可以從整個(gè)系統(tǒng)(即內(nèi)核、根和用戶分區(qū))到其中一些分區(qū)。
有兩種類型的映像更新是可能的:對(duì)稱的和不對(duì)稱的。
對(duì)稱: 對(duì)稱更新需要正在更新的分區(qū)映像的雙重副本,以便可以在另一個(gè)正在運(yùn)行時(shí)更新一個(gè)分區(qū)映像。這通常需要兩個(gè)引導(dǎo)/內(nèi)核分區(qū)、兩個(gè)根文件系統(tǒng)以及兩個(gè)用戶分區(qū)。然后,引導(dǎo)加載程序跟蹤給定引導(dǎo)要使用的分區(qū)。對(duì)稱更新具有最短的停機(jī)時(shí)間,通常只有重新啟動(dòng)時(shí)間,并允許取消更新。
非 對(duì)稱: 非對(duì)稱更新使用通常從內(nèi)存運(yùn)行的恢復(fù)操作系統(tǒng),具有 Linux 內(nèi)核和初始化映像。這減少了所需的分區(qū)數(shù),因?yàn)榛謴?fù)模式僅存在于一個(gè)額外的分區(qū)中,并且可以更新任何其他分區(qū)。如果更新失敗,可以重試恢復(fù)。非對(duì)稱更新在更新時(shí)具有更長的停機(jī)時(shí)間,并且不允許用戶取消。
用戶空間更新程序應(yīng)用程序
通常,更新由用戶空間應(yīng)用程序執(zhí)行,該應(yīng)用程序提取軟件更新包,應(yīng)用它,并將更新通知引導(dǎo)加載程序。它還需要允許進(jìn)行安裝后操作。然后,引導(dǎo)加載程序啟動(dòng)硬件監(jiān)視程序并嘗試引導(dǎo)。如果引導(dǎo)成功,則硬件看門狗被停用;如果不是,則觸發(fā)它,并且引導(dǎo)加載程序會(huì)再次嘗試引導(dǎo)。經(jīng)過多次嘗試后,它要么交換回已知良好的分區(qū),要么進(jìn)入恢復(fù)模式。
一個(gè)重要的考慮因素是用戶空間更新固件必須可通過固件更新過程進(jìn)行更新。另一個(gè)風(fēng)險(xiǎn)是,可能會(huì)更新到固件更新機(jī)制損壞的可啟動(dòng)系統(tǒng)。不幸的是,有必要回退到引導(dǎo)加載程序或其他恢復(fù)機(jī)制來更新固件。
某些系統(tǒng)使用引導(dǎo)加載程序來執(zhí)行更新。這有一些嚴(yán)重的缺點(diǎn)。如果必須更新固件更新代碼(例如,由于分區(qū)更改),則需要更新引導(dǎo)加載程序,這是非常危險(xiǎn)的。引導(dǎo)加載程序在它支持的驅(qū)動(dòng)程序、工具、庫和網(wǎng)絡(luò)協(xié)議的數(shù)量上也非常有限,因此更新發(fā)生在資源有限的環(huán)境中。
基于簽名映像的開源軟件更新有兩個(gè)主要選項(xiàng),同時(shí)支持對(duì)稱和非對(duì)稱更新:
瑞典語更新(在 GPLv2 許可證下) – 在 Yocto 中通過元更新層支持瑞典語更新(但僅限于對(duì)稱更新)。它還包含一個(gè)貓鼬Web服務(wù)器,Suricatta守護(hù)進(jìn)程,用于將更新從具有REST客戶端的遠(yuǎn)程服務(wù)器拉取到Eclipse HawkBit [2](一種后端解決方案,用于將軟件更新部署到終端設(shè)備)。它目前僅適用于 U-Boot 引導(dǎo)加載程序。
勞克 ,在 LGPLv2.1 許可證下 – RAUC 在約克托中通過元 ptx 層受支持,并支持 Grub 或裸盒引導(dǎo)加載程序。
遠(yuǎn)程映像更新
固件更新過程必須能夠從本地源(例如,閃存、USB、μSD 或 UART)進(jìn)行遠(yuǎn)程更新,也可以遠(yuǎn)程更新通常稱為無線 (OTA) 更新。OTA 更新使用遠(yuǎn)程服務(wù)器將更新推送到設(shè)備上運(yùn)行的客戶端。
開源遠(yuǎn)程 OTA 固件更新的一些選項(xiàng)包括:
Mender.io ,在 Apache 2 許可證下 – Mender.io 同時(shí)用于客戶端和服務(wù)器。它在約克托中通過元修正層得到支持。服務(wù)器可以充當(dāng)部署服務(wù)器和生成項(xiàng)目管理器,但也包含設(shè)備管理控制臺(tái)。
數(shù)字國際遠(yuǎn)程管理器 ,在 MPLv2 許可證下 –Digi遠(yuǎn)程管理器具有專有的基于云的服務(wù)器和開源客戶端。它在約克托中通過元數(shù)字層得到支持。服務(wù)器可以充當(dāng)部署服務(wù)器、生成項(xiàng)目管理器,還包含具有設(shè)備報(bào)告和監(jiān)視功能的設(shè)備管理控制臺(tái)。
Eclipse HawkBit ,在日食公共許可證下 – Eclipse HawkBit 是一個(gè) Eclipse 公共許可證服務(wù)器,它還充當(dāng)部署服務(wù)器、構(gòu)建工件管理器和設(shè)備管理器,具有設(shè)備報(bào)告和監(jiān)視功能。
完整映像更新通常存在大尺寸的問題,這對(duì)于帶寬不自由或不寬的資源受限應(yīng)用程序(如蜂窩)來說可能是個(gè)問題。差異映像固件更新是解決此問題的良好折衷方案,因?yàn)閷?shí)際上只傳輸以前版本中的增量。
容器化更新
容器化應(yīng)用程序的使用簡(jiǎn)化了軟件更新用例,因?yàn)閼?yīng)用程序可以單獨(dú)更新。
容器更新建立在不可變分發(fā)(可能是只讀文件系統(tǒng))上,其中應(yīng)用程序僅存在于可由容器增量升級(jí)的容器中。
使用基于容器的固件更新的開源項(xiàng)目的一些示例如下:
Resin.io – Resin.io 是基于 Docker 的,具有專有的 OTA 更新服務(wù)器和 Apache 2 許可客戶端。它通過元樹脂層在Yocto中支撐。
Ubuntu “Snappy” Core–Ubuntu Core 是一個(gè)基于 Ubuntu 的最小操作系統(tǒng),它提供了足夠的功能來更新具有增量的類似容器的應(yīng)用程序。
還有一些新的操作系統(tǒng)設(shè)計(jì)用于托管Docker應(yīng)用程序,這些應(yīng)用程序最終可能會(huì)在嵌入式空間中使用,例如CoreOS [8](在arm64上)和原子計(jì)劃(基于Fedora / CentOS / RHEL的操作系統(tǒng),使用rpm-ostree(基于lipbostree)而不是rpm)。
增量二進(jìn)制原子操作系統(tǒng)更新
最后,嵌入式市場(chǎng)即將到來的趨勢(shì)是增量的每文件原子更新,可以根據(jù)需要快速部署或回滾,同時(shí)保持完整的部署歷史記錄。
一些開源示例項(xiàng)目:
libOSTree– libOSTree 由一個(gè)定義為“操作系統(tǒng)二進(jìn)制文件的 Git”的庫和命令行工具組成。它使用類似 git 的對(duì)象來存儲(chǔ)和部署操作系統(tǒng)增量,每個(gè)增量都有一個(gè)持久數(shù)據(jù)的副本。Yocto有一個(gè)元更新程序?qū)涌梢岳盟K灿糜诓僮飨到y(tǒng),如項(xiàng)目原子。
swupd – swupd最初是 ClearLinux 的一部分,由英特爾贊助。它與 libOSTree 非常相似,在約克托中通過元-swupd 層支持。
縮小選項(xiàng)范圍
隨著物聯(lián)網(wǎng)設(shè)備的出現(xiàn),固件更新不僅僅是一件好事,而且是新產(chǎn)品開發(fā)所需的功能。需要盡早考慮固件更新策略的選擇,因?yàn)樗鼤?huì)影響未來的產(chǎn)品設(shè)計(jì)決策。與所有早期決策一樣,錯(cuò)誤的選擇會(huì)給開發(fā)時(shí)間帶來沉重的負(fù)擔(dān)。
上市時(shí)間緊迫的項(xiàng)目可能會(huì)傾向于更傳統(tǒng)的、久經(jīng)考驗(yàn)的全映像固件更新策略。其中包括通過Yocto項(xiàng)目的元更新層提供的一個(gè),以及企業(yè)就緒的OTA更新解決方案,如Digi國際的遠(yuǎn)程管理器。
然而,處于前沿的項(xiàng)目可以通過容器化應(yīng)用程序設(shè)計(jì)擴(kuò)展整個(gè)系統(tǒng)固件更新方法,該設(shè)計(jì)允許應(yīng)用程序與系統(tǒng)更新隔離。
審核編輯:郭婷
-
嵌入式
+關(guān)注
關(guān)注
5150文章
19664瀏覽量
317413 -
Linux
+關(guān)注
關(guān)注
87文章
11509瀏覽量
213735
發(fā)布評(píng)論請(qǐng)先 登錄
Linux嵌入式和單片機(jī)嵌入式的區(qū)別?
物聯(lián)網(wǎng)工程師為什么要學(xué)Linux?
嵌入式開發(fā)入門指南:從零開始學(xué)習(xí)嵌入式
嵌入式二維碼識(shí)別引擎是什么設(shè)備?哪些場(chǎng)景用得到?

Made with KiCad(九十四):M5Pi Linux嵌入式開發(fā)板

嵌入式 Linux 操作系統(tǒng)配置
嵌入式主板是什么意思?嵌入式主板全面解析
北京迅為RK3568開發(fā)板嵌入式學(xué)習(xí)之Linux驅(qū)動(dòng)全新更新-CAN+

嵌入式linux開發(fā)的基本步驟有哪些?
嵌入式linux開發(fā)板怎么操作
嵌入式linux開發(fā)板芯片的工作原理
學(xué)習(xí)hypervisor嵌入式產(chǎn)品安全設(shè)計(jì)
專家力薦|《嵌入式系統(tǒng)原理與開發(fā)——基于RISC-V和Linux系統(tǒng)》新書發(fā)售

評(píng)論