導讀 | 瞭解 Yocto、Buildroot、 OpenWRT,和改造過的桌面發行版以肯定哪一種方式最適合你的項目。 |
Linux 被部署到比 Linus Torvalds 在他的宿舍裏開發時所預期的更普遍的設備。使人震驚的支持了各類芯片,使得Linux 能夠應用於大大小小的設備上:從 IBM 的巨型機到不如其鏈接的端口大的微型設備,以及各類大小的設備。它被用於大型企業數據中心、互聯網基礎設施設備和我的的開發系統。它還爲消費類電子產品、移動電話和許多物聯網設備提供了動力。html
在爲桌面和企業級設備構建 Linux 軟件時,開發者一般在他們的構建機器上使用桌面發行版,如 Ubuntu 以便儘量與被部署的機器類似。如 VirtualBox 和 Docker 這樣的工具使得開發、測試和生產環境更好的保持了一致。linux
什麼是嵌入式系統?編程
維基百科將嵌入式系統定義爲:「在更大的機械或電氣系統中具備專用功能的計算機系統,每每伴隨着實時計算限制。」bootstrap
我以爲能夠很簡單地說,嵌入式系統是大多數人不認爲是計算機的計算機。它的主要做用是做爲某種設備,而不被視爲通用計算平臺。瀏覽器
嵌入式系統編程的開發環境一般與測試和生產環境大不相同。它們可能會使用不一樣的芯片架構、軟件堆棧甚至操做系統。開發工做流程對於嵌入式開發人員與桌面和 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 系統有多種選擇,每種都有優勢和缺點。將這部分設計放在優先位置相當重要,由於在之後的過程當中切換系統的成本很是高。除了這些選擇以外,還有新的系統在開發中。但願此次討論可以爲評估新的系統(以及這裏提到的系統)提供一些背景,並幫助您爲下一個項目作出堅實的決定。