用于物聯(lián)網(wǎng)設(shè)備的Linux發(fā)行版
傳統(tǒng)上,在選擇用于部署Linux的發(fā)行版時,面臨著很多麻煩。
什么是Linux發(fā)行版(Linux Distribution)?
Linux是一個操作系統(tǒng):該程序是控制計算機的核心。它決定如何在爭奪它的所有其他程序之間劃分可用資源(CPU,內(nèi)存,磁盤,網(wǎng)絡(luò))。操作系統(tǒng)雖然非常重要,但它本身并沒有用。其目的是管理其他程序的計算資源。沒有這些其他程序,操作系統(tǒng)就無法實現(xiàn)很多目的。
這就是發(fā)行版的來源。發(fā)行版提供了許多其他程序,這些程序與Linux一起可以組裝到工作集中用于多種用途。這些程序的范圍從基本的程序編寫工具(例如編譯器和鏈接器,到通信庫,再到電子表格和編輯器),到介于兩者之間的幾乎所有內(nèi)容。發(fā)行版往往具有每個計算機或解決方案實際使用的超集。它還為用戶或公司可以組合成他們認(rèn)為是工作集的每種軟件組件類別提供了許多選擇??梢源致缘乇扔鳛橐患页校诔兄胸浖苌嫌泻芏辔锲房晒┻x擇,每個用戶都可以從購物車中選擇對他們有意義的物品。
基于二進(jìn)制的分發(fā)還是基于源的分發(fā)?
分發(fā)可以大致分為兩類:基于二進(jìn)制的和基于源的。
基于二進(jìn)制的發(fā)行版提供了所有已經(jīng)預(yù)編譯并準(zhǔn)備安裝的軟件組件。這些組件使用“足夠好”的構(gòu)建選項進(jìn)行編譯,這些選項對于大多數(shù)用戶來說都可以正常工作。它們也確實為少數(shù)需要或想要編譯自己的組件的用戶提供了這些組件的資源。Debian,F(xiàn)edora Core,OpenSUSE,Ubuntu和其他許多版本都體現(xiàn)了這種發(fā)行方式。盡管它們提供相同類型的系統(tǒng),但它們都使用不同的方法(不幸的是,不兼容)來這樣做。它們是服務(wù)器,臺式機和筆記本電腦等通用計算機中使用的主要分發(fā)方式。
另一方面,基于源代碼的發(fā)行版?zhèn)戎赜谔峁┮粋€框架,在這個框架中,最終用戶可以從源代碼構(gòu)建所有組件。這些發(fā)行版還提供了一些工具,可以方便地選擇組件的合理起始集合,并根據(jù)需要調(diào)整每個組件的構(gòu)建。這些調(diào)整可以簡單到添加編譯標(biāo)志以使用不同版本的源或以某種方式修改源。用戶將組裝一個他們想要構(gòu)建的菜單,然后開始構(gòu)建。幾分鐘或幾小時后,視情況而定,他們將得到一個系統(tǒng)軟件,可以用于他們的計算機。這種發(fā)行版的例子有Gentoo、Android和Yocto。
通常,這些基于源的發(fā)行版通常對于嵌入式基于Linux的設(shè)備尤其是IoT設(shè)備是首選。 盡管它們難以設(shè)置和維護(hù),但基于源的發(fā)行版具有獨特的優(yōu)勢,即能夠根據(jù)實際的目標(biāo)硬件定制已安裝的映像,以最大程度地利用資源或最大程度地減少資源浪費。 對于嵌入式設(shè)備而言,這往往是一個強大的約束。 此外,基于源代碼的發(fā)行版更適合交叉構(gòu)建(在該平臺上,構(gòu)建平臺的計算機與在其上運行的計算機不同),而基于二進(jìn)制的發(fā)行版則更適合于自托管構(gòu)建。 您在同一臺機器(或同一體系結(jié)構(gòu))上構(gòu)建并運行。
鑒于當(dāng)今普遍存在使用英特爾架構(gòu)機器作為構(gòu)建機器以及將ARM體系結(jié)構(gòu)用于IoT產(chǎn)品的情況,跨構(gòu)建支持對于IoT設(shè)備至關(guān)重要。
以容器為中心的發(fā)行版
傳統(tǒng)的Linux方法只提供內(nèi)核外部所有平臺的單個統(tǒng)一用戶空間。新模型是關(guān)于將用戶空間組成一個“容器(containers)”的集合。容器化模型將用戶空間的一部分轉(zhuǎn)換為組件的聯(lián)合集合,每個組件之間具有高度獨立性。
容器化的linux發(fā)行版帶來了許多好處,從允許團(tuán)隊更加獨立地工作到使進(jìn)行細(xì)粒度平臺升級成為可能。缺點是它們比非容器化解決方案占用的空間更大。然而,如果說技術(shù)的發(fā)展給我們帶來了什么啟示的話,那就是當(dāng)一項新技術(shù)的唯一缺點是它的占用空間時,其可用資源往往會擴大,從而使每一代新問題都變得越來越小。
下面將介紹一些早期的選項,以便與現(xiàn)有的發(fā)行版進(jìn)行比較。
物聯(lián)網(wǎng)的Linux發(fā)行版
現(xiàn)在,我們必須深入探討有爭議的領(lǐng)域。許多人擁有自己喜歡的Linux發(fā)行版,即使他們的需求發(fā)生了巨大變化(例如,從服務(wù)器設(shè)置更改為嵌入式IoT設(shè)備),他們?nèi)匀粓猿质褂迷摪l(fā)行版。
我將在下面的列表中開始介紹:這是一些成熟的Linux發(fā)行版和一些后起之秀的示例。還有許多其他的存在,可能更適合一些用例。
1. Yocto
Yocto(https://www.yoctoproject.org/)是基于源的發(fā)行版,已在許多嵌入式和IoT設(shè)備中使用。它試圖將基于二進(jìn)制的發(fā)行版的好處(例如,將程序包及其依賴項明確分離)與基于源的發(fā)行版的好處結(jié)合在一起,后者使您可以在進(jìn)行較小的更改時以顯著的方式更改目標(biāo)二進(jìn)制文件。
Yocto由一系列配方(recipes)組成,每個配方都描述了如何構(gòu)建系統(tǒng)的一個模塊(例如,庫,守護(hù)程序,應(yīng)用程序等)。然后將這些配方收集到各層中,這些層收集一系列配方并配置應(yīng)如何一起使用的各個方面,從編譯標(biāo)志到配方功能,再到有關(guān)它們?nèi)绾物@示在目標(biāo)上的詳細(xì)信息。每個目標(biāo)構(gòu)建都將由這些層中的一些層組成,每個層都在較低層中添加或刪除軟件包,或修改其默認(rèn)行為。這允許多方調(diào)整他們自己的二進(jìn)制映像以影響最終軟件。 因此,如果基礎(chǔ)層使用保守的一組編譯器標(biāo)志(通常這樣做),則芯片供應(yīng)商可以添加對其特定芯片模型有利的編譯器標(biāo)志,而主板供應(yīng)商可以刪除其主板可能不支持的芯片功能。
對于您的物聯(lián)網(wǎng)產(chǎn)品,這實際上意味著您使用已經(jīng)支持Yocto的主板來構(gòu)建解決方案的努力將是添加或修改配方,以提供基本功能的增值。您還需要具有一個構(gòu)建和配置管理基礎(chǔ)結(jié)構(gòu)設(shè)置,該設(shè)置允許您為目標(biāo)創(chuàng)建映像,盡管在當(dāng)今的容器世界中,這并不難做。
關(guān)于Yocto的更多信息,請從這里
(https://www.yoctoproject.org/docs/2.5/overview-manual/overview-manual.html)開始。同樣值得一提的是,在你考慮的物聯(lián)網(wǎng)解決方案中,Yocto在任何開發(fā)板上的支持程度如何。
2. Debian
Debian(https://www.debian.org/)是一種古老的開源二進(jìn)制發(fā)行版。它既是自身的發(fā)行版,也是其他知名衍生版本的基準(zhǔn),其中最著名的是Ubuntu(https://www.ubuntu.com/)。
Debian擁有大量為ARM(IoT的首選體系結(jié)構(gòu))預(yù)先構(gòu)建的軟件包,但考慮到Debian在英特爾生態(tài)系統(tǒng)中的優(yōu)勢,這些軟件包對ARM二進(jìn)制文件的支持和維護(hù)水平往往遠(yuǎn)低于英特爾的同類產(chǎn)品。因此,諸如“10000多個構(gòu)建的包”這樣的指標(biāo)并沒有那么有意義。您需要了解對您很重要的包以及它們的支持程度。
在自托管設(shè)置(例如Debian)中使用的許多發(fā)行版的一個缺點是,開發(fā)人員不理解或不記得包的安裝可能不會在最終運行包的計算機上完成,因此他們不能依賴目標(biāo)可用的任何功能??紤]到這種麻煩對于docker環(huán)境來說也是一個頭疼的問題,發(fā)行版在清理這些依賴關(guān)系方面花費了大量精力,所以這是一個比以前更小的問題。
為少量軟件包設(shè)置構(gòu)建環(huán)境的工作相當(dāng)瑣碎,但是為系統(tǒng)構(gòu)建所有軟件包的基礎(chǔ)架構(gòu)可能會變得很重要。
由于這些原因,IoT的Debian是一個不錯的選擇,在這種情況下,您只需添加或創(chuàng)建一些軟件包即可完成您的平臺。
3. EdgeX Foundry
從嚴(yán)格意義上講,EdgeX Foundry并不完全是一個發(fā)行版,因為它對發(fā)行版的BSP組件沒有任何意見。BSP是包含Linux內(nèi)核本身,設(shè)備驅(qū)動程序和用于啟用硬件平臺的庫的部分。它從一個更高的級別開始,需要一個以docker支持為基礎(chǔ)的可運行Linux系統(tǒng)。從那里開始,它提供了各種各樣的容器,這些容器為IoT設(shè)備(尤其是邊緣設(shè)備)提供了豐富的中間件和垂直集(在docker看來,容器是一個獨立的模塊,通常提供垂直功能,例如數(shù)據(jù)庫或幾乎不依賴主機操作系統(tǒng)、庫等的網(wǎng)絡(luò)服務(wù))。

EdgeX Foundry背后的概念為大型IoT設(shè)備(尤其是邊緣設(shè)備)指明了前進(jìn)的方向,但是要定義更受約束的版本以提供一組良好的基準(zhǔn)服務(wù)仍有待完成。在這方面已經(jīng)取得了一些進(jìn)展,一些服務(wù)已從JVM遷移到基于golang的實現(xiàn),但是在不久的將來,對于基于低端和中端Linux的IoT來說,其覆蓋范圍仍然遙不可及。
3. Foundries.io Microplatform

Foundries.io使用基于Yocto的方法創(chuàng)建了一個Linux平臺,以創(chuàng)建板支撐層,然后在其之上分層一組容器化的微服務(wù)。與EdgeX Foundry方法相比,它們的容器集更小,更適中,而且占用可見更小。
雖然可以通過訂閱完全訪問Foundries.io產(chǎn)品并進(jìn)行自動更新和管理,但底層平臺是開源的,并且是可用的。
小結(jié)
基于Linux的IoT正在從傳統(tǒng)的嵌入式模型開始遷移,在傳統(tǒng)的嵌入式模型中,將完整的垂直解決方案從單個團(tuán)隊/worldwiew/toolchain/model創(chuàng)建到更靈活的模型,其中固件,電路板,中間件和應(yīng)用程序組件的分離程度更高。 但是,這種遷移并非沒有代價,并且對CPU,內(nèi)存和磁盤的要求也更高。
為了為您的下一個物聯(lián)網(wǎng)項目選擇Linux基準(zhǔn),您需要考慮您可以負(fù)擔(dān)的占用空間和產(chǎn)品壽命。體積更小,更換速度更快的產(chǎn)品最好與Yocto等當(dāng)今久經(jīng)考驗的真正解決方案保持一致。能夠提供更多資源并需要將新功能部署到已部署產(chǎn)品中的產(chǎn)品應(yīng)考慮使用更主流的Linux發(fā)行版和以容器為中心的新解決方案作為前進(jìn)的道路。