嵌入式Linux的OTA更新,基本原理和实现

嵌入式Linux的OTA更新,基本原理和实现

2023年7月26日发(作者:)

嵌⼊式Linux的OTA更新,基本原理和实现需要更新⼀旦嵌⼊式Linux产品离开实验室并进⼊现实世界,如何更新设备的问题就变得⾄关重要。更新并⾮总是必要的,但是很难想到没有某个漏洞的软件。即使您的软件是完美的,但是如果设备通过任何开放源代码库在⽹络或Internet上进⾏通信,则可能需要进⾏安全更新。以CVE-2104-01650(严重)为例。此漏洞影响了OpenSSL加密库,并扩展了⽹络上三分之⼆的⽹站。即使到了三年后的今天,仍然有许多嵌⼊式Linux设备运⾏的是OpenSSL的⾮防御版本,可以⼴泛攻击。阻⽌⽂件更新在谈论更新Linux时,您可能会看到提到了“阻⽌”和“⽂件”更新系统。这是指通过直接写⼊块设备或更新单个⽂件以执⾏更新来⼀次更新整个分区。您可能熟悉Desktop或Server Linux的⽂件更新系统(例如“ sudo apt-get upgrade”)。在嵌⼊式Linux中,基于模块的升级由于其原⼦性以及整个⽂件系统通常是嵌⼊式Linux构建系统的输出这⼀事实⽽成为必经之路。我们期望特定产品在每个嵌⼊式设备上的存储空间是恒定的,因此我们每次都创建相同⼤⼩的分区。此类更新与具有某种后备或恢复映像配合使⽤。发⽣故障时恢复我们绝不希望设备处于⽆法使⽤的状态(例如,如果发⽣断电)。我们可以通过确保在更新过程中出现任何错误时始终可以“退回到”另⼀个分区来解决此问题。图1.发⽣故障时的恢复-后备选项在上⽅,您可以看到电源中断时后备模式的两种可能实现。引导程序在左侧引导应急分区,然后将其引导到主分区。在右侧,Bootloader会基于开关引导两个分区之⼀。引导加载程序应实现某种确定启动是否成功的⽅法,如果尚未成功,则应返回到救援分区(左图)或先前的⼯作分区(右图)。救援⽅法(左⼿)允许为主分区提供更多空间,⽽双rootfs⽅法(右⼿)要求在两个分区之间或多或少均匀地分配空间。如果空间不成问题,则建议使⽤dual-rootfs⽅法,因为这将减少停机时间。通过救援⽅法进⾏更新需要两次重新引导,⼀次重新进⼊救援分区,然后另⼀次重新进⼊主分区。dual-rootfs⽅法仅需要⼀次重新引导,因为可以随时执⾏更新。在这些系统中⽆法安全更新的是引导加载程序(或实际上是救援分区)。如果您也想更新引导加载程序,则需要两个单独的引导加载程序分区,以及某种Board-Management-Controller来实现两者之间切换的逻辑。图2.发⽣故障时的恢复– Board Management Controller当然,这是⼀个复杂的解决⽅案,需要⼀个额外的微控制器,⼀套新的固件以及更复杂的硬件设计(例如,在某些设备中使⽤,例如那些包含单独的智能平台管理接⼝(IPMI)控制器的设备) 。因此,您应该着眼于构建功能齐全,范围较⼩且不需要更新的引导加载程序。U-Boot环境变量U-boot实现了⼀个⾮易失性“环境”,可以在其中存储变量。甚⾄可以从Linux(可以通过多种⽅式来访问它们,具体取决于环境的存储⽅式,如上所述)。这是实现上述“开关”的最明显⽅法。它也可以⽤于存储有关先前启动成功或失败的信息,以便在启动失败的情况下可以反转交换机并恢复⼯作分区。图3. U-boot环境变量图3. U-boot环境变量设置看门狗处理器的硬件监视程序应该由U-Boot(CONFIG_WATCHDOG)设置,然后在启动完成后由Linux维护。如果整个系统挂起,这将导致重置。检查启动失败关键任务应⽤程序运⾏后,应在u-boot环境中设置⼀个变量,指⽰启动完成。然后,U-boot将能够检查是否在下⼀次启动时设置了该设置,如果启动失败(有时仅在连续⼏次失败之后),则可以采取措施。具体的架构将取决于您的应⽤程序和产品。您将需要对此进⾏⼀些⾃定义,以适应您的需求。您将要确定所有可能的故障模式,并对所有故障模式实施恢复。实施更新正如我们之前所说,更新应以单个加密签名⽂件的形式出现。私钥签名可确保其源⾃制造商您。现在,系统只需解压缩它并运⾏其中的脚本即可⾃⾏执⾏更新。它将覆盖要更新的分区;轻拂所需的任何开关,然后重新启动。这应该尽快发⽣,以最⼤程度地减少停机时间。保护更新我们要确保提供给设备的更新⽂件来⾃制造商⽽不是其他⼈。为此,请使⽤制造商持有的私钥对更新⽂件进⾏签名。相应的公钥保留在设备上,它将验证要求使⽤其进⾏更新的任何更新⽂件。如果提供的⽂件被认为⽆效,则更新将失败。获取更新更新如何到达是另⼀回事。这⾥有四种可能性:最明显和最简单的⽅法是,该更新是由具有root登录到设备的⼯程师应⽤的。他运⾏更新脚本并更新了设备。这充满了安全隐患,并且可能仅适⽤于开发中的系统或⼯程或⼯业环境中使⽤的系统。物理介质已插⼊包含所需更新的设备(USB记忆棒)中。板上的软件将通过轮询守护程序或udev规则⾃动检测并安装。通过某种⽅法(例如,Web应⽤程序)将更新⽂件上传到单个计算机。空中更新,如下⼀节所述。空中更新空中(OTA)更新通常是指通过安全通道从中央服务器更新的设备。它通常指的是物联⽹设备,移动电话,汽车ECU等。在本⽂中,我将描述⼀种更新类型,该更新可以在连接到互联⽹的任何设备上运⾏,并且可以通过Wi-Fi(空中),以太⽹(铜缆)或其他某种协议。检查更新⾸先要做的是检查更新。设备上运⾏的守护进程可以将请求发送到预定服务器,提供其当前版本和硬件版本。然后,服务器可以根据该信息,在必要时将签名的更新⽂件发送到设备进⾏安装,或者报告没有可⽤的更新或不需要更新。可以通过多种⽅式添加复杂性,从仅基于各种标准向设备⼦集提供更新,到对更新⽂件进⾏完全加密,再到将更新状态或其他信息报告回中央服务器。现成与内部解决⽅案有许多现成的更新机制可以与嵌⼊式Linux系统集成,⽽不必如上所述重新发明轮⼦。可以在yocto项⽬中找到其中⼀些的⽐较。这些可能需要⼀些时间和精⼒才能与您当前的嵌⼊式Linux构建系统集成,但是它可能⽐内部开发⾃定义⽅法要少⼀些,并且由于其中⼀些项⽬已经花费了数百⼩时⽽变得更加强⼤。进⼊他们。为什么您不想要现成的解决⽅案的原因:您希望在每个级别上为董事会⾃定义内容在使⽤⼤型代码库时,您可能会遇到安全问题,⽽该代码库仍相对较新,并且使⽤或识别的程度不⾼在ByteSnap Design,我们为许多不同的客户提供了完整的硬件和软件解决⽅案,我们创建了内部⾃定义更新系统,同时在各种不同的芯⽚组(例如MTS)上集成了Mender等现成的更新系统。

发布者:admin,转转请注明出处:http://www.yc00.com/news/1690378149a340497.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信