【问题标题】:Deployment over GPRS to embedded devices通过 GPRS 部署到嵌入式设备
【发布时间】:2015-08-24 04:33:24
【问题描述】:

我在这里有一个相当令人头疼的问题。我们在相距数百公里的场地上有多个 Raspberry Pi。我们需要能够安全地(ish)远程升级它们,因为本地访问的价格可能高达几百欧元。

raspis 运行 rasbian,/ 位于安装在 RO 中的 SD 卡上,以防止断电时损坏(通常每天一次)。 SD 卡从相同的基本映像克隆而来,但包含手动安装的包和修改过的文件,这些文件可能因设备而异。 raspis 都有一个 USB 闪存作为更耐腐蚀的 RW 驱动器和一个脚本,用于在启动时对其进行格式化,以防驱动器损坏。他们通过 GPRS 连接以不同的可靠性打电话回家。

对系统的要求如下:

  • 配置文件、脚本和二进制文件的简单版本控制,至少 /etc、/root 和 home 最好是 Git
  • 通过 GPRS 从任何版本高效升级/降级到其他版本 -> 仅传输文件增量
  • 如果连接不再有效,可以自动回滚最近应用的补丁
  • 下载更改时,根文件系统不能处于 RW 模式,更改需要先存储在本地,然后再应用到 /

简单的方法可能是将文件系统的完整副本保存在远程 git 存储库中,在提交之间生成一个差异文件,将补丁上传到该字段并应用它。但是,目前不同 raspis 上的文件并不相同。这意味着,至少在安装系统时,必须通过类似于 rsync -a 的方式来同步文件。

该过程应遵循“将 / 和 ssh 文件夹之间的差异保存到 U 盘上的文件,挂载 / RW,从文件应用差异,挂载 / RO”。 Rsync 同时进行 diff-getting 和 apply,所以我的第一个问题变成了:

1 是否存在类似 rsync 的东西可以从本地和远程保存文件增量并在以后应用它们?

另外,我从来没有做过这样的系统,而且drawt是“我能想到的最接近合法的”。这里有很多活动部件,我很害怕我事先没有想到的事情会导致事情发生可怕的错误。我剩下的问题是:

  1. 我是不是离基地很远,实际上是否有更智能/更安全的方法来做到这一点?
  2. 如果不是,我应该遵循什么样的最佳实践以及需要非常小心的事情(不让设备变砖)?
  3. 如何处理诸如安装新程序之类的事情?绕过数据包管理器,安装在 /opt 中?
  4. 如何管理权限/所有者(应用程序逻辑的 root+1 用户)?只需以 root 身份运行所有内容并希望获得最好的结果?

【问题讨论】:

  • 这是一个有趣的问题,所以 +1,但我认为目前的形式过于宽泛,无法简洁地回答。

标签: linux git deployment embedded rsync


【解决方案1】:

是的,这是一个非常广泛的问题。这不会直接回答您的问题,而是为您的研究提供指导。

防止文件系统损坏的一种方法是使用覆盖文件系统(例如,AUFS、UnionFS),其中根文件系统以只读方式挂载,而 tmpfs(基于 RAM)或基于闪存的读写挂载为“over” " 只读根。这需要您自己的初始化脚本,包括使用 pivot_root 命令。由于没有安装任何关键的 RW,因此系统可以稳健地处理断电。要点在pivot_root之前,FS看起来像

/      read-only root (typically flash)
/rw    tmpfs overlay
/aufs  AUFS union overlay of /rw over /

pivot_root 之后

/      Union overlay (was /aufs
/flash read only root (was /)

对 /flash 文件系统的更新是通过以读写方式重新挂载、执行更新和以只读方式重新挂载来完成的。例如,

mount -oremount,rw <flash-device> /flash
cp -p new-some-script /flash/etc/some-script
mount -oremount,ro <flash-device> /flash

您可能会或可能不会立即看到 /etc 中反映的更改,具体取决于 tmpfs 覆盖中的内容。

您可能会发现自己大量使用 chroot 命令,尤其是在您决定使用包管理器时。快速示例

mount -t proc none /flash/proc
mount -t sysfs none /flash/sys
mount -o bind /dev /flash/dev
mount -o bind /dev/pts /flash/dev/pts
mount -o bind /rw /flash/rw  # 
mount -oremount,rw <flash-device> /flash
chroot /flash
# do commands here to install packages, etc
exit # chroot environment
mount -oremount,ro <flash-device> /flash

学习使用 patch 命令。有二进制补丁命令How do I create binary patches?

为了在一切都出错时进行超级恢复,您需要硬件支持和看门狗定时器以及从备用(辅助)根文件系统进行故障安全启动的能力。

如果您想要一款防弹产品,预计会花费大量时间和金钱。没有捷径。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多