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