通过 GPRS 部署到嵌入式设备
Deployment over GPRS to embedded devices
我很头疼。我们在相距数百公里的场地上有多个树莓派。我们需要能够安全地(大概)远程升级它们,因为本地访问的价格可能高达几百欧元。
raspis 运行 rasbian,/ 位于安装在 RO 中的 SD 卡上,以防止断电时损坏(通常 once/day)。 SD 卡是从相同的基础映像克隆的,但包含手动安装的软件包和修改后的文件,这些文件可能因设备而异。 raspis 都有一个 USB 闪存作为更抗腐蚀的 RW 驱动器和一个脚本来在启动时格式化它以防驱动器损坏。他们通过可靠性不同的 GPRS 连接给家里打电话。
系统要求如下:
- 配置文件、脚本和二进制文件的简单版本控制,至少是 /etc、/root 和 home,最好是 Git
- 高效 up-/downgrade 通过 GPRS 从任何版本到其他版本 -> 仅传输文件增量
- 如果连接不再有效,可以自动回滚最近应用的补丁
- 根文件系统在下载更改时不能处于 RW 模式,更改需要在应用到 /
之前存储在本地
简单的方法可能是在远程 git 存储库中保留文件系统的完整副本,在提交之间生成差异文件,将补丁上传到现场并应用它。但是,目前不同 raspis 上的文件并不相同。这意味着,至少在安装系统时,必须通过类似于 rsync -a.
的方式来同步文件。
程序应与 "save diff between / and ssh folder to a file on the USB stick, mount / RW, apply diff from file, mount / RO" 一致。 Rsync 同时进行差异获取和应用,所以我的第一个问题变成:
1 是否存在类似 rsync 的东西可以从本地和远程保存文件增量并在以后应用它们?
另外,我从来没有做过这样的系统,图纸是"closest to legit I can come up with"。这里有很多活动部件,我很害怕我事先没有想到的事情会导致事情变得非常糟糕。我的其余问题是:
- 我是不是偏离了基地,实际上有 smarter/safe(r) 方法可以做到这一点吗?
- 如果不是,我应该遵循什么样的最佳实践以及什么样的事情要格外小心(不要使设备变砖)?
- 如何处理诸如安装新程序之类的事情?绕过数据包管理器,安装在 /opt?
- 如何管理permissions/owners(应用程序逻辑的root+1用户)?只是 运行 一切都是 root 并希望最好的?
是的,这是一个非常宽泛的问题。这不会直接回答您的问题,而是为您的研究提供指导。
防止文件系统损坏的一种方法是使用覆盖文件系统(例如 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
学习使用补丁命令。有二进制补丁命令How do I create binary patches?.
要在所有问题出现时进行超级恢复,您需要硬件支持看门狗定时器和从备用(辅助)根文件系统进行故障安全引导的能力。
如果您想要防弹产品,预计会花费大量时间和金钱。没有捷径。
我很头疼。我们在相距数百公里的场地上有多个树莓派。我们需要能够安全地(大概)远程升级它们,因为本地访问的价格可能高达几百欧元。
raspis 运行 rasbian,/ 位于安装在 RO 中的 SD 卡上,以防止断电时损坏(通常 once/day)。 SD 卡是从相同的基础映像克隆的,但包含手动安装的软件包和修改后的文件,这些文件可能因设备而异。 raspis 都有一个 USB 闪存作为更抗腐蚀的 RW 驱动器和一个脚本来在启动时格式化它以防驱动器损坏。他们通过可靠性不同的 GPRS 连接给家里打电话。
系统要求如下:
- 配置文件、脚本和二进制文件的简单版本控制,至少是 /etc、/root 和 home,最好是 Git
- 高效 up-/downgrade 通过 GPRS 从任何版本到其他版本 -> 仅传输文件增量
- 如果连接不再有效,可以自动回滚最近应用的补丁
- 根文件系统在下载更改时不能处于 RW 模式,更改需要在应用到 / 之前存储在本地
简单的方法可能是在远程 git 存储库中保留文件系统的完整副本,在提交之间生成差异文件,将补丁上传到现场并应用它。但是,目前不同 raspis 上的文件并不相同。这意味着,至少在安装系统时,必须通过类似于 rsync -a.
的方式来同步文件。程序应与 "save diff between / and ssh folder to a file on the USB stick, mount / RW, apply diff from file, mount / RO" 一致。 Rsync 同时进行差异获取和应用,所以我的第一个问题变成:
1 是否存在类似 rsync 的东西可以从本地和远程保存文件增量并在以后应用它们?
另外,我从来没有做过这样的系统,图纸是"closest to legit I can come up with"。这里有很多活动部件,我很害怕我事先没有想到的事情会导致事情变得非常糟糕。我的其余问题是:
- 我是不是偏离了基地,实际上有 smarter/safe(r) 方法可以做到这一点吗?
- 如果不是,我应该遵循什么样的最佳实践以及什么样的事情要格外小心(不要使设备变砖)?
- 如何处理诸如安装新程序之类的事情?绕过数据包管理器,安装在 /opt?
- 如何管理permissions/owners(应用程序逻辑的root+1用户)?只是 运行 一切都是 root 并希望最好的?
是的,这是一个非常宽泛的问题。这不会直接回答您的问题,而是为您的研究提供指导。
防止文件系统损坏的一种方法是使用覆盖文件系统(例如 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
学习使用补丁命令。有二进制补丁命令How do I create binary patches?.
要在所有问题出现时进行超级恢复,您需要硬件支持看门狗定时器和从备用(辅助)根文件系统进行故障安全引导的能力。
如果您想要防弹产品,预计会花费大量时间和金钱。没有捷径。