在物联网的设备设计中,从低成本和低功耗的角度看,Android肯定比不过嵌入式Linux。但在选择用于部署Linux的发行版本时,却一直饱受困扰。
什么是 Linux 发行版?
Linux 是一个操作系统,它是控制计算机的核心程序。 它决定如何在所有竞争使用的其他程序之间分配可用资源(CPU、内存、磁盘、网络)。 尽管操作系统非常重要,但它本身并不有用。 它的目的是为其他程序管理计算资源。 没有这些程序,操作系统就没有多大用处。
这就是为什么发行版会有的问题。 一个发行版提供了大量的其他程序,这些程序可以与 Linux 一起组装成用于大量目的的工作集。 这些程序的范围可以从基本的程序编写工具,如编译器和连接器的通信库,到电子表格和编辑器之间的几乎所有东西。 一种倾向于拥有一个超级集合,其中包含了每个单独的计算机或解决方案实际使用的内容。 它还为每一类软件组件提供了许多选择,用户或公司可以将这些组件组装成他们认为的运行集。 一个粗略的比喻是一个超市,在那里货架上有许多商品可供选择,每个用户选择他们认为有意义的商品。
基于二进制还是基于源代码的发行版?
发行版大体上可以分为两类: 二进制和基于源代码的发布。
基于二进制的发行版提供了所有已经预先编译并准备安装的软件组件。 这些组件使用"足够好"的构建选项进行编译,这些选项对大多数用户都有效。 它们还为需要或希望编制自己的组件的少数用户提供这些组件的来源。 按照我们超市的类比,这家超市包含所有预包装和预煮好的食物,但是有明确的说明如何获得配料和重复的过程,为那些想要调整一个或两个食谱。 这种发行版是 Debian、 Fedora Core、 OpenSUSE、 Ubuntu 和许多其他发行版的例子。 虽然它们提供相同类型的系统,但是它们都使用不同的方法,不幸的是,这些方法甚至是不兼容的。 它们是通用计算机,如服务器、台式机和笔记本电脑的主要配置。
另一方面,基于源代码的发行版侧重于提供一个框架,在这个框架中,最终用户可以从源代码构建所有组件本身。 这些发行版还提供了一些工具,可以轻松地选择一个合理的开始组件集合,并根据需要调整每个组件的构建。 这些调整可以简单到添加一个编译标志来使用不同版本的源代码,或者以某种方式修改源代码。 用户将收集他们想要构建的内容的菜单,然后开始构建。 在几分钟或几小时后,根据具体情况,将有一个结果镜像,可以使用在电脑中使用这一。 Gentoo、安卓和 Yocto 就是这种类型的例子。 在超市的类比中,这是一个更接近散装食品商店,在那里可以得到预先衡量的食物与详细的机器可读的烹饪说明,会有一个花哨的炊具,可以读取这些说明, 并处理一系列食谱的调整,如调整为糙米而不是白米。 这个类比稍微弱了一点。
这些基于源代码的发行版通常是基于 linux 的嵌入式设备和物联网设备的首选。 虽然很难建立和维护,但基于源代码的发行版有一个独特的优势,即能够根据确切的目标硬件裁剪已安装的镜像,以便最大限度地利用资源或最小化资源浪费。 而对于嵌入式设备,这往往是一个强大的约束。 此外,基于源代码的发行版更适合于跨平台构建(在这里构建平台的机器与运行平台的机器不同) ,而基于二进制的发行版更适合于自主构建(在同一台机器上构建和运行)。
鉴于目前英特尔(Intel)架构的流行程度,以及在物联网产品中使用的ARM 架构——交叉构建支持对物联网设备非常重要。
以容器为中心的发行版
传统的 Linux 方法是运行一个单个统一的用户空间,包含了内核之外的所有平台,这种方式正在发生变化。 这个新模型是关于拥有一个"容器"集合,使用户空间成为组件。 容器化模型将用户空间的一部分转换为每个组件之间高度独立性的组件集合。
容器化装载带来了许多好处,从而允许团队更加独立地实现粒状平台升级的可行性。 不利的一面是,它们比非容器化的解决方案有更大的资源占用。 然而,如果技术的发展展示了什么,那就是当一项新技术唯一的缺点是尺寸大小时,那它所拥有的资源往往会扩大。
下面将描述一些早期的选项,以便与现有的发行版进行比较。
物联网 Linux 发行版
浏览一下有争议的领域。 许多人都有自己喜欢的 Linux 发行版,即使他们的需求发生了巨大的变化(例如从服务器设置到嵌入式 IoT 设备) ,他们仍然坚持这种方式,就像把一个方形的钉子装进一个圆形的洞里。
下面是一些已经建立的 Linux 发行版和一些新兴的 Linux 发行版。 还有许多其他用例,可能更适合某些用例。
Yocto
Yocto 是一个基于源代码的发行版,用于许多嵌入式和物联网设备。 它试图将基于二进制发行版的好处结合在一起,例如将包和它们的依赖关系清晰地分离出来,同时利用基于源代码的发行的好处,当做出较小的修改时,可以在很大程度上改变目标二进制文件。
Yocto 由一系列配方组成,每个配方都描述了如何构建系统的一个模块(例如库、守护程序、应用程序等)。 然后被分层收集,并配置它们应该如何一起使用的各个方面,从编译标记到功能特性,再到它们如何显示的详细信息。 每个目标构建将由几个这样的层组成,每个层从较低的层添加或删除包,或者修改它们的默认行为。 这允许多方调整自己的分层来影响最终的镜像。 因此,如果基本层使用一组编译器标志(通常是这样) ,芯片供应商可以添加有利于特定芯片模型的编译器标志,而电路板供应商可以删除他们的电路板可能不支持的芯片功能。
对于物联网产品而言,这实际意味着使用已经支持 Yocto 的板子来构建一个解决方案的努力将是添加或修改基本功能之上的附加值。 虽然在当今的容器世界中这并不太难做到,但还是需要建立一个允许为目标创建镜像的构建和组态管理 / 值基础设施设置。
同样值得一看的是,Yocto 在开发项目上的支持程度,进而考虑物联网的解决方案。
Debian
Debian 是一个受人尊敬的基于二进制的开源发行版。 它既是发行版,也是其他知名衍生发行版(其中最著名的是 Ubuntu)的基线。
Debian 拥有大量已经预先为 ARM (物联网的选择架构)构建的软件包,但是这些软件包的 ARM 二进制文件的支持和维护水平往往远远低于英特尔的同类产品。 因此,"10,000 + 包"等度量标准并不是那么有意,需要了解那些对用户来说很重要的软件包以及它们的支持程度。
在自主安装使用的许多发行版(例如 Debian)中的一个缺点是,开发人员不理解或者不记得最终运行在机器上的包可能无法完成安装,因此他们不能依赖于目标机器的任何功能。 考虑到这种麻烦对于 docker 环境来说也是一个头疼的问题,发行版已经花费了很大的精力来清理这些依赖项,所以这个问题比以前要小。
为一小组软件集建立一个构建环境的努力是微不足道的,但是为系统构建所有软件包的基础结构可能会变得非常重要。
正因为如此,Debian 对 IoT 来说是一个不错的选择,在这种情况下,只需要添加或创建一些软件包来完成您的平台。
EdgeX Foundry
在严格意义上,EdgeX Foundry 并不是一个发行版,因为它对发行版中的 BSP组成部分没有任何关注。 BSP是包含 Linux 内核本身的部分,设备驱动程序和库使硬件平台成为可能。 它从一个层面开始,需要一个工作的 Linux 系统和 docker 的支持作为底层基础。 它提供了各种各样的容器,为物联网设备提供丰富的中间件和垂直设备,特别是边缘设备中(在 docker parlance 中,容器是一个独立的模块,通常提供一个垂直的功能,如数据库或 web 服务,几乎没有或根本不依赖主机操作系统、库等)。
Edgex 背后的概念为更大的物联网设备,特别是为边缘设备指明了前进的方向,但是还需要做的工作是定义一个更有约束的版本,提供一套良好的基线服务。 在这方面已经取得了进展,一些服务从 JVM 转移到了 golang 为基础的实现,但是基于 Linux 的中低端物联网在不久的将来仍然是遥不可及的。
Foundries.io Microplatform
这种方案使用基于 Yocto 的方法创建了一个 Linux 平台,创建了一个板级支持层,然后在上面叠加一套集装箱式的微服务。 他们的集装箱是一个比 EdgeX Foundry 方法更小、更适中的集合,足迹更小。
虽然可以通过订阅使用自动更新和管理的完全访问 Foundries.io 产品,底层平台是开源的。
结论
基于 linux 的物联网正在从传统的嵌入式模型向更加灵活的模型转变,从单一的团队 / 工具链 / 模型转变为更加灵活的固件、中间件和应用组件的分离。 然而,这种迁移不是没有成本的,并且对 CPU、内存和磁盘需求提出了更高的要求。 为了一个物联网项目选择一个 Linux 基准,需要考虑自己能承受的尺寸大小和产品规划的寿命。 更小、更快速的替换产品最好能够紧跟当今可靠的解决方案,比如 Yocto。 为了能够提供更多资源并且需要将新特性作为一种需求推广到已部署产品的产品,应该将更主流的 Linux 发行版和新的以容器为中心的解决方案作为前进的路径。