嵌入式linux 升级,嵌入式Linux的OTA更新,基本原理和实现
需要更新
一旦嵌入式Linux產(chǎn)品離開實(shí)驗(yàn)室并進(jìn)入現(xiàn)實(shí)世界,如何更新設(shè)備的問題就變得至關(guān)重要。
更新并非總是必要的,但是很難想到?jīng)]有某個(gè)漏洞的軟件。即使您的軟件是完美的,但是如果設(shè)備通過任何開放源代碼庫(kù)在網(wǎng)絡(luò)或Internet上進(jìn)行通信,則可能需要進(jìn)行安全更新。
以CVE-2104-01650(嚴(yán)重)為例。此漏洞影響了OpenSSL加密庫(kù),并擴(kuò)展了網(wǎng)絡(luò)上三分之二的網(wǎng)站。即使到了三年后的今天,仍然有許多嵌入式Linux設(shè)備運(yùn)行的是OpenSSL的非防御版本,可以廣泛攻擊。
阻止文件更新
在談?wù)摳翷inux時(shí),您可能會(huì)看到提到了“阻止”和“文件”更新系統(tǒng)。這是指通過直接寫入塊設(shè)備或更新單個(gè)文件以執(zhí)行更新來(lái)一次更新整個(gè)分區(qū)。您可能熟悉Desktop或Server Linux的文件更新系統(tǒng)(例如“ sudo apt-get upgrade”)。在嵌入式Linux中,基于模塊的升級(jí)由于其原子性以及整個(gè)文件系統(tǒng)通常是嵌入式Linux構(gòu)建系統(tǒng)的輸出這一事實(shí)而成為必經(jīng)之路。我們期望特定產(chǎn)品在每個(gè)嵌入式設(shè)備上的存儲(chǔ)空間是恒定的,因此我們每次都創(chuàng)建相同大小的分區(qū)。此類更新與具有某種后備或恢復(fù)映像配合使用。
發(fā)生故障時(shí)恢復(fù)
我們絕不希望設(shè)備處于無(wú)法使用的狀態(tài)(例如,如果發(fā)生斷電)。我們可以通過確保在更新過程中出現(xiàn)任何錯(cuò)誤時(shí)始終可以“退回到”另一個(gè)分區(qū)來(lái)解決此問題。
圖1.發(fā)生故障時(shí)的恢復(fù)-后備選項(xiàng)
在上方,您可以看到電源中斷時(shí)后備模式的兩種可能實(shí)現(xiàn)。引導(dǎo)程序在左側(cè)引導(dǎo)應(yīng)急分區(qū),然后將其引導(dǎo)到主分區(qū)。在右側(cè),Bootloader會(huì)基于開關(guān)引導(dǎo)兩個(gè)分區(qū)之一。
引導(dǎo)加載程序應(yīng)實(shí)現(xiàn)某種確定啟動(dòng)是否成功的方法,如果尚未成功,則應(yīng)返回到救援分區(qū)(左圖)或先前的工作分區(qū)(右圖)。
救援方法(左手)允許為主分區(qū)提供更多空間,而雙rootfs方法(右手)要求在兩個(gè)分區(qū)之間或多或少均勻地分配空間。如果空間不成問題,則建議使用dual-rootfs方法,因?yàn)檫@將減少停機(jī)時(shí)間。通過救援方法進(jìn)行更新需要兩次重新引導(dǎo),一次重新進(jìn)入救援分區(qū),然后另一次重新進(jìn)入主分區(qū)。dual-rootfs方法僅需要一次重新引導(dǎo),因?yàn)榭梢噪S時(shí)執(zhí)行更新。
在這些系統(tǒng)中無(wú)法安全更新的是引導(dǎo)加載程序(或?qū)嶋H上是救援分區(qū))。如果您也想更新引導(dǎo)加載程序,則需要兩個(gè)單獨(dú)的引導(dǎo)加載程序分區(qū),以及某種Board-Management-Controller來(lái)實(shí)現(xiàn)兩者之間切換的邏輯。
圖2.發(fā)生故障時(shí)的恢復(fù)– Board Management Controller
當(dāng)然,這是一個(gè)復(fù)雜的解決方案,需要一個(gè)額外的微控制器,一套新的固件以及更復(fù)雜的硬件設(shè)計(jì)(例如,在某些設(shè)備中使用,例如那些包含單獨(dú)的智能平臺(tái)管理接口(IPMI)控制器的設(shè)備) 。因此,您應(yīng)該著眼于構(gòu)建功能齊全,范圍較小且不需要更新的引導(dǎo)加載程序。
U-Boot環(huán)境變量
U-boot實(shí)現(xiàn)了一個(gè)非易失性“環(huán)境”,可以在其中存儲(chǔ)變量。甚至可以從Linux(可以通過多種方式來(lái)訪問它們,具體取決于環(huán)境的存儲(chǔ)方式,如elinux.org上所述)。
這是實(shí)現(xiàn)上述“開關(guān)”的最明顯方法。它也可以用于存儲(chǔ)有關(guān)先前啟動(dòng)成功或失敗的信息,以便在啟動(dòng)失敗的情況下可以反轉(zhuǎn)交換機(jī)并恢復(fù)工作分區(qū)。
圖3. U-boot環(huán)境變量
設(shè)置看門狗
處理器的硬件監(jiān)視程序應(yīng)該由U-Boot(CONFIG_WATCHDOG)設(shè)置,然后在啟動(dòng)完成后由Linux維護(hù)。如果整個(gè)系統(tǒng)掛起,這將導(dǎo)致重置。
檢查啟動(dòng)失敗
關(guān)鍵任務(wù)應(yīng)用程序運(yùn)行后,應(yīng)在u-boot環(huán)境中設(shè)置一個(gè)變量,指示啟動(dòng)完成。然后,U-boot將能夠檢查是否在下一次啟動(dòng)時(shí)設(shè)置了該設(shè)置,如果啟動(dòng)失敗(有時(shí)僅在連續(xù)幾次失敗之后),則可以采取措施。
具體的架構(gòu)將取決于您的應(yīng)用程序和產(chǎn)品。您將需要對(duì)此進(jìn)行一些自定義,以適應(yīng)您的需求。您將要確定所有可能的故障模式,并對(duì)所有故障模式實(shí)施恢復(fù)。
實(shí)施更新
正如我們之前所說,更新應(yīng)以單個(gè)加密簽名文件的形式出現(xiàn)。私鑰簽名可確保其源自制造商您。現(xiàn)在,系統(tǒng)只需解壓縮它并運(yùn)行其中的腳本即可自行執(zhí)行更新。它將覆蓋要更新的分區(qū);輕拂所需的任何開關(guān),然后重新啟動(dòng)。這應(yīng)該盡快發(fā)生,以最大程度地減少停機(jī)時(shí)間。
保護(hù)更新
我們要確保提供給設(shè)備的更新文件來(lái)自制造商而不是其他人。為此,請(qǐng)使用制造商持有的私鑰對(duì)更新文件進(jìn)行簽名。相應(yīng)的公鑰保留在設(shè)備上,它將驗(yàn)證要求使用其進(jìn)行更新的任何更新文件。如果提供的文件被認(rèn)為無(wú)效,則更新將失敗。
獲取更新
更新如何到達(dá)是另一回事。這里有四種可能性:
最明顯和最簡(jiǎn)單的方法是,該更新是由具有root登錄到設(shè)備的工程師應(yīng)用的。他運(yùn)行更新腳本并更新了設(shè)備。這充滿了安全隱患,并且可能僅適用于開發(fā)中的系統(tǒng)或工程或工業(yè)環(huán)境中使用的系統(tǒng)。
物理介質(zhì)已插入包含所需更新的設(shè)備(USB記憶棒)中。板上的軟件將通過輪詢守護(hù)程序或udev規(guī)則自動(dòng)檢測(cè)并安裝。
通過某種方法(例如,Web應(yīng)用程序)將更新文件上傳到單個(gè)計(jì)算機(jī)。
空中更新,如下一節(jié)所述。
空中更新
空中(OTA)更新通常是指通過安全通道從中央服務(wù)器更新的設(shè)備。它通常指的是物聯(lián)網(wǎng)設(shè)備,移動(dòng)電話,汽車ECU等。在本文中,我將描述一種更新類型,該更新可以在連接到互聯(lián)網(wǎng)的任何設(shè)備上運(yùn)行,并且可以通過Wi-Fi(空中),以太網(wǎng)(銅纜)或其他某種協(xié)議。
檢查更新
首先要做的是檢查更新。設(shè)備上運(yùn)行的守護(hù)進(jìn)程可以將請(qǐng)求發(fā)送到預(yù)定服務(wù)器,提供其當(dāng)前版本和硬件版本。然后,服務(wù)器可以根據(jù)該信息,在必要時(shí)將簽名的更新文件發(fā)送到設(shè)備進(jìn)行安裝,或者報(bào)告沒有可用的更新或不需要更新。
可以通過多種方式添加復(fù)雜性,從僅基于各種標(biāo)準(zhǔn)向設(shè)備子集提供更新,到對(duì)更新文件進(jìn)行完全加密,再到將更新狀態(tài)或其他信息報(bào)告回中央服務(wù)器。
現(xiàn)成與內(nèi)部解決方案
有許多現(xiàn)成的更新機(jī)制可以與嵌入式Linux系統(tǒng)集成,而不必如上所述重新發(fā)明輪子。可以在yocto項(xiàng)目中找到其中一些的比較。
這些可能需要一些時(shí)間和精力才能與您當(dāng)前的嵌入式Linux構(gòu)建系統(tǒng)集成,但是它可能比內(nèi)部開發(fā)自定義方法要少一些,并且由于其中一些項(xiàng)目已經(jīng)花費(fèi)了數(shù)百小時(shí)而變得更加強(qiáng)大。進(jìn)入他們。
為什么您不想要現(xiàn)成的解決方案的原因:
您希望在每個(gè)級(jí)別上為董事會(huì)自定義內(nèi)容
在使用大型代碼庫(kù)時(shí),您可能會(huì)遇到安全問題,而該代碼庫(kù)仍相對(duì)較新,并且使用或識(shí)別的程度不高
在ByteSnap Design,我們?yōu)樵S多不同的客戶提供了完整的硬件和軟件解決方案,我們創(chuàng)建了內(nèi)部自定義更新系統(tǒng),同時(shí)在各種不同的芯片組(例如MTS)上集成了Mender等現(xiàn)成的更新系統(tǒng)。
總結(jié)
以上是生活随笔為你收集整理的嵌入式linux 升级,嵌入式Linux的OTA更新,基本原理和实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 跪求大家给建议啦!本人想换手机,只有15
- 下一篇: 搭建远程linux,如何在远程Linux