Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kernel 如何从失败的内核或rootfs中恢复?_Kernel_Embedded Linux_Bootloader_Reboot_U Boot - Fatal编程技术网

Kernel 如何从失败的内核或rootfs中恢复?

Kernel 如何从失败的内核或rootfs中恢复?,kernel,embedded-linux,bootloader,reboot,u-boot,Kernel,Embedded Linux,Bootloader,Reboot,U Boot,我能够从u-boot引导到几个分区:当前运行的kernel/rootfs、最后一个已知的良好kernel/rootfs和工厂重置kernel/rootfs 如果内核/rootfs覆盖了它自己的一部分,然后不断地重置,它应该能够恢复吗?我觉得在bootcmd环境变量中使用脚本来硬编码回退有点像黑客。有没有一个共同的方法 在bootcmd变量中,沿以下行嵌套脚本: setenv bootargs "root=/dev/mmcblk0p2 rdinit=/bin/kinit rw single" se

我能够从u-boot引导到几个分区:当前运行的kernel/rootfs、最后一个已知的良好kernel/rootfs和工厂重置kernel/rootfs

如果内核/rootfs覆盖了它自己的一部分,然后不断地重置,它应该能够恢复吗?我觉得在bootcmd环境变量中使用脚本来硬编码回退有点像黑客。有没有一个共同的方法

在bootcmd变量中,沿以下行嵌套脚本:

setenv bootargs "root=/dev/mmcblk0p2 rdinit=/bin/kinit rw single"
setenv bootcmd_mmc "ext2load mmc 0:1 0x40000000 my_kernel.itb && bootm"
run bootcmd_mmc

setenv bootargs "root=/dev/mmcblk0p4 rdinit=/bin/kinit rw single"
setenv bootcmd_mmc "ext2load mmc 0:3 0x40000000 my_kernel.itb && bootm"
run bootcmd_mmc

setenv bootargs "root=/dev/mmcblk0p6 rdinit=/bin/kinit rw single"
setenv bootcmd_mmc "ext2load mmc 0:5 0x40000000 my_kernel.itb && bootm"
run bootcmd_mmc

根据需求类型,可以有多种选择。其中之一可以基于禁用autoboot并控制。如果启用了自动加载(autoboot)选项,您可能需要禁用它。检查bootdelay参数。如果该值设置为-1,则自动启动功能将被禁用,方法是根据您的意愿控制更改

如果您可能需要通过脚本尝试不同的配置,那么简单的方法是在u-boot环境中修改bootcmd变量,以便它可以通过更改u-boot脚本来尝试通过用于/适用于您的电路板的不同配置进行引导

但是,在由于映像损坏而导致引导失败的情况下,bootm确实很有用。如果第一个映像或第二个映像的引导失败,或者两个映像文件都不存在,下面的命令允许通过tftp服务器加载映像

bootm$imageone|u addr|bootm$imagetwo|addr|tftpboot$addr$filename&&bootm


另外,另一种方法是在每次重新启动时从一组最新映像中加载一个备用映像,这样稳定的版本就不会重新启动。

根据需求类型,可以有各种选项。其中之一可以基于禁用autoboot并控制。如果启用了自动加载(autoboot)选项,您可能需要禁用它。检查bootdelay参数。如果该值设置为-1,则自动启动功能将被禁用,方法是根据您的意愿控制更改

如果您可能需要通过脚本尝试不同的配置,那么简单的方法是在u-boot环境中修改bootcmd变量,以便它可以通过更改u-boot脚本来尝试通过用于/适用于您的电路板的不同配置进行引导

但是,在由于映像损坏而导致引导失败的情况下,bootm确实很有用。如果第一个映像或第二个映像的引导失败,或者两个映像文件都不存在,下面的命令允许通过tftp服务器加载映像

bootm$imageone|u addr|bootm$imagetwo|addr|tftpboot$addr$filename&&bootm


另外,另一种方法是在每次重新启动时从一组最新映像中加载一个备用映像,这样稳定的版本就不会重新启动。

如果bootm命令实际跳转到内核启动地址(例如“启动linux内核…”消息),则不会返回U-Boot(重新启动除外)。如果内核发生oops或死机,那么处理器可以暂停或重置。不存在完全“恢复”的可能性。从失败引导重新启动的一种方法是使用看门狗计时器。@sawdust,谢谢。我没有发布执行不会在oops或死机上从u-boot的中间继续。我在固件中有一个看门狗,但试图防止固件破坏自己,然后继续引导回其破坏的自我。如果你想干扰Linux引导失败的循环,那么你必须对U-boot环境进行编程,以便在每次启动时选择不同的内核映像。当内核成功引导时,内核需要修改U-boot的环境以禁止此映像重新选择。如果bootm命令实际跳转到内核启动地址(例如“Starting linux kernel…”消息),则不会返回U-boot(重启除外)。如果内核发生oops或死机,那么处理器可以暂停或重置。不存在完全“恢复”的可能性。从失败引导重新启动的一种方法是使用看门狗计时器。@sawdust,谢谢。我没有发布执行不会在oops或死机上从u-boot的中间继续。我在固件中有一个看门狗,但试图防止固件破坏自己,然后继续引导回其破坏的自我。如果你想干扰Linux引导失败的循环,那么你必须对U-boot环境进行编程,以便在每次启动时选择不同的内核映像。当内核成功引导时,内核需要修改U-boot的环境以禁止此映像重新选择。