嵌入式 Linux – 部署固件更新的机制? [关闭]

2024-06-21

我正在考虑在 Yocto 项目上开发一个嵌入式 Linux 项目(一个工业应用程序),我有几个问题想问那些有嵌入式 Linux 经验的人——Yocto 经验是额外的好处。只需了解固件更新中常见的操作即可。

我有一些要求,包括身份验证、安全通信协议、更新失败时某种类型的回滚。另外,如果有一种方法可以在设备群中逐步发布补丁,那么这也会很有趣,因为我想避免现场设备变砖。

如今,您如何将更新/补丁部署到现场设备 - 开发它需要多长时间?我还缺少其他考虑因素吗?


虽然您当然可以使用 rpm、deb 或 ipk 进行升级,但我的首选方法(至少对于小到合理大小的映像)是将两个映像存储在闪存上,并且仅更新完整的 rootfs 映像。

今天,如果我要开始使用 OpenEmbedded / Yocto 项目来使用嵌入式 Linux,我可能会考虑 meta-swupdate。

我自己和多个客户使用的更像是这样的:

  • 容器升级文件,它是一个 tarball,由另一个 tarball(以下称为升级文件)、升级文件的 md5sum 以及通常的 gpg 签名组成。
  • 存储在运行映像中的更新程序脚本。该脚本负责解压升级文件的外部容器,使用 md5sum 验证升级文件的正确性,并经常验证加密签名(通常基于 gpg)。如果更新文件通过了这些测试,更新程序脚本会在更新文件中查找升级脚本,并执行该脚本。
  • 更新文件中的升级脚本执行实际升级,即通常重写非运行映像,提取并重写内核,如果这些步骤成功,则指示引导加载程序使用新编写的内核和映像而不是当前运行的系统。

在升级文件中包含执行实际升级的脚本的好处是,您可以通过一个步骤执行将来需要的任何操作。我制作了特殊的升级映像,用于升级连接的调制解调器的固件,或者提取一些额外的诊断信息,而不是执行实际的升级。这种灵活性将在未来得到回报。

为了使系统更加可靠,引导加载程序使用称为引导尝试次数的功能,该功能可以记录引导尝试的次数,如果该数字超过阈值,例如 3,引导加载程序将选择引导另一个映像(因为该映像配置为被引导被认为是有故障的)。这可确保该映像完全损坏,另一个存储的映像将自动启动。

此方案的主要风险是升级到升级机制已损坏的映像。通常,我们也会在bootloader中实现某种恢复机制,使得bootloader可以重新刷新一个全新的系统;尽管这种救援机制通常意味着数据分区(用于存储配置、数据库等)也将被删除。这部分是为了安全(不是泄漏信息),部分是为了确保在这次救援操作之后我们完全了解系统状态。 (当由远方缺乏经验的技术人员执行此操作时,这是一个很大的好处)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式 Linux – 部署固件更新的机制? [关闭] 的相关文章

  • UNIX/Linux IPC:从管道读取。运行时如何知道数据长度?

    我有一个子进程 它生成一些可变长度的输出 然后使用半双工管道将其发送到父进程 在父级中 如何使用 read 函数 由于每次数据的长度可能不同 我如何在运行时知道数据的大小以对缓冲区执行任何 malloc 操作 fstat 函数可以用于管道文
  • Linux 内核中的 64 位 time_t

    我已经编译了内核 3 19 1 但仍然有问题time t 只是一个简单的程序cout lt lt sizeof time t 给出 4 个字节的大小 而不是我的意图的 8 个字节 我应该在 make menuconfig 期间打开特定选项吗
  • 在 Linux 上使用命令行 PHP 检查互联网连接

    我在 Linux 上使用命令行 PHP 来打开蓝牙拨号连接 并且我需要一种快速的方法来检查互联网连接是否处于活动状态 嗯 不一定要脏 但要快 使用exec运行外部命令不是问题 我正在考虑 ping 一些稳定的服务器 例如谷歌 但我想知道是否
  • 从哪个 Linux 内核/libc 版本开始,Java Runtime.exec() 在内存方面是安全的?

    在工作中 我们的目标平台之一是运行 Linux 的资源受限的迷你服务器 内核 2 6 13 基于旧 Fedora Core 的自定义发行版 该应用程序是用 Java Sun JDK 1 6 04 编写的 Linux OOM Killer 配
  • ModuleNotFoundError:没有名为“schedule”的模块

    我有导入时间表的Python程序 import schedule 在开头 使用 python3 命令执行代码没有问题 但从其他 python 文件启动它call sudo python3 ProgramWithSchedule py she
  • 如何判断输入来自哪个键盘

    设想 我有一个 USB RFID 读取器 将其连接到笔记本电脑后 它可以用作新连接的 USB 键盘 例如无需安装任何驱动程序 当接触带有 RFID 标签的阅读器时 它进入我当前的窗口 例如终端 外壳 RFID 号码 例如0009339384
  • gai_cancel() 需要很长时间才能成功

    我正在尝试在 C 中异步查找域 原因是我希望能够有效地添加超时期限 以防系统无法查找域 我遇到了 getaddrinfo a 命令 所以我决定尝试一下 然而 在我的机器上取消任何不会成功的 dns 查找 例如没有互联网连接时 永远不会花费少
  • 为什么不使用 sshrc 中设置的 $PATH?

    我正在尝试在 OS X 服务器上通过 ssh 设置 svn 为了做到这一点 我读到我需要一个包装器来设置 umask 并 在我的例子中 设置存储库根 一种快速而肮脏的方法是重命名 usr bin svnserve并将包装器脚本放置在该位置
  • 很好的 C 库集合? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个很好的 ANSI C 库集合 用于处理向量 哈希映射 二进制树 字符串处理等 Try g
  • Visual Studio 代码中的“Git:gpg 未能签署数据”

    全新安装 Linux 后 我尝试设置我的环境 并且不断收到Git gpg failed to sign the data在本地提交更改时出错 我使用的是 Visual Studio Code 专有版本 而不是开源版本 gitconfig u
  • 在詹金斯管道作业中将变量传递给bash脚本

    我有一个 Jenkins 管道作业 其中我使用名为 setup sh 的 bash 脚本配置我的环境 如下所示 bin bash export ARCH 1 echo architecture ARCH 在 Jenkins 管道脚本中 我使
  • 我应该如何从非 root Debian Linux 守护进程登录?

    我正在编写一个新的守护进程 它将托管在 Debian Linux 上 我发现 var log 具有仅 root 写入权限 因此我的守护进程无法在那里写入日志文件 但是 如果它写入那里 它似乎将获得自动日志轮转 并且也按照用户期望的方式工作
  • 如何更改解释器路径并将命令行参数传递给 Linux 上的“可执行”共享库?

    这是 可执行 共享库的最小示例 假设文件名 mini c Interpreter path is different on some systems definitely different for 32 Bit machines cons
  • 如何在 Linux 上正确地将网络接口置于混杂模式

    那么如何正确地做到这一点呢 我知道如何通过创建套接字 然后使用 ioctl 设置 IFF PROMISC 标志来做到这一点 如 如何在C中检查网络设备状态 https stackoverflow com questions 3055622
  • Python select() 行为很奇怪

    我在理解 select select 的行为时遇到一些困难 请考虑以下 Python 程序 def str to hex s def dig n if n gt 9 return chr 65 10 n else return chr 48
  • 使用vim,如何快速刷新正在处理的网页?

    我已经使用 VIM 几个星期了 同时处理各种网络语言 我真的很喜欢它 我发现必须点击或单击浏览器并刷新页面才能看到代码更改的效果 这很麻烦 更烦人的是 因为我使用的是 Virtual Box 而且我倾向于在主机系统上处理 PDF 文件 因此
  • Motif 库的水平绘制的 RowColumn 类 (C)?

    我正在使用 Motif Library 来完成我的工作 如果有人不熟悉这个库 您可以在这里找到文件列表https packages ubuntu com xenial amd64 libmotif dev filelist https pa
  • 使用 Python for Linux 模拟按键事件

    我正在编写一个脚本来自动运行特定模型 当模型失败时 它会等待用户输入 Enter 键 我可以检测到模型何时失败 但我无法使用 python 在 Linux 上 来模拟按键事件 Windows 有 SendKeys 库来执行此操作 但我想知道
  • ARM(特别是移动)外设寻址和总线架构的解释?

    我首先要说的是 我不是该领域的专家 我的问题可能包含误解 在这种情况下 如果您纠正我并附上资源 以便我可以了解更多详细信息 我将很高兴 我试图弄清楚系统总线的方式以及移动设备中出现的各种设备 例如传感器芯片 wifi BT SoC 触摸屏等
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上

随机推荐