自定义恢复分区


9

我正在一个项目中,它将通过HTTP升级Raspberry PI,并且Raspberry PI将无法直接访问(不能只是交换卡)。

我想要这样的分区设置:

  • 分区1- / boot(两个分区均包含内核)
  • 分区2-/(恢复分区)
  • 分区3- /(主分区)

当升级失败并且Raspberry PI进入重启循环或挂起时,我希望用户能够按下一个按钮,该按钮触发GPIO线,这将导致引导加载程序引导进入恢复分区而不是主分区。

恢复分区永远不会升级,因此这是安全的。

我看到几个选择:

  1. 始终引导到恢复分区,检查GPIO,然后引导到未按下任何按钮的主分区
  2. GPIO由引导加载程序直接检查

我基本上是在尝试做类似于路由器的操作,如果您在启动时保持复位状态,则可以在新映像或其他内容上进行TFTP。

Raspberry PI有可能吗?如果是这样,是否有任何有关执行此类操作的文档?

编辑:

我找到了以下相关问题的答案是否可以从SD卡双重启动?

对上述问题的评论将我引到了这里:http : //www.berryterminal.com/doku.php/berryboot。这看起来很有希望,但是我将不得不对其进行更多研究,以查看是否可以从中读取GPIO。如果有人有任何经验,我会很感兴趣。


让我们知道您如何处理,看起来很有趣:)
Jivings

1
我想我找到了一种方法,可以通过编写一个简单的第二阶段引导程序来完成此操作,因此,如果能够解决此问题,请确保在此处进行记录。仍然希望有一个简单的解决方案……
beatgammit 2012年

1
不幸的是,没有,但是我使用RO文件系统/boot((RO),/(RO),/var(RW),/home(RW))大大降低了损坏的可能性。最初的问题是引导期间断电时文件系统损坏。我仍然想编写/查找第二阶段的引导程序。
Beatgammit

1
你可以看一下菜鸟(raspberrypi.org/archives/4100)引导程序的皮一样。它实际上可能只适合您的用途,因为它提供了恢复分区和安装。
2014年

1
我建议使用自定义的引导程序“反对”,但要使用在系统启动后运行的hack。实施起来更容易,调试起来也更安全。引导加载程序有故障可能会油炸您的Pi。
Maxthon Chan

Answers:


5

如果在系统启动后的任何时间发生错误,则可以使用看门狗计时器和一些启动脚本。

此方法的原理是,每当系统重新启动而没有正确关闭时,它将进入恢复分区。

您需要编写一个脚本,该脚本在系统每次启动并正确关闭时都运行。/boot/cmdline.txt系统启动时更改为恢复分区,然后在正确关闭之前更改为恢复分区。

然后设置看门狗定时器。您可以使用BCM2835芯片中的内置芯片,也可以(如果使用修订版2的主板)使用两个GPIO引脚,复位头P6和555芯片构造自己的芯片。启动关键程序后,启动看门狗计时器,如果系统运行正常,则定期踢狗。当系统发生故障时,看门狗计时器将被触发并重置处理器,并将其发送到恢复分区。这也不需要用户交互,如果使用内置计时器,也不需要GPIO。

使用此方法,您还可以实现一个重置按钮,该按钮可以确保通过在P6接头连接器上安装按钮来将系统手动发送到Rev. 2板上。


您的第一个答案与我可能会做的有点接近,但是我喜欢在用户空间和看门狗中使用GPIO的想法。虽然我可能不会大量使用任何想法,但您却给了我一些好的想法。谢谢!
Beatgammit 2014年

1

我有一种不破坏内核的方法,它涉及保护系统免于不及时重启:

  1. 下载升级映像,对其进行校验和并将其扩展到暂存空间。
  2. 更改/boot/cmdline.txt,以便下次系统引导时将恢复分区用作根块设备。
  3. 从头开始安装升级,并验证升级是否正常。
  4. 如果升级正常,请改回/boot/cmdline.txt。
  5. 如果需要,请重新启动。

升级失败将导致系统自动启动到恢复中。无需GPIO。


唯一的问题是(取决于系统)更新完成后数小时可能会检测到故障,此时用户无法选择恢复到恢复分区。

1
@DanNixon我要发布另一个答案来解决此新问题。
Maxthon Chan

1

另外,还有第三个可能的解决方案,但是它将需要您剖析initrd某些PC版本的Linux发行版,以了解syscall的pivot_init()工作方式。我不确定Pi的内核是否具有此系统调用。如果可以,则可以使用这种方法,也不需要内核破解,并且使用一个GPIO。

为此,您将需要init在生产系统中编写一个自定义程序。检查GPIO是否打开。如果是这样,pivot_root()要恢复。然后exec()原来的,init以便系统继续启动。您可以在生产系统中找到一种方法,以使构造此GPIO的监视init与原始init(PID = 1)并排运行(PID = 2),并密切关注GPIO并重新启动以恢复按下按钮。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.