4 種用於構建嵌入式 Linux 系統的工具
瞭解 Yocto、Buildroot、 OpenWRT,和改造過的桌面發行版以確定哪種方式最適合你的專案。
Linux 被部署到比 Linus Torvalds 在他的宿舍裡開發時所預期的更廣泛的裝置。令人震驚的支援了各種晶片,使得Linux 可以應用於大大小小的裝置上:從 IBM 的巨型機到不如其連線的埠大的微型裝置,以及各種大小的裝置。它被用於大型企業資料中心、網際網路基礎設施裝置和個人的開發系統。它還為消費類電子產品、行動電話和許多物聯網裝置提供了動力。
在為桌面和企業級裝置構建 Linux 軟體時,開發者通常在他們的構建機器上使用桌面發行版,如 Ubuntu 以便儘可能與被部署的機器相似。如 VirtualBox 和 Docker 這樣的工具使得開發、測試和生產環境更好的保持了一致。
什麼是嵌入式系統?
維基百科將嵌入式系統定義為:“在更大的機械或電氣系統中具有專用功能的計算機系統,往往伴隨著實時計算限制。”
我覺得可以很簡單地說,嵌入式系統是大多數人不認為是計算機的計算機。它的主要作用是作為某種裝置,而不被視為通用計算平臺。
嵌入式系統程式設計的開發環境通常與測試和生產環境大不相同。它們可能會使用不同的晶片架構、軟體堆疊甚至作業系統。開發工作流程對於嵌入式開發人員與桌面和 Web 開發人員來說是非常不同的。通常,其構建後的輸出將包含目標裝置的整個軟體映像,包括核心、裝置驅動程式、庫和應用程式軟體(有時也包括引導載入程式)。
在本文中,我將對構建嵌入式 Linux 系統的四種常用方式進行縱覽。我將介紹一下每種產品的工作原理,並提供足夠的資訊來幫助讀者確定使用哪種工具進行設計。我不會教你如何使用它們中的任何一個;一旦縮小了選擇範圍,就有大量深入的線上學習資源。沒有任何選擇適用於所有情況,我希望提供足夠的細節來指導您的決定。
Yocto
Yocto 專案 定義為“一個開源協作專案,提供模板、工具和方法,幫助您為嵌入式產品建立定製的基於 Linux 的系統,而不管硬體架構如何。”它是用於建立定製的 Linux 執行時映像的配方、配置值和依賴關係的集合,可根據您的特定需求進行定製。
完全公開:我在嵌入式 Linux 中的大部分工作都集中在 Yocto 專案上,而且我對這個系統的認識和偏見可能很明顯。
Yocto 使用 Openembedded 作為其構建系統。從技術上講,這兩個是獨立的專案;然而,在實踐中,使用者不需要了解區別,專案名稱經常可以互換使用。
Yocto 專案的輸出大致由三部分組成:
- 目標執行時二進位制檔案:這些包括引導載入程式、核心、核心模組、根檔案系統映像。以及將 Linux 部署到目標平臺所需的任何其他輔助檔案。
- 包流:這是可以安裝在目標上的軟體包集合。您可以根據需要選擇軟體包格式(例如,deb、rpm、ipk)。其中一些可能預先安裝在目標執行時二進位制檔案中,但可以構建用於安裝到已部署系統的軟體包。
- 目標 SDK:這些是安裝在目標平臺上的軟體的庫和標頭檔案的集合。應用程式開發人員在構建程式碼時使用它們,以確保它們與適當的庫連結
優點
Yocto 專案在行業中得到廣泛應用,並得到許多有影響力的公司的支援。此外,它還擁有一個龐大且充滿活力的開發人員社群和生態系統。開源愛好者和企業贊助商的結合的方式有助於推動 Yocto 專案。
獲得 Yocto 的支援有很多選擇。如果您想自己動手,有書籍和其他培訓材料。如果您想獲得專業知識,有許多有 Yocto 經驗的工程師。而且許多商業組織可以為您的設計提供基於 Yocto 的 Turnkey 產品或基於服務的實施和定製。
Yocto 專案很容易透過 層 進行擴充套件,層可以獨立釋出以新增額外的功能,或針對專案釋出時尚不可用的平臺,或用於儲存系統特有定製功能。層可以新增到你的配置中,以新增未特別包含在市面上版本中的獨特功能;例如,“meta-browser” 層包含 Web 瀏覽器的清單,可以輕鬆為您的系統進行構建。因為它們是獨立維護的,所以層可以按不同的時間釋出(根據層的開發速度),而不是跟著標準的 Yocto 版本釋出。
Yocto 可以說是本文討論的任何方式中最廣泛的裝置支援。由於許多半導體和電路板製造商的支援,Yocto 很可能能夠支援您選擇的任何目標平臺。主版本 Yocto 分支僅支援少數幾塊主機板(以便達成合理的測試和釋出週期),但是,標準工作模式是使用外部主機板支援層。
最後,Yocto 非常靈活和可定製。您的特定應用程式的自定義可以儲存在一個層進行封裝和隔離,通常將要素層特有的自定義項儲存為層本身的一部分,這可以將相同的設定同時應用於多個系統配置。Yocto 還提供了一個定義良好的層優先和覆蓋功能。這使您可以定義層應用和搜尋後設資料的順序。它還使您可以覆蓋具有更高優先順序的層的設定;例如,現有清單的許多自定義功能都將保留。
缺點
Yocto 專案最大的缺點是學習曲線陡峭。學習該系統並真正理解系統需要花費大量的時間和精力。 根據您的需求,這可能對您的應用程式不重要的技術和能力投入太大。 在這種情況下,與一家商業供應商合作可能是一個不錯的選擇。
Yocto 專案的開發時間和資源相當高。 需要構建的包(包括工具鏈,核心和所有目標執行時元件)的數量相當不少。 Yocto 開發人員的開發工作站往往是大型系統。 不建議使用小型膝上型電腦。 這可以透過使用許多提供商提供的基於雲的構建伺服器來緩解。 另外,Yocto 有一個內建的快取機制,當它確定用於構建特定包的引數沒有改變時,它允許它重新使用先前構建的元件。
建議
為您的下一個嵌入式 Linux 設計使用 Yocto 專案是一個強有力的選擇。 在這裡介紹的選項中,無論您的目標用例如何,它都是最廣泛適用的。 廣泛的行業支援,積極的社群和廣泛的平臺支援使其成為必須設計師的不錯選擇。
Buildroot
Buildroot 專案定義為“透過交叉編譯生成嵌入式 Linux 系統的簡單、高效且易於使用的工具。”它與 Yocto 專案具有許多相同的目標,但它注重簡單性和簡約性。一般來說,Buildroot 會停用所有軟體包的所有可選編譯時設定(有一些值得注意的例外),從而生成儘可能小的系統。系統設計人員需要啟用適用於給定裝置的設定。
Buildroot 從原始碼構建所有元件,但不支援按目標包管理。因此,它有時稱為韌體生成器,因為映象在構建時大部分是固定的。應用程式可以更新目標檔案系統,但是沒有機制將新軟體包安裝到正在執行的系統中。
Buildroot 輸出主要由三部分組成:
- 將 Linux 部署到目標平臺所需的根檔案系統映像和任何其他輔助檔案
- 適用於目標硬體的核心,引導載入程式和核心模組
- 用於構建所有目標二進位制檔案的工具鏈。
優點
Buildroot 對簡單性的關注意味著,一般來說,它比 Yocto 更容易學習。核心構建系統用 Make 編寫,並且足夠短以便開發人員瞭解整個系統,同時可擴充套件到足以滿足嵌入式 Linux 開發人員的需求。 Buildroot 核心通常只處理常見用例,但它可以透過指令碼進行擴充套件。
Buildroot 系統使用普通的 Makefile 和 Kconfig 語言來進行配置。 Kconfig 由 Linux 核心社群開發,廣泛用於開源專案,使得許多開發人員都熟悉它。
由於停用所有可選的構建時設定的設計目標,Buildroot 通常會使用開箱即用的配置生成儘可能最小的映象。一般來說,構建時間和構建主機資源的規模將比 Yocto 專案的規模更小。
缺點
關注簡單性和最小化啟用的構建方式意味著您可能需要執行大量的自定義來為應用程式配置 Buildroot 構建。此外,所有配置選項都儲存在單個檔案中,這意味著如果您有多個硬體平臺,則需要為每個平臺進行每個定製更改。
對系統配置檔案的任何更改都需要全部重新構建所有軟體包。與 Yocto 相比,這個問題透過最小的映象大小和構建時間得到了一定的解決,但在你調整配置時可能會導致構建時間過長。
中間軟體包狀態快取預設情況下未啟用,並且不像 Yocto 實施那麼徹底。這意味著,雖然第一次構建可能比等效的 Yocto 構建短,但後續構建可能需要重建許多元件。
建議
對於大多數應用程式,使用 Buildroot 進行下一個嵌入式 Linux 設計是一個不錯的選擇。如果您的設計需要多種硬體型別或其他差異,但由於同步多個配置的複雜性,您可能需要重新考慮,但對於由單一設定組成的系統,Buildroot 可能適合您。
OpenWRT/LEDE
OpenWRT 專案開始為消費類路由器開發定製韌體。您當地零售商提供的許多低成本路由器都可以執行 Linux 系統,但可能無法開箱即用。這些路由器的製造商可能無法提供頻繁的更新來解決新的威脅,即使他們這樣做,安裝更新映象的機制也很困難且容易出錯。 OpenWRT 專案為許多已被其製造商放棄的裝置生成更新的韌體映象,讓這些裝置煥發新生。
OpenWRT 專案的主要交付物是可用於大量商業裝置的二進位制映象。它有網路可訪問的軟體包儲存庫,允許裝置終端使用者將新軟體新增到他們的系統中。 OpenWRT 構建系統是一個通用構建系統,它允許開發人員建立自定義版本以滿足他們自己的需求並新增新軟體包,但其主要重點是目標二進位制檔案。
優點
如果您正在為商業裝置尋找替代韌體,則 OpenWRT 應位於您的選項列表中。它的維護良好,可以保護您免受制造商韌體無法解決的問題。您也可以新增額外的功能,使您的裝置更有用。
如果您的嵌入式設計專注於網路,則 OpenWRT 是一個不錯的選擇。網路應用程式是 OpenWRT 的主要用例,您可能會發現許多可用的軟體包。
缺點
OpenWRT 對您的設計限制很多(與 Yocto 和 Buildroot 相比)。如果這些決定不符合您的設計目標,則可能需要進行大量的修改。
在部署的裝置中允許基於軟體包的更新是很難管理的。按照其定義,這會導致與您的 QA 團隊測試的軟體負載不同。此外,很難保證大多數軟體包管理器的原子安裝,以及錯誤的電源迴圈可能會使您的裝置處於不可預知的狀態。
建議
OpenWRT 是愛好者專案或商用硬體再利用的不錯選擇。它也是網路應用程式的不錯選擇。如果您需要從預設設定進行大量定製,您可能更喜歡 Buildroot 或 Yocto。
桌面發行版
設計嵌入式 Linux 系統的一種常見方法是從桌面發行版開始,例如 Debian 或 Red Hat,並刪除不需要的元件,直到安裝的映象符合目標裝置的佔用空間。這是 Raspberry Pi 平臺流行的 Raspbian發行版的方法。
優點
這種方法的主要優點是熟悉。通常,嵌入式 Linux 開發人員也是桌面 Linux 使用者,並且精通他們的選擇發行版。在目標上使用類似的環境可能會讓開發人員更快地入門。根據所選的分佈,可以使用 apt 和 yum 等標準封裝工具安裝許多其他工具。
可以將顯示器和鍵盤連線到目標裝置,並直接在那裡進行所有的開發。對於不熟悉嵌入式空間的開發人員來說,這可能是一個更為熟悉的環境,無需配置和使用棘手的跨開發平臺設定。
大多數桌面發行版可用的軟體包數量通常大於前面討論的嵌入式特定的構建器可用軟體包數量。由於較大的使用者群和更廣泛的用例,您可能能夠找到您的應用程式所需的所有執行時包,這些包已經構建並可供使用。
缺點
將目標平臺作為您的主要開發環境可能會很慢。執行編譯器工具是一項資源密集型操作,根據您構建的程式碼的多少,這可能會嚴重妨礙您的效能。
除了一些例外情況,桌面發行版的設計並不適合低資源系統,並且可能難以充分裁剪目標映像。同樣,桌面環境中的預設工作流程對於大多數嵌入式設計來說都不理想。以這種方式獲得可再現的環境很困難。手動新增和刪除軟體包很容易出錯。這可以使用特定於發行版的工具進行指令碼化,例如基於 Debian 系統的 debootstrap。為了進一步提高可再現性,您可以使用配置管理工具,如 CFEngine(我的僱主 Mender.io 完整披露了 這一工具)。但是,您仍然受發行版提供商的支配,他們將更新軟體包以滿足他們的需求,而不是您的需求。
建議
對於您打算推向市場的產品,請謹慎使用此方法。這對於愛好者應用程式來說是一個很好的模型;但是,對於需要支援的產品,這種方法很可能會遇到麻煩。雖然您可能能夠獲得更快的起步,但從長遠來看,您可能會花費您的時間和精力。
其他考慮
這個討論集中在構建系統的功能上,但通常有非功能性需求可能會影響您的決定。如果您已經選擇了片上系統(SoC)或電路板,則您的選擇很可能由供應商決定。如果您的供應商為特定系統提供板級支援包(BSP),使用它通常會節省相當多的時間,但請研究 BSP 的質量以避免在開發週期後期發生問題。
如果您的預算允許,您可能需要考慮為目標作業系統使用商業供應商。有些公司會為這裡討論的許多選項提供經過驗證和支援的配置,除非您擁有嵌入式 Linux 構建系統方面的專業知識,否則這是一個不錯的選擇,可以讓您專注於核心能力。
作為替代,您可以考慮為您的開發人員進行商業培訓。這可能比商業作業系統供應商便宜,並且可以讓你更加自給自足。這是快速找到您選擇的構建系統基礎知識的學習曲線。
最後,您可能已經有一些開發人員擁有一個或多個系統的經驗。如果你的工程師有傾向性,當你做出決定時,肯定值得考慮。
總結
構建嵌入式 Linux 系統有多種選擇,每種都有優點和缺點。將這部分設計放在優先位置至關重要,因為在以後的過程中切換系統的成本非常高。除了這些選擇之外,還有新的系統在開發中。希望這次討論能夠為評估新的系統(以及這裡提到的系統)提供一些背景,並幫助您為下一個專案做出堅實的決定。
via: https://opensource.com/article/18/6/embedded-linux-build-tools
作者:Drew Moseley 選題:lujun9972 譯者:LHRChina 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出
相關文章
- 嵌入式Linux系統構建Linux
- 推薦適用於linux系統管理員的GUI工具!LinuxGUI
- C++構建工具-構建系統C++
- 用於 Linux 桌面的 4 個掃描工具Linux
- 基於Hyperf + Vue + Element 構建的後臺管理系統(內建聊天系統)Vue
- 基於模擬的數字孿生系統構建與應用
- Linux嵌入式系統開發,嵌入式Linux開發教程Linux
- 用 Python 構建你自己的 RSS 提示系統Python
- Linux系統下常用的3種網路測速工具!Linux
- i.MX6ULL終結者Linux檔案系統的構建BusyBox構建根檔案系統Linux
- 如何使用NodeJS構建基於RPC的API系統NodeJSRPCAPI
- 嵌入式系統開發:基於Linux學習筆記整理Linux筆記
- 嵌入式Linux—輸入子系統Linux
- 嵌入式Linux系統libmosquitto移植概述LinuxIBMUI
- 【分享】Linux系統下3種常用的網路測速工具!Linux
- Linux系統磁碟資料修復工具,建議收藏!Linux
- 「譯」如何使用 NodeJS 構建基於 RPC 的 API 系統NodeJSRPCAPI
- C/C++ 構建系統,我用 xmakeC++
- 智慧金融系統的構建
- 基於多雲構建監控告警系統
- 基於指標管理系統建設的BI工具推薦指標
- 構建屬於自己的 Linux 發行版Linux
- 嵌入式linux系統的開發——基於JFSS2檔案系統的分割槽及映象製作Linux
- 使用 Ansible 在樹莓派上構建一個基於 Linux 的高效能運算系統樹莓派Linux
- 教你用 buildroot 構建根檔案系統UI
- 從原始碼構建一個極簡的Linux作業系統原始碼Linux作業系統
- 【工具推薦】4款實用性超高的Linux ssh工具!Linux
- ProseMirror - 用於在Web上構建富文字編輯器的工具包ROSWeb
- 構建基於 HarmonyOS Next 的分散式工業監控系統分散式
- 問題解決:構建基於深度學習架構的推薦系統!深度學習架構
- 【嵌入式系統】STM32串列埠通訊的四種方法(基於RTOS)串列埠
- 深入淺出的webpack4構建工具--webpack4+react構建環境(二十)WebReact
- QuillCMS – 基於Nodejs、Nuxtjs、MongoDB構建內容管理系統UINodeJSUXMongoDB
- ARM嵌入式系統啟動架構研究架構
- 關於linux類系統的操作Linux
- 關於學習 Linux 系統結構的一些總結Linux
- 嵌入式Linux作業系統學習規劃Linux作業系統
- 構建 Go 應用 docker 映象的十八種姿勢GoDocker