嵌入式Linux的OTA更新,基础知识和实现
嵌入式Linux的OTA更新,基礎知識和實現
OTA updates for Embedded Linux, Fundamentals and implementation
更新的需要
一旦嵌入式Linux產品離開實驗室進入現實世界,如何更新設備的問題將成為重要的考慮因素。
更新并不總是必要的,但是很難想象任何一個軟件都沒有在某個時刻被發現的bug。即使您的軟件是完美的,如果設備在網絡或internet上與任何開放源代碼庫通信,安全更新也可能成為必要。
以CVE-2104-01650(心血)為例。此漏洞影響了OpenSSL加密庫,并擴展到網絡上三分之二的網站。即使在三年后的今天,仍有許多嵌入式Linux設備運行著OpenSSL的不設防版本,完全可以被攻擊。
阻止vs文件更新
當談到更新Linux時,您可能會看到提到了“塊”和“文件”更新系統。這是指通過直接寫入塊設備或更新單個文件來執行更新,一次更新整個分區。您可能熟悉桌面或服務器Linux的文件更新系統(“例如sudo apt get upgrade”)。
在嵌入式Linux中,基于塊的升級是可行的,因為它們具有原子性,而且整個文件系統通常都是嵌入式Linux構建系統的輸出。對于特定的產品,我們希望每個嵌入式設備上的存儲空間是恒定的,所以我們每次都創建相同大小的分區。這種類型的更新與某種回退或恢復映像密切相關。
故障時的恢復
我們絕不希望設備處于不可用狀態(例如,如果發生停電)。我們可以通過確保在更新過程中發生任何錯誤時始終可以“退回”到另一個分區來解決這個問題。
更新的需要
一旦嵌入式Linux產品離開實驗室進入現實世界,如何更新設備的問題將成為重要的考慮因素。
更新并不總是必要的,但是很難想象任何一個軟件都沒有在某個時刻被發現的bug。即使您的軟件是完美的,如果設備在網絡或internet上與任何開放源代碼庫通信,安全更新也可能成為必要。
以CVE-2104-01650(心血)為例。此漏洞影響了OpenSSL加密庫,并擴展到網絡上三分之二的網站。即使在三年后的今天,仍有許多嵌入式Linux設備運行著OpenSSL的不設防版本,完全可以被攻擊。
阻止vs文件更新
當談到更新Linux時,您可能會看到提到了“塊”和“文件”更新系統。這是指通過直接寫入塊設備或更新單個文件來執行更新,一次更新整個分區。您可能熟悉桌面或服務器Linux的文件更新系統(“例如sudo apt get upgrade”)。
在嵌入式Linux中,基于塊的升級是可行的,因為它們具有原子性,而且整個文件系統通常都是嵌入式Linux構建系統的輸出。對于特定的產品,我們希望每個嵌入式設備上的存儲空間是恒定的,所以我們每次都創建相同大小的分區。這種類型的更新與某種回退或恢復映像密切相關。
故障時的恢復
我們絕不希望設備處于不可用狀態(例如,如果發生停電)。我們可以通過確保在更新過程中發生任何錯誤時始終可以“退回”到另一個分區來解決這個問題。
圖2. 發生故障時的恢復-Board Management Controller
這當然是一個復雜的解決方案,需要一個額外的微控制器、一套新的固件和更復雜的硬件設計(它用于某些設備,例如那些包含獨立的智能平臺管理接口(IPMI)控制器的設備)。因此,您應該致力于構建一個功能強大、范圍小、因此不需要更新的引導加載器。
U-Boot環境變量
U-boot實現了一個可以存儲變量的非易失性“環境”。甚至可以從Linux訪問這些文件。
這是實現上述“開關”的最明顯的方法。它還可以用來存儲有關以前引導成功或失敗的信息,以便在引導失敗的情況下可以反轉交換機并恢復工作分區。
圖3. U-boot環境變量
設置看門狗
處理器的硬件看門狗應該通過U-Boot(CONFIG_-watchdog)設置,然后在引導完成后由Linux進行維護。這將導致整個系統掛起時重置。
正在檢查引導失敗
一旦您的任務關鍵型應用程序正在運行,它應該在u-boot環境中設置一個變量,指示完成引導。然后,U-boot將能夠在下次引導時檢查是否已設置了此選項,并在引導失敗時采取措施(有時僅在連續幾次失敗之后)。
具體的體系結構將取決于您的應用程序和產品;您需要對其進行一點定制,以滿足您的需要。您將需要確定所有可能的故障模式,并對所有模式執行恢復。
實施更新
正如我們之前所說的,更新應該是一個單獨的加密簽名文件。私鑰簽名確保其來源于制造商您。現在,系統只需要將其解壓并運行一個腳本,該腳本將自行執行更新。它將覆蓋要更新的分區;輕觸任何需要的開關并重新啟動。這應該盡快進行,以盡量減少停機時間。
保護更新
我們要確保我們提供給設備的更新文件來自我們制造商,而不是來自其他人。為此,更新文件使用制造商持有的私鑰進行簽名。相應的公鑰是設備上保存的,它將驗證請求它執行更新的任何更新文件。如果提供的文件被視為無效,則更新將失敗。
正在獲取更新
更新如何到達是另一回事。這里有四種可能性:
最明顯、最簡單的一點是,更新是由一個擁有根用戶登錄設備的工程師應用的。他運行更新腳本并更新設備。這充滿了安全問題,可能只適合于開發中的系統,或者工程或工業環境中使用的系統。
將物理介質插入包含所需更新的設備(U盤)中。板上的軟件將通過輪詢守護程序或udev規則自動檢測和安裝。
通過某種方法(例如web應用程序)將更新文件上載到單個計算機。
無線更新,如下一節所述。
無線更新
“空中傳送”(OTA)更新通常指通過安全通道從中央服務器更新的設備。它通常指物聯網設備、移動電話、汽車ECU等。在本文中,我將描述一種可以在任何連接到互聯網的設備上工作的更新類型,這可能是通過Wi-Fi(空中傳送)、以太網(銅纜)或其他協議。
正在檢查更新
首先要做的是檢查更新。在設備上運行的守護進程可以向預先確定的服務器發送請求,提供其當前版本和硬件版本。然后,服務器可以根據這些信息,向設備發送一個簽名的更新文件,以便在必要時進行安裝,或者報告沒有可用的或需要的更新。
復雜性可以通過多種方式增加,從僅根據各種標準向設備子集提供更新,到對更新文件進行完全加密,再到向中央服務器報告更新狀態或其他信息。
現成與內部解決方案
有許多現成的更新機制可以與您的嵌入式Linux系統集成,而不必像上面描述的那樣重新發明輪子。在yocto項目中可以找到其中一些的比較。
這些可能需要一些時間和精力來與當前的嵌入式Linux構建系統集成,但是它可能比內部開發一個自定義方法要少,而且它可能更健壯,因為其中一些項目已經投入了數百個小時。
您可能不需要現成解決方案的原因:
你希望為你的董事會在每一個層次上定制東西
在接受一個相對較新的、未被廣泛使用或認可的大型代碼庫時,您可能會有安全問題
在ByteSnap Design,我們為各種不同的客戶提供完整的硬件和軟件解決方案。我們創建了兩個內部定制更新系統,同時集成了現成的更新系統,如NXP iMX和TI OMAP系列芯片組上的Mender。
總結
以上是生活随笔為你收集整理的嵌入式Linux的OTA更新,基础知识和实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 队列:实用程序服务和数据结构
- 下一篇: 嵌入式Linux设备驱动程序:发现硬件配