从开发人员到设备与OTA更新- Eystein Stenberg, Mender.io
在本节课中,我们将介绍Mender Hub、Artifactory和Mender over- air (OTA)更新管理器如何为具有OTA功能的连接设备产品提供交钥匙CI/CD支持,以服务于物联网的整个生命周期。hth华体会最新官方网站
我们将介绍Yocto项目,这是一个构建系统,用于为指定的目标设备创建具有软件和硬件支持的定制嵌入式Linux。这是目前在IoT设备上运行Linux的最流行方法。
Mender Hub包含一个社区存储库,用于支持各种不同设备上的无线(OTA)更新,其中大多数设备都与Yocto项目集成。
与Mender Hub集成的CI/CD创建磁盘映像和Mender Artifacts自动构建、测试并上传到JFrog Artifactory。从JFrog Artifactory,选择的设备图像自动上传到一个Mender服务器,该服务器将它们部署到设备上。
这就创建了从开发源(包括应用程序软件和完整的Linux定制)到设备的完整的端到端循环。这不仅可以加快开发周期,因为可以频繁地测试完整的构建,还可以确保一旦设备发布到现场,就可以通过空中远程更新。
视频记录
好了各位,谢谢你们过来。是时候开始了。今天有多少人和基特一起去了主题演讲?最后一个?你们大多数人。Mender是他在自动驾驶汽车演示中展示的工具之一。你也可以在楼上看到。所以这是一种部署方案。我的名字是Iceland Stanburg,我们将讨论CICD管道以及它在物联网世界中是如何工作的。
你可能听说过这个故事,但这样的故事很多,所以有时会被忽略。但这是关于菲亚特克莱斯勒的故事。我们正在更新车内的信息娱乐系统。结果是,很多这样的汽车,在信息娱乐系统上进入了一个持续的重启循环,你可以看到你的摄像头,你可以调整温度或改变音乐。所以它们基本上无法使用。所以你可以看到你连接的这条推文,我们的工程团队正在调查原因,并在这个紧张的时期努力解决问题。问题是你们中谁愿意成为这个工程团队的一员?所以这就是这次会议的内容,比如我们如何更好地做到这一点,以及它在物联网和汽车领域意味着什么?
快速的介绍。我的名字和爱因斯坦很像,我觉得这是个意外,但这样很容易记住。我在系统管理方面工作了大约10年,既在云数据中心领域,也在物联网领域,现在使用的是Mender,这是一种空中更新程序。因此,它允许您以健壮和安全的方式将软件从中心位置部署到物联网设备上,而且它也是开源的。重点是我认为考虑到这一点,你在这里,你可能,我是在说教,但我认为你应该为CICD管道使用专业工具,因为如你所知,当糟糕的事情发生时,事情不会向前发展,如果你部署了糟糕的软件或以糟糕的方式部署软件,也可能导致客户问题,就像我们之前看到的那样。这样做还可以节省开发时间。
如果你看一下物联网过度简化的开发过程,它是这样的。我们在做原型,这是典型的树莓派板。也许它是一个[听不清00:02:58],一些开发板,你可以很容易地把你的代码出来,它有你需要的所有硬件功能。然后进入产品设计。现在你要考虑的是,我卖给客户的电路板或产品上是否需要wifi ?我是否需要其他网络连接?我需要HTMI输出吗?你为什么要这么做?为什么不用同样的板子呢?原因是这样可以节省成本。 So if you can save 50 cents on removing the wifi module, hardware module, if you don’t need it and you’re making a hundred thousand boards, that’s $50,000 if you’re making more, that’s more obviously.
所以这就是为什么你进入这种生产设计阶段,你试图降低成本。这也是你开始考虑操作系统的地方,我有什么样的软件,你有多大的存储空间?所以当你经历这些的时候,我想大多数技术发展发生的时候,你通常会在某种发布截止日期的恐慌中结束。这是我们至少看到的。推出产品有压力,这里也涉及到制造,因为在很多方面,你可能认为物联网是下一代技术,或者在加德纳有很多关于物联网的讨论,但在某种程度上,这也是一种倒退。原因是现在你又在处理实体产品,所以你必须在装配线上工作,并在中国以廉价的方式与制造商建立关系。hth华体会最新官方网站这是需要记住的。很明显,为了大规模生产,你必须做好计划,这意味着你有一个最后期限,或者你必须完成开发的最后期限通常很紧迫。
当然,工程师们注意到也会有bug,所以你知道,当你进入这个周期的最后,通常会发生什么,在我们开始创建Mender之前,我们已经与超过100个嵌入式开发人员交谈过,但通常会发生的是你创建了某种后门,对吧?所以我可以用简单的方法更新设备。也许SSH是开放的,所以它是一种快速的方式,让你能够部署没有计划好的新版本。当然,这是您在设计阶段应该考虑CICD的地方。当然,这也是JFrog正在做的事情的一部分。
这样做的目的是您可以获得更快的迭代周期。你有一个更强大的渠道。所以可能会有一点前期投资,但如果你早期设计,你也可以在测试中使用它。你可以建立一个测试环境,你可以在那里部署新的软件,新的版本,可能是每晚的构建,并确保在整个产品开发生命周期中都能正常工作。当然,一旦你进入大众市场,你也可以使用同样的系统。你会避免这种召回和压力就像你在第一张图中看到的,工程团队会经历的。
是的。你们中有多少人会说你们主要从事云基础设施或云开发应用?是的。你们中有多少人参与过物联网或嵌入式开发?好的,一,二。是的,你们大多数人都在云端工作。对你们来说,我猜这是一个很熟悉的画面。因此CICD管道,你会让一些开发人员提交一些代码,这些代码最终会出现在CI服务器上。你可以在此基础上构建Docker映像,然后与Kubernetes进行一些集成。在这里,你将从Docker注册表中提取构建的映像,并在Kubernetes中部署一个新的pod。 So that’s kind of the state of the art in the cloud or data center world today and web services. So what you might ask is, can we just repeat this? Now we’re working with IOT devices. Can we do this the same way?
在回答这个问题之前,我们来看看,我想这是最简单的构造块形式。显然你会有一些源代码。否则一切都没有意义。然后你将需要一些持续集成服务,所以Jenkins或这些工具之一。它所做的显然是把不同的资源集中在一起。它构建它们,你可以测试它们,然后你得到某种构建工件。如果你只是在做持续集成,你可以下载它,但如果你也在做持续交付,你也需要一个部署系统来把这个软件提供给你的客户。无论如何,即使不是完全自动化的,你也需要某种方法来完成这项工作。否则,通常在一开始就没有那么多开发软件的意义。当然,如果你做的是大规模的,如果你有大规模的设备,你可以更高级一点,你可以先部署到某种分期环境,然后你可以通过喜欢最新功能的满意客户来部署它。 And then you go to the entire environment. So if you’re having a million devices out there, you probably don’t want to deploy it to them all at the same time. So this is just one way of mitigating the risk of deployments.
如果我们再深入一步,看看物联网中的源代码,如果你在使用云网络服务源代码,它通常是应用程序,对吧?你有一些在Docker内部运行的服务或者你有,是的,它可以是浏览器将显示的一组web浏览器文件或者某种提供API的服务。所以你想到的是应用程序,但如果你看看物联网源代码实际上比应用程序多得多因为现在你要交付整个设备,对吧?所以它是一块硬件,你必须在这块硬件上有完整的软件堆栈才能运行你的应用程序。老实说,这就是物联网变得有点复杂的地方,因为有太多的选择和太多的供应商,这是一个非常复杂的生态系统。如果你看一下底层,你肯定需要一些操作系统。所以如果你在使用Linux,你可能会想看看Yocto项目,Kit在主题演讲中也提到过,它展示了[听不清00:11:02]伟大的Linux是基于的。除此之外,你还需要一些所谓的董事会支持包。这基本上是一组驱动程序或一种方式,让你的操作系统支持所有外设,并使你的设备基本上启动。
显示驱动程序,网络驱动程序。所以这些支持包是由设备制造商创建的。所以不管你从谁那里买硬件。除此之外,你还需要一些系统配置。好的。你的设备如何启动,比如启动参数是什么?比如,你如何启动你的应用程序,然后你有一些运行时库以及你的应用程序需要的,取决于它是什么语言等等。所有这些通常都是源代码。你可以看到这有点复杂。简单介绍一下Yocto,有多少人听说过Yocto或者知道一点? Okay. About half or one third of you. So it’s a way to build a Linux distribution. So people frequently confuse it with a Linux distribution like Ubuntu or [inaudible 00:12:25], but it’s rather a Linux distribution builder or as they put it, it’s not an embedded Linux distribution.
它会为你创建一个自定义的。这可能是在设备上运行Linux的最流行的方式就使用Linux的设备数量而言。如果你看看有多少是使用Yocto构建的,而不是其他操作系统或其他基于linux的操作系统,Yocto可能是最受欢迎的。显然很难得到确切的统计数据,但是的,它被广泛采用。但是现在您正在从头开始构建Linux,对吗?所以你需要从源代码中获取Linux内核,像所有这些带引导加载程序的包一样然后你要构建它。很明显,这要花几个小时。你必须从互联网上获取它,然后你必须编译,有一些,是的,对于那个板或板架构。这就是你的目标。
那么它看起来怎么样呢?如果我们把这些放在一起,你可以看到一些标志。如果你只看一个连续积分的部分,这就是它的样子。所以你有应用程序源,配置BSP软件系统软件,正如我们提到的。你可以看到这些来自不同的公司,所有这些组件。所以唯一来自你们公司的东西可能就是应用程序源和系统配置。这可以是不同类型的开发者。所以做系统配置可能需要更多的低水平技能,了解一些引导加载程序,驱动程序,分区等等。应用程序开发人员可能不需要知道所有这些。BSP可以来自,是的,你的电路板供应商,一些大的。 NXP, Samsung and Video Qualcomm, you would put out in all these sources into your CIS server, which can be based on Yocto and Jenkins for example to execute it all. And then you get the binary outfits, which is also not just one type. It can be like a full image and they can be a package or set of packages, containers maybe, depending on how you run your application.
希望这能让你们相信为物联网设备构建软件是非常复杂的。你有来自不同公司的不同输入,你也有很多不同类型的输出,所以它看起来和云的情况有点不同。然后你显然有最后一部分是部署,你使用Kubernetes,从Docker注册表中获得一个新的pod池等等。但你不能这样做。所以我知道有一些项目正在考虑在物联网设备上运行Kubernetes Lightweight,但我不认为这是可行的,因为物联网环境与云环境有很大的不同。我会告诉你们一点,但它是间歇性的,不可靠的。它不像你的简单实例,有不同类型的软件部署。所以我想说,重用相同的工具和过程是不可能的,因为我们看到的所有构建块都是不同的。来源不同。积分,连续积分系统是不同的。 And also the way you’re doing deployments needs to be different. And why is that?
所以,如果你看看物联网环境和对运行软件和部署软件很重要的属性,你可能会有这种感觉,但它们非常遥远,所以它们可以,就像主题演讲中提到的那样,可能是汽车。那么汽车在哪里呢?它们遍布加州。他们遍布美国,遍布全世界。很明显,汽车行业正在努力应对昂贵的召回费用。如果你必须把所有这些车都带回来,这将花费很多。但这只是汽车行业。可以是农业,可以是遍布地球的传感器来测量地球的水分这样你就可以优化肥料,对吧?所以如果出了问题,你不得不去拿设备,如果你有很多设备,你可能会破产。与此同时,他们希望能持续很长时间。 So a car, what’s the expected lifetime of a car? Maybe 15 years or something like that, which is different than like the, yeah, the cloud infrastructure server and then so on. You replace those every two, three years maybe.
当然,环境的不可靠性也增加了风险。首先是权力的情况。如果你第一次做软件更新,这是你会碰到的第一个。因为这些设备中的一些严重依赖于产品,但其中一些是运行电池的,当你进行软件更新时,你会消耗更多的电池。如果在更新过程中断电会发生什么?所以你再次启动设备,它会启动还是会显示最终用户应用程序?它也可以是不插电的,一辆车,你可以随时关闭或打开它。然后我们还有网络的情况,我想说大约三分之二是无线的。所以你知道无线连接,你不能一直依赖它,所以你可能随时失去连接。带宽也较低,与数据中心不同。 I don’t know if it’s like 10 gigabit, that’s the standard right now and it’s insecure because of the wireless nature. You must or you should assume that somebody are able to observe the packages that are going on there and if you’re doing a software update, what are they going to see? Can they influence it or can they see what you’re updating?
至少在IT环境中,您必须更多地考虑这些问题。只是在网络上做个简短的说明。所以我们经常想,好吧,技术会发展的,对吧?所以网络将变得更快,我们将获得更多的存储空间,最终这些物联网设备将成为小型数据中心,对吗?所以我们就等一会儿。摩尔定律将会发挥作用,我们可以再次使用同样的工具。但我想说,对于网络来说,这绝对不是真的。原因是有非常不同的用例。所以如果你想一下,它不是真正的物联网设备,而是一个昂贵的手机。它已在工作中固定。 So 5, I don’t know what’s the throughput on that, but maybe some of you do, but it’s pretty fast versus the typical IOT device.
可能依赖于旧的3G标准或不同类型的LW泛网络是低范围无线网络。所以我的观点是,手机的用例需要快速的网络,因为你希望你的用户,你的客户能够使用Instagram,例如,发布高分辨率的图片或观看YouTube或浏览网页等等。所以这是有道理的,我们在推动越来越快的网络,在手机方面。但如果你看着物联网设备,你会在那里看YouTube或发布猫的照片或任何你想发布的东西吗?不,你不是。因此,物联网设备的用例可能是从农业中获取一个简单的数据点,并可能每天发送一次。每天50个字节。但重要的是你有高度的连通性。所以你想要数据点到达,但你不关心它是否真的快,只要它发生了。因此,在物联网中,连接比数据速度更重要。 So that’s why I think the network will continue to be slow in IOT case.
因此,我们将更深入地研究在线旅行社的部分,因为是的,这就是我们所涉及的。所以我非常了解这一点,我认为这也是一个非常有趣的挑战。希望你们也会这么想。但默认情况是,人们开始想,好吧,当我更新设备时,它能有多难?对吧?把一些二进制文件从一个地方复制到我的设备上,用curl创建一些脚本就可以了。但是我们发现,我想这个样本来自30到40个嵌入式工程师。那些真正做过的人。因此,在这一点上,大约有一半的物联网设备是在几年前建成的。其中一半没有更新的方法。 The other half they did and the way it was homegrown. So that’s also what motivated us to create Mender, because everybody’s reinventing the wheel here. And what people found is that after doing it, they would do it once and it would take 6 to 12 months probably to get a decent solution for deploying and nobody would want to do it again. So it’s costly and time consuming and of course you get into some more interesting issues down the road with security and the robustness and these kinds of things and it’s not really what you’re developing in the first place.
因此,就空中更新的要求而言,这显然不仅仅与Mender有关,但你将如何以一种良好的方式为物联网进行空中更新?我认为最重要的可能是经常被忽视的,尽管Kit确实谈到了这一部分,那就是健壮性。所以如果你断电了,你希望设备恢复正常。如果您不小心将不兼容的软件部署到设备上,您不希望允许这样做。如果出现任何错误,您希望构建回滚,并且希望能够运行一些完整性检查,不仅是设备正在引导或内核已加载,而且还希望最终用户应用程序正在实际运行。否则,您希望再次回滚。所以有很多故事,所以我可以花很多时间在用例或案例研究上。
但这里有一个例子,这是一个智能锁设备。这是Airbnb推荐的。他们有一个叫锁状态7i的软件,这是新一代的锁,它被部署到旧的硬件或旧的版本上。结果是锁坏了,所以没人能进他们的房子,Airbnb的客人被锁在外面,他们不得不把锁寄回给制造商,换新的,这需要三到四周的时间,如果你进不了自己的房子,这有点烦人。
当然还有安全保障。我之前提到过无线。那么如何使用TLS进行通信呢? TLS是另一种经过充分验证的技术。你会涉及到密钥管理问题,如何识别设备以及如何交换密钥,可能是旋转密钥。真实性代码签名是另一个大问题。那么,您是否知道即将部署的代码实际上来自您的开发人员或可信来源,或者是否有人在链中的任何地方修改了它?基本上在CICD链中。菲亚特克莱斯勒就是最后一个例子。他们没有正确地进行代码签名。你们中有多少人听说过三年前菲亚特克莱斯勒的故事? So just three of you. What happened was that some researchers took a look at the Fiat Chrysler car and their goal was to try to find vulnerabilities and figure out how the stack worked.
显然,这些都没有被记录下来。我可能用的是很老的技术我想他们花了一些,有两个研究人员我想他们花了一年的时间在这个问题上。在那之后,他们设法远程控制了一辆车,这样他们就可以把车开到路边,把车停下来。这是一个相当可怕的故事。如果你想看的话,这里有一些有趣的视频,是关于他们如何对待一名记者驾驶这辆车的,但他们未能验证更新的真实性。因此,研究人员能够部署新的软件,而不是来自菲亚特克莱斯勒,这就是他们如何接管汽车或汽车的一部分。这是一连串的事件。
还有一些其他的要求可能是OTA更新管理器需要支持你正在使用的操作系统,你正在使用的硬件,并能够与你现有的开发工具集成,你用哪种语言编写应用程序,等等。然后很容易开始因为正如我在第一张幻灯片中提到的,通常当你开始思考,或者大多数人开始思考他们的更新和IT的CICD时,已经太晚了。所以你可能不想在这上面花太多时间。当然还有带宽。所以对于汽车来说,我认为3G可能是最常见的连接方式,你也有wifi,但大约三分之一的物联网设备在某种程度上是缓慢的无线连接。所以你也需要一些支持。
如何将更新传输到低带宽网络?所以有一些技术可以用于此。当然,还有更新过程中的停机时间。当更新发生时,设备将无法使用,就像Kit提到的汽车更新的故事一样。你会坐一个小时,等着它。或者可以在使用设备时进行安装吗?然后可能只是重新启动,在停机时间发生的地方实际应用更新。
当然,您需要某种能够管理更新的方法。不幸的是,至少最常见的方法是用u盘。但如果你想要连续部署,让很多人都带着u盘,这就很烦人了。所以你需要某种中央管理服务器或某种方式来大规模部署它。还有一组其他的用例。比如你想把设备按客户分组,或者按加州的人分组这样就能降低故障的风险。你不需要同时把它部署给每个人。这是一种更高级的形式,叫做竞选管理。当然,你也会有报告问题,比如我刚刚进行了一次部署,它是否有效?
它适用于多少设备以及那些不适用的设备发生了什么。因此,您还需要日志管理和诊断。希望你们能看到,这不是一个很简单的问题。这不仅仅是将一个字节从一个地方复制到另一个地方,并希望得到最好的结果。这更详细一些,这是我们在Mender中最终得到的工作流基于所有这些需求,更新程序在设备上应该做什么?所以在我们深入研究之前,当你开始这个过程的时候你会想什么。如何部署更新?你想想下载,这是一个顶部和安装可能。这很简单,对吧?但过了一段时间你会注意到,你还需要很多其他的东西。
首先你需要检测更新这个。你是怎么做到的?可能用户想要进行更新,或者基于服务器有新版本而自动进行更新,如果您需要兼容性检查,则更有可能出现这种情况。硬件和软件兼容吗?我是在X86设备上运行Arm软件吗?当然,您需要通过安全渠道下载它。做一个完整性检查。因为连接问题发生了什么事情吗?有人改了吗?所以我需要检查签名的真伪。 Maybe you encrypted it because there are some confidential information you need the decrypt it and extract it depending on the format of the package. Maybe you want to run some pre-install actions because your application is now using a different format for your configuration file or you’re doing some migration. Finally you are getting to do the installation and then maybe there’s some posting selections.
当您完成对最终用户应用更新时,可以重新启动应用程序或设备。然后你需要做一些完整性检查因为应用程序是否正常工作。在部署和更新之后,这是一个非常重要的问题。否则你会有很多愤怒的顾客。根据这一点,它起作用了吗?这很好,但如果它不起作用怎么办?所以如果它不起作用,你怎么恢复呢?这就是你要回滚的地方。好吧,我有两个软件的副本其中一个,比如最新的好版本,这也是Mender所做的。所以我们有自动回滚,但不管怎样,你需要一些恢复的方法。这是一个参考管道。 So as Kit mentioned as well, there is a demo at the automotive booth, so I filled in basically the technologies that bring used there to give you a quick overview over how it’s all fits together.
所以他们使用树莓派。有一个叫做Mender中心的东西,这是一个社区驱动的项目,为很多板添加支持,对很多板进行空中更新支持。所以树莓派有一个板支持包。他们使用Mender作为系统软件的一部分他们使用Yocto自动分级Linux,我猜你可以称之为Yocto和Lava的味道,它是测试框架因为当你处理硬件时,测试也变得非常有趣。它不再只是启动Docker容器并运行测试脚本。你必须知道,有了这些代码,设备能不能启动,你怎么测试呢?你需要设备,你需要把新的软件放在设备里,用新的映像重新对它进行成像,然后你需要启动它。有很多硬件,我们将学习如何深入到操作系统之下。这很复杂。这也是熔岩出现的原因。 They have ways to test or it’s a test for [inaudible 00:34:41] where you can actually test more software that’s closer to the hardware, like the kernel and things like that.
然后他们在Artifactory中上传完整的图像[听不清00:34:54]在x射线中,你可能在视频中也看到了JFrog Artifactory和Mender之间有一个集成。因此,正如您所知道的,在Artifactory中有一些针对设置的工作流程,以便设置一个给定的发布版本,或者给定的工件,以便发布。这也是您可以上传带有集成需求程序的软件的地方。最后,他们在底部有一个RC车在那里你有一个Mender客户端,它会从Mender服务器拉来。这是我的最后一张幻灯片,所以我真的希望你们今天学到了一些关于物联网的知识,你们会想也许不要试图重新发明轮子,而是尝试使用经过验证的组件。如果您想了解更多关于CICD管道的参考实现,我还会建议您去JFrog楼上的汽车展台看看。我还被告知我们不应该在这里问问题,所以我想我们要上楼了。是的。谢谢你的到来。
