哪個 Linux 發行版最適合嵌入式開發?
如果你的組織部署了IoT解決方案,則你知道嵌入式系統的開發與標準桌面開發略有不同。Linux的低成本對物聯網開發人員很有吸引力,因此它通常是嵌入式開發的選擇,而不是昂貴的專有內核。開發人員使用虛擬機處理與目標設備類似的環境的情況並不少見,但在 VM 上進行開發可能會很尷尬。相反,開發人員可以使用專門為嵌入式系統設計的發行版。
與專有的嵌入式操作系統相比,Linux成本低;它允許多個軟體、開發和支持供應商;它有一個穩定的內核;它有助於讀取、修改和重新分發原始程式碼。由於這些原因以及更多原因,Linux已成為嵌入式系統的首選。
但是當涉及到將Linux部署到設備中時,有很多選擇。在為桌面和企業級設備構建時,開發人員通常會選擇像Ubuntu這樣的發行版來最好地模仿部署環境,並得到VirtualBox和Docker等工具的説明。不過,這種設置對於嵌入式系統程式設計來說很尷尬。開發環境非常不同,構建輸出需要包含目標設備的整個軟體映像:內核、設備驅動程式、庫、應用程式軟體,甚至可能是引導載入程式。
接近Linux發行版進行嵌入式開發,許多人從桌面發行版開始,例如Debian或Red Hat,並去除不必要的元件,直到安裝的映像適合目標設備。這是一種自然的方式,因為許多 Linux 開發人員都是桌面 Linux 使用者,可以訪問他們通常的運行時包陣列。一種選擇實際上是將顯示器和鍵盤連接到目標設備,然後直接像這樣開發。但是,這種方法可能很棘手。桌面發行版不適用於資源匱乏的系統,手動添加和刪除包可能是一項困難且容易出錯的工作。
什麼是 嵌入式Linux?
汽車計算、醫療設備、物聯網 (IoT) 和工廠自動化只是在嵌入式 Linux 上運行的嵌入式系統中的一小部分。我們知道計算機使用特定的硬體(例如CPU,記憶體,主機板)運行,嵌入式系統設備也在微處理器和控制器上運行,但規模較小。這些設備需要使用較少資源的操作系統,並且開發人員必須能夠從其桌面部署到操作系統。
嵌入式Linux通常是物聯網開發人員的選擇,因為它具有低成本、開原始碼、輕量級存儲要求以及能夠在更少的資源上運行的能力。這是一個穩定的選項,這對於部署由多個消費者使用的系統的組織至關重要。操作系統崩潰的擔憂是不存在的。例如,Android操作系統基於Linux, 佔據了全球87% 的市場份額,操作系統非常可靠。
嵌入式Linux是RTOS嗎?
專有的即時操作系統(RTOS)可以成為嵌入式Linux的有吸引力的替代品,但它也有其自身的困難。當開發人員尋找物聯網開發平臺和方法時,他們會遇到嵌入式Linux或RTOS的選項。兩者之間存在明顯差異,因此在與其中一個結婚之前,您必須仔細選擇。
RTOS 可以對開發人員更加友好,但對於您希望支援自定義或與其他開發人員專案集成的企業應用程式,嵌入式 Linux 提供了更直觀的整合環境。即時操作系統專為時間敏感型應用而設計。除非您的系統具有關鍵的時間敏感事件,否則嵌入式 Linux 系統為開發人員提供了更大的靈活性。
Linux 和嵌入式 Linux 有什麼區別?
大多數開發人員都知道您需要為目標系統編譯原始程式碼。在為嵌入式系統進行開發時,開發人員在桌面上編寫代碼,但使用跨平臺工具鏈部署到另一個環境。嵌入式系統部署與桌面有很大不同。台式電腦面向 8086 微處理器架構,但嵌入式系統可以面向多個微處理器,通常是 ARM、8051、PIC 和 AVR。
Desktop Linux 和嵌入式 Linux 之間的其他一些區別包括:
- 嵌入式系統使用較少的功率,通常使用電池運行。
- 嵌入式系統更加緊湊。
- 許多嵌入式系統為關鍵設備供電,例如健康警報系統、醫療設備、核機械和家庭安全。
- 嵌入式 Linux 系統僅包含在目標處理器上運行所需的元件,而不是在桌面上安裝的無數元件上運行的所有可能的驅動程式和庫。
什麼是嵌入式 Linux 作業系統的範例?
Linux 內核是開源的,允許任何人以修改後的形式修改和分發它。市場上有幾個桌面版本的Linux,就像有幾個版本的嵌入式Linux一樣。開發人員可以自由地使用他們自己的自定義 Linux 版本,但使用已經存在的穩定版本要方便得多。
我們已經提到了Android操作系統。Android是由Google開發並在開源許可下發佈的嵌入式Linux系統,允許其他開發人員對其進行修改和分發。Debian 是桌面 Linux 發行版的一個例子,它也在 Raspberry Pi 設備上嵌入了一個版本。Raspberry 是基於 Debian 的作業系統,用於為緊湊的 Raspberry Pi 計算設備提供動力。
為什麼在嵌入式系統中使用Linux?
開發人員出於各種原因選擇Linux作為其嵌入式系統目標作業系統。第一個是Linux是完全可定製的。開發人員可以自由地使用 Linux 內核並創建自己的作業系統發行版,或者採用現有發行版並添加創建自己版本的小更改。
Linux 是免費的,因此對於只想探索和入門的新開發人員來說,它的啟動成本很低。使用 Linux 的開發人員越多,嵌入系統的可能性就越大。
最後,它被廣泛使用,使其得到第三方開發人員的更好支援。如果目標是構建一個其他開發人員可以集成到自己的專案中的系統,那麼Linux將更加直觀。
如何選擇嵌入式Linux作業系統?
選擇嵌入式 Linux 作業系統在很大程度上取決於您的目標、目標設備操作、上市時間和所需的回應能力。許多開發人員只是使用Android,因為它被廣泛使用和理解,但這裡有幾個問題需要考慮,以説明您選擇合適的作業系統:
- 時機關鍵嗎? 如果您的應用程式需要精確的計時,則應使用即時操作系統。Linux不是RTOS,但可以考慮像 RTLinux 這樣的擴展。
- 記憶體大小和 CPU 功率是否受限? 典型的 Linux 內核為 1.5MB,對於某些系統來說可能太大了。可以使用自定義的Linux內核,其中只有正確的應用程式功能元件。
- 網路性能重要嗎?使用 Android 的行動應用程式具有網路功能,但如果網路是主要關注點,則不需要 Android。專門為網路性能構建的替代方案是OpenWRT / LEDE。
- 會有圖形用戶介面嗎?對於嚴重依賴使用者介面的系統來說, Android 的 預裝 GUI 可能是一個不錯的選擇。
- 上市時間短嗎? 更常見的Linux發行版將有助於縮短開發時間。 Ubuntu 通常用於更快的啟動。
哪個 Linux 發行版最適合嵌入式開發?
開發人員需要一個便於編寫代碼和編譯到目標操作系統的環境。他們可以使用虛擬機並設置目標分發,但使用安裝在本地計算機上並跨平臺部署的工具要方便和舒適得多。以下是一些用於嵌入式開發的優秀Linux發行版:
約克托
對於嵌入式系統的Linux發行版來說,一個非常流行的非桌面選項是 Yocto,也稱為Openembedded。Yocto得到了一群開源愛好者,一些大牌技術宣導者以及許多半導體和電路板製造商的支援。Yocto 項目構建將目標運行時二進位檔、包源和目標 SDK 包裝在一起。它很容易通過層進行擴展,從而添加功能和特性。Yocto的模組化架構使其非常靈活,並提供明確定義的層優先順序和覆蓋功能。新版本每六個月出現一次,文檔總是很全面。 也許Yocto的唯一缺點是新手可能很難掌握。
構建根
Buildroot 的目標是成為Yocto的更輕量級版本。Buildroot 不支持目標包管理,並禁用所有包的所有可選編譯時設置。不能將新套件安裝到正在運行的系統中。這留下了一個小系統;如此之小,以至於許多人將Buildroot簡單地稱為固件產生器(因為圖像大多在構建時固定)。Buildroot 項目構建將根文件系統映像和部署Linux所需的任何其他輔助檔包裝在一起;內核、引導載入程式和內核模組;以及用於構建所有目標二進位檔的工具鏈。Buildroot的主要優點是它相當容易學習,特別是因為它使用普通的Makefile和Kconfig語言。主要的缺點是Buildroot的最小性質使得定製變得困難。
OpenWRT/LEDE
OpenWRT/LEDE 旨在為網路可訪問的軟體包存儲庫生成二進位映像。它主要用於消費者路由器的自定義韌體。如果您需要更換商用設備的韌體,特別是如果您的嵌入式設計以網路為重點,OpenWRT/LEDE應該是您的首選。但是,它會對您的設計施加重要且不靈活的策略決策。如果您需要大量的自定義,我們建議您改用Buildroot或Yocto。
如何將安全更新應用於嵌入式系統(以及為什麼)?
在嵌入式系統上更新應用程式非常棘手。錯誤的修補程式方案可能會導致您的客戶遇到「磚砌」設備。不安全的更新可能會導致設備受損。您可以依靠使用者手動修補固件,但使用者很少花時間,甚至不知道更新很重要。這也會導致系統受損。例如, 未打補丁的物聯網設備 是最大的分散式拒絕服務(DDoS)攻擊之一。事實上, 物聯網攻擊 在2019年增加了300%。很明顯,修補和更新對於設備及其使用者的安全至關重要。
應始終通過網路對通信進行加密,並且應使用數位簽名來確保攻擊者不會修改修補程序檔。加密通信和數位簽名可阻止中間人攻擊並防止篡改。部署軟體更新的常規工作流如下:
- 使用安全通道輪詢中央系統以確定是否有可用的更新。
- 確保當前更新與已安裝的版本相容。
- 使用安全通道下載修補程式,以避免中間人攻擊。
- 使用完整性檢查(例如校驗和)驗證檔是否未損壞。
- 驗證數字簽名是否有效。
- 解密檔。
- 提取所有壓縮檔。
- 執行任何預安裝操作,例如為回滾創建備份。
- 安裝修補程式。
- 執行任何安裝後操作,例如清理安裝檔。
- 健全性檢查安裝以確保安裝成功,如果沒有,請執行回滾。
如何在不重新啟動的情況下將安全更新應用於嵌入式系統?
上述工作流程是更新的標準工作流程,但大多數補丁需要重新啟動系統。重新啟動設備會中斷使用者,並可能切斷關鍵系統。例如,重新啟動主路由器可能會導致企業網路上的嚴重停機和數據損壞。
可以執行即時修補,而不是強制重新啟動。即時修補解決了嵌入式系統更新的幾個問題。它消除了重新啟動的需要,也消除了由於更新失敗而可能使設備變磚的需要。開發人員不再需要為嵌入式 Linux 創建自定義修補服務,也不再需要依賴使用者手動更新應用程式。
有三種主要方法可以在不重新啟動的情況下更新Linux:使用命令行、使用 kexec 工具或使用 livepatch 解決方案。 這 篇博文涵蓋了所有三個解決方案,包括第三方解決方案和修補步驟。
結論
對於任何在嵌入式系統中尋找環境的開發人員來說,Linux 是一個受歡迎的選擇,具有多種可用的解決方案、平臺、發行版和工具。您選擇的作業系統將驅動您的許多環境選項,但有一點是明確的:您始終需要一種方法來修補和更新您的設備。為了避免磚砌客戶設備,但要保持更新,即時修補是最佳解決方案。即時修補可確保您的消費者系統安全,同時讓他們在適當時靈活地重新啟動。
