Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >IoT固/软件更新及开源选项

IoT固/软件更新及开源选项

作者头像
半吊子全栈工匠
发布于 2018-08-22 01:47:16
发布于 2018-08-22 01:47:16
1.7K0
举报
文章被收录于专栏:喔家ArchiSelf喔家ArchiSelf

物联网的迅速发展涌现了数十亿与互联网连接的无线嵌入式设备。 从医疗设备到坦克传感器, 智能恒温器, 智能路灯, 水监视器等等, 物联网比以往任何时候都应用广泛。

会出什么问题呢?

大多数这些设备的设计都不像是被恶意攻击的目标。 嵌入式系统传统上被认为是稳定的产品, 但实施起来成本高昂, 因为投资回报率(ROI)在的周期比较长。 在过去一旦发货, 就很少需要更新这些设备。 随着智能手机和RTOS的爆发, 才使得固件更新以及应用更新的必要性凸显出来。

假想一下, 恶意黑客将所有这些易受攻击的连接设备作为潜在攻击目标的话, 这些设备运行在不安全或过时的Linux 内核上, 有些漏洞还没有被修补过, 并且可以被远程控制!

这可不是一个有吸引力的场景。

安全更新: 嵌入式与服务器的对比

如今, 升级安全问题驱动了IoT软件的升级更新, 也提高了工程师添加新的功能和修复漏洞可能性。

对于嵌入式设备, 固件更新机制不仅必须是安全的, 而且是可靠的, 因为它要么成功更新, 要么失败到可恢复状态。 一般地, 很难在用户现场升级固件,而需要在无人看管的情况下完成自动升级。 大多数更新也必须保留先前的设备状态, 尽管在某些情况下恢复设备可能涉及将系统重新设置为默认状态。

还有一个原子性问题。 Linux 服务器世界已经习惯于执行基于软件包的更新, 所有的东西似乎都能运行良好。 但是嵌入式设备则不一定。

服务器通常运行在一个可控的环境中, 可能是安全的, 并且有电源的保障和网络连接。 也就是说位于一个受监控的、可访问的位置, 用户干预恢复是可能的, 即使并不是必要条件。

Linux 服务器通常依赖于包管理, 基于 RPM (或 YUM)或基于 deb 的apt , 具有非原子增量更新的依赖辨识。 由包版本更新驱动流程, 每个都有一组复杂的预安装脚本, 这些脚本可能会让系统处于一个未定义的状态, 甚至是非工作状态。

不幸的是, 嵌入式设备可能无法访问, 大部分时间可能处于低功耗模式, 有很长的存活周期, 可能会遭受电力或网络中断的困扰, 从而中断固件升级。

总之, 基于包管理器的更新不是原子的, 因此很难测试和支持它们。 这通常会导致对设备固件实际状态的跟踪, 以及令人畏惧的"上次更新了什么?" 等问题。 这种方法不适合嵌入式系统, 因为这些系统会要求始终保持一致性。

镜像更新

更新嵌入式设备的传统最佳方式是对镜像进行整体更新。 在设备中, 这将是整个镜像和所有的设备固件。 在嵌入式 Linux 设备中, 这通常转化为分区更新, 所以分区方案是一个重要的考虑因素, 因为它将影响可以执行的软件更新类型。

嵌入式 Linux 设备通常将媒介分为不同的分区, 可以分别更新:

  • Bootloader 分区: 如果有的话, 很少更新, 更新嵌入式设备的引导程序最终将导致设备最终被退出。 因此, 完善的更新机制应尽可能避免这种情况。
  • 引导 / 内核分区: Linux 内核和相关固件, 如设备树和 initramfs 镜像,除非为了安全,通常不需要更新。
  • 文件系统分区: 存储的 OS 文件通常是只读且不可变的。 这也很少更新, 但如果应用程序依赖于这里的库, 可能会发生较多的更新情况。
  • 用户分区: 用户应用程序的存储位置和持久性数据是最需要更新的分区。

基本上, 固件镜像更新可以从整个系统:内核、根和用户分区到其中的某些部分。

有两种可能的镜像更新: 对称和非对称。

  • 对称: 对称更新需要更新分区镜像的双重副本, 以便可以在另一个运行时完成更新。 这通常需要两个引导/内核分区、两个根文件系统以及两个用户分区。 然后, bootloader 会跟踪哪些分区用于给定的引导。 对称更新的停机时间很小, 通常只有重启时间, 并允许更新取消。
  • 非对称: 非对称更新使用了一个通常由内存运行的恢复操作系统, 它有一个 Linux 内核和 initramfs 镜像。 这样就减少了所需的分区数量, 因为恢复模式只在一个额外的分区中存在, 并且可以更新其他任何分区。 如果更新失败, 可以重新尝试恢复。 不对称更新在更新时会有较长的下行时间, 并且不允许用户取消。

用户空间更新

通常情况下, 更新由用户空间应用程序执行, 该应用程序可以获取软件更新包, 使用它, 并通知 bootloader 更新。 它还需要允许安装后进行操作。 然后 bootloader 启动一个硬件监视器并尝试启动。 如果引导成功, 那么硬件监视器就会被关闭; 如果不成功, 它就会被触发, bootloader 再次尝试启动。 在多次尝试之后, 它要么回到已知运行良好的分区, 要么进入恢复模式。

一个重要的考虑是, 用户空间固件更新必须通过固件更新进程进行。 另一个风险是, 有可能更新到一个可启动系统, 该系统具有一个已损坏的固件更新机制。 不幸的是, 需要回到 bootloader 或者其他恢复机制来更新固件。

有些系统使用 bootloader 来执行更新。 这存在严重的缺点, 如果固件更新代码必须更新(例如因为分区更改) , 那么需要更新的是 bootloader, 这是非常危险的。 Bootloader 在驱动程序、工具、库和它所支持的网络协议数量方面也非常有限, 因此更新会发生在资源有限的环境中。

基于镜像的开放源码软件更新有两个主要选项, 分别支持对称和非对称更新:

  • Swupdate[1] (GPLv2许可下)

swupdate 在 Yocto 通过 meta-swupdate 层(但仅限于对称更新)来支持 swupdate。 它还包含一个 Mongoose web 服务器—— Suricatta daemon, 可以从一个远程服务器上拉取 Eclipse HawkBit[2]提供的更新新(用于向终端设备执行软件更新的后端解决方案)。 它目前只适用于 U-Boot bootloader。

  • RAUC [3] (在 LGPLv2.1许可下)

RAUC 在 Yocto 通过 meta-ptx 层提供支持, 支持 Grub 或 Barebox bootloader。

远程镜像更新

固件更新过程不仅能够从本地来源(例如 FLASH、 USB、 SD 或 UART)完成更新, 还必须能够远程更新,即通常所说的OTA更新。 OTA更新使用远程服务器向运行在设备上的客户端推送更新。

开源远程 OTA 固件更新的一些选项包括:

  • Mender.io [4](在 Apache 2 许可下)

mender.io同时用于客户端和服务器。它是通过meta-mender层支持Yocto。服务器可以充当部署和构建管理器,但也可包含设备管理控制台。

  • Digi International Remote Manager [5], (在 MPLv2 许可下)

Digi 远程管理器有一个基于云的专属服务器和一个开源客户端。 它通过 meta-digi 层在 Yocto 得到了支持。 服务器可以充当部署和构建管理器, 还包含一个设备管理控制台, 该控制台具有设备报告和监控功能。

  • Eclipse HawkBit [2](在Eclipse公共许可下)

Eclipse HawkBit 是一个 Eclipse公共许可证服务器, 同时充当部署和构建管理器, 以及具有设备报告和监视功能。

全量更新的问题通常是尺寸较大, 可能会导致资源的受限, 尤其是设备端带宽的限制, 如蜂窝网络。 差分惊喜固件更新是一个很好的妥协, 只传输前一版本的查分数据。

容器式更新

使用容器化程序简化了软件更新的用例, 应用程序可以单独更新。

容器更新是建立在一个不可变的分发上(可能是只读文件系统) , 其应用程序只存在于容器升级的容器中。

一些使用基于容器的固件更新的开源项目的例子有:

  • Resin.io [6]

resin.io基于Docker的专有OTA更新服务器,遵从Apache 2 的许可,包括服务器和客户端。它是通过meta-resin层来支持Yocto的。

  • Ubuntu “Snappy” Core [7]

Ubuntu Core 是一个基于 Ubuntu 的最小化操作系统, 它提供了与docker类的应用程序。

还有新的 OS 设计来支持 Docker 应用程序, 这些应用程序最终可能用于嵌入式空间, 如 CoreOS[8] 和 Project Atomic 9。

增量二进制原子化OS更新

在嵌入式领域中,一个即将到来的趋势是对每个文件的原子化增量更新, 可以快速部署或回滚, 同时保持完整的部署历史。

一些开源项目:

  • libOSTree [10]

libOSTree 由一个库和命令行工具组成, 定义为"操作系统二进制文件的 Git"。 它使用类似 git 的对象来存储和部署 OS 查分包, 每个都有一个持久的数据副本。 对于使用它的 Yocto, 有一个 meta-updater 层,也被用于类似于 Atomic 的OS更新。

  • swupd [11]

swupd 最初是 ClearLinux 的一部分, 由英特尔赞助。 它非常类似于 libOSTree, 在 Yocto 通过 meta-swupd 层提供支持。

选择范围

随着物联网设备的出现, 不仅固件更新是必要的, 而且新产品开发同样必要。 固件更新策略的选择需要尽早考虑, 因为这将影响到未来的产品设计决策。 与所有早期的决定一样, 错误的选择会给发展带来沉重的负担。

那些时间与市场紧密相连的项目可能会倾向于更传统的、经过测试的、完整的固件更新策略。 这些包括通过 Yocto Project 的 meta-swupdate 层提供的各种技术, 以及像 Digi International 的 Remote Manager 这样的为企业准备的 OTA 更新方案。

然而, 在新涌现的边缘项目可以通过类似容器设计,来扩展整个系统固件的更新方法, 使应用程序能够从系统更新中分离出来。

References:

[1] "SWUpdate: Software update for embedded system." SWUpdate: software update for embedded system — Embedded Software Update Documentation 2017.07 documentation. Accessed September 14, 2017. https://sbabic.github.io/swupdate/swupdate.html.

[2] Beaton, Wayne. "Eclipse hawkBit." Projects.eclipse.org. October 20, 2016. Accessed September 14, 2017. https://projects.eclipse.org/projects/iot.hawkbit.

[3] "Safe and Secure Updating!" Safe and secure embedded Linux updates | RAUC. Accessed September 14, 2017. http://rauc.io/.

[4] "Over-the-air software updates for embedded Linux devices." Open source OTA software updates for embedded Linux | Mender. Accessed September 14, 2017. https://mender.io/.

[5] "Digi Remote Manager®." Monitor and Manage Remote Connected Devices - Digi International. Accessed September 14, 2017. https://www.digi.com/products/cloud/digi-remote-manager.

[6] "Embedded software deployment done right." Home | Resin.io. Accessed September 14, 2017. https://resin.io/.

[7] Canonical. "Ubuntu Core." Ubuntu Core | Ubuntu. Accessed September 14, 2017. https://www.ubuntu.com/core.

[8] "CoreOS." CoreOS Blog ATOM. Accessed September 14, 2017. https://coreos.com/.

[9] "Building the Next Generation Container OS." Project Atomic. Accessed September 14, 2017. http://www.projectatomic.io/.

[10] OSTree. Accessed September 14, 2017. https://ostree.readthedocs.io/en/latest/.

[11] "Software update." Clear Linux Project. April 25, 2016. Accessed September 14, 2017. https://clearlinux.org/features/software-update.

编译自http://www.embedded-computing.com/dev-tools-and-os/identifying-secure-firmware-update-mechanisms-for-embedded-linux-devices-and-open-source-options

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 喔家ArchiSelf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringMVC系列知识:(六)乱码的问题
我们前段传到后端的是中文,前段也是utf-8。但是在后端接收到的就是乱码。这个不是前段的问题,是后端的java代码出现了问题。我们可以在controller层输出一下接收到的前段数据,就可以看到输出的是乱码。所以,我们解决的时候就是在controller层解决乱码的问题。
一写代码就开心
2020/11/19
4040
SpringMVC-解决POST请求中文参数乱码
程序员NEO
2023/10/01
3350
SpringMVC-解决POST请求中文参数乱码
《SpringMVC从入门到放肆》九、SpringMVC注解式开发(简单参数接收)
上一篇我们学习了注解式开发的配置方式并写了一个小Demo跑起来。今天我们来学习注解开发的参数接收。处理器方法中的常用参数有五类,这些参数会在系统调用时由系统自动赋值,即程序员可以在方法中直接使用。具体如下:
I Teach You 我教你
2019/05/25
4120
4. SpringMVC获取请求参数
将 HttpServletRequest 作为控制器方法的形参 , 此时 HttpServletRequest 类型的参数表示封装了当前请求的请求报文的对象
捞月亮的小北
2023/12/01
1990
4. SpringMVC获取请求参数
SpringMVC配置字符过滤器的两种方式
一、在web.xml中配置 <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>orgspringframeworkwebfilterCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </in
凡人飞
2020/09/20
1.3K0
深度学习springMVC(三)SpringMVC的编码过滤器配置, SpringMVC的静态资源放行(看不懂你打我)
目录 SpringMVC的编码过滤器配置 浏览器服务器交互的编码格式介绍 问题: 解决 SpringMVC的编码过滤器配置 SpringMVC的静态资源放行 SpringMVC的Dispatcher的拦截范围问题 问题: 解决: SpringMVC的静态资源放行配置 SpringMVC的编码过滤器配置 浏览器服务器交互的编码格式介绍 问题: 在浏览器和服务器的数据交互流程中,处理英文数据以外还有中文数据。 浏览器发起的请求数据中包含中文,服务器响应的数据包含中文。而浏览器 默认的编码格式为iso
一写代码就开心
2021/07/08
1.2K0
springmvc框架开发中解决产生的乱码情况
一:解决post请求方式产生的乱码情况 示例代码如下: 1   <!-- 解决post乱码 --> 2 <filter> 3 <filter-name>CharacterEncodingFilter</filter-name> 4 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 5 <init-param> 6
赵小忠
2018/01/24
6850
spring开发中applicationContext.xml和web.xml解决中文乱码问题
web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
Tom2Code
2022/04/15
7850
Springmvc解决中文乱码问题
Springmvc解决中文乱码问题 本人独立博客https://chenjiabing666.github.io POST 在表单提交的时候,如果遇到中文乱码的情况,springmvc提供了一个CharacterEncodingFilter过滤器,我们只需要在web.xml文件中配置即可 注意 表单的提交方式必须是post 在web.xml中配置CharacterEncodingFilter编码格式要和JSP页面的编码格式一致 解决中文乱码必须使用过滤器(在DispatcherServlet之前执行),而不
爱撒谎的男孩
2018/05/10
2.4K3
Springmvc解决中文乱码问题
IDEA中SpringMVC配置文件详解
在web.xml中,SpringDispatcherServlet(核心控制器)的配置文件可以有两种方式:
Charles-LZ
2021/01/18
6100
基于SpringMVC注解的学生信息批量修改
4. 创建com.itheima.po.Student.java。包含属性id,stname,score
天道Vax的时间宝藏
2021/08/11
4530
SpringMVC开发 知识点速查
SpringMVC入门 什么是SpringMVC 实现MVC设计模式的框架 SpringMVC核心组件 DispatcherServlet 前置控制器,调度 Handler 处理器,完成具体业务逻辑 HandlerMapping 将请求映射到Handler,映射 HandlerInterceptor 处理器拦截器 HandlerExcutionChain 处理器执行链,拦截器 HandlerAdapter 处理器适配器,转换 ModelAndView 装载模型数据和视图信息 ViewResolver 视图解
linxinzhe
2018/07/25
4360
SpringMVC开发 知识点速查
解决前端到后台Controller的get/post乱码问题
在tomcat服务器的service.xml Connector里加 URIEncoding="utf-8"
名字是乱打的
2022/05/13
5070
解决前端到后台Controller的get/post乱码问题
web项目显示乱码解决方案整理
在做web项目的时候,经常会遇到中文显示乱码 和 中文传参乱码的问题,在这里整理一份解决方案
执笔记忆的空白
2020/12/25
2.6K0
SpringMVC入门(一)
1. 工作流程 用户请求服务器,然后核心控制器捕获请求 核心控制器交由映射器把请求url和控制器进行映射 核心控制器交由适配器调用映射的控制器,中间还进行数据转换 对应的控制器的逻辑操作完成后返回Mo
晚上没宵夜
2020/03/11
4760
SpringMVC传递参数乱码解决,web.xml中配置编码过滤器
web.xml中配置编码过滤器 编码过滤器 <!-- 编码过滤--> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding<
2020/10/23
7090
Servlet-过滤器入门
Servlet 过滤器是可用于 Servlet 编程的 Java 类,可以实现以下目的: 1. 在客户端的请求访问后端资源之前,拦截这些请求。 2. 在服务器的响应发送回客户端之前,处理这些响应。
用户2146693
2019/08/08
3780
Servlet-过滤器入门
Springmvc解决中文乱码问题
文章目录 1. Springmvc解决中文乱码问题 1.1. POST 1.1.1. 注意 1.1.2. 在web.xml配置 1.2. GET 1.3. 总结 Springmvc解决中文乱码问题 POST 在表单提交的时候,如果遇到中文乱码的情况,springmvc提供了一个CharacterEncodingFilter过滤器,我们只需要在web.xml文件中配置即可 注意 表单的提交方式必须是post 在web.xml中配置CharacterEncodingFilter编码格式要和JSP页面的编码格
爱撒谎的男孩
2019/12/31
1.4K0
SpringMVC乱码或前台乱码解决办法
以及 form表单提交方式为必须为post 修改web.xml,增加编码过滤器,如下(注意,需要设置forceEncoding参数值为true)
試毅-思伟
2018/09/06
1.7K0
GET、POST编码问题
GET请求、POST经常会出现中文乱码的问题,最好约定前后端的编码,一般为UTF-8。但是这里面也是有坑的。 后端设置编码为UTF-8的推荐方式: SpringMVC配置过滤器: <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <ini
欠扁的小篮子
2018/07/04
7250
相关推荐
SpringMVC系列知识:(六)乱码的问题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档