mirror of
https://github.com/home-assistant/operating-system.git
synced 2025-07-28 15:36:29 +00:00
Avoid trying to boot non-existing kernel image in failover case (#1016)
* Avoid trying to boot non-existing kernel image in fail-over case The A/B update system automatically switches to the other boot slot when booting fails. However, in a fresh installation, only boot slot A exists. If booting fails three times (e.g. if somebody plugs out power before the slot can be marked as good), then the system switches to boot slot B which does not contain a kernel image yet. Avoid trying to boot the non-existing kernel image. With this change, if slot B is empty U-Boot will restore both slots to 3 attempts and retry booting from slot A on next reboot: ``` Trying to boot slot B, 2 attempts remaining. Loading kernel ... ** Unrecognized filesystem type ** No valid slot found, resetting tries to 3 storing env... ``` Co-authored-by: Pascal Vizeli <pascal.vizeli@syshack.ch>
This commit is contained in:
parent
8442d2ccfa
commit
5756969be9
@ -40,16 +40,17 @@ for BOOT_SLOT in "${BOOT_ORDER}"; do
|
|||||||
elif test "x${BOOT_SLOT}" = "xA"; then
|
elif test "x${BOOT_SLOT}" = "xA"; then
|
||||||
if test ${BOOT_A_LEFT} -gt 0; then
|
if test ${BOOT_A_LEFT} -gt 0; then
|
||||||
setexpr BOOT_A_LEFT ${BOOT_A_LEFT} - 1
|
setexpr BOOT_A_LEFT ${BOOT_A_LEFT} - 1
|
||||||
echo "Found valid slot A, ${BOOT_A_LEFT} attempts remaining"
|
echo "Trying to boot slot A, ${BOOT_A_LEFT} attempts remaining. Loading kernel ..."
|
||||||
setenv load_kernel "ext4load mmc ${devnum}:2 ${kernel_addr_r} zImage"
|
if ext4load mmc ${devnum}:2 ${kernel_addr_r} zImage; then
|
||||||
setenv bootargs "${bootargs_hassos} ${bootargs_a} rauc.slot=A ${cmdline}"
|
setenv bootargs "${bootargs_hassos} ${bootargs_a} rauc.slot=A ${cmdline}"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
elif test "x${BOOT_SLOT}" = "xB"; then
|
elif test "x${BOOT_SLOT}" = "xB"; then
|
||||||
if test ${BOOT_B_LEFT} -gt 0; then
|
if test ${BOOT_B_LEFT} -gt 0; then
|
||||||
setexpr BOOT_B_LEFT ${BOOT_B_LEFT} - 1
|
setexpr BOOT_B_LEFT ${BOOT_B_LEFT} - 1
|
||||||
echo "Found valid slot B, ${BOOT_B_LEFT} attempts remaining"
|
echo "Trying to boot slot B, ${BOOT_B_LEFT} attempts remaining. Loading kernel ..."
|
||||||
setenv load_kernel "ext4load mmc ${devnum}:4 ${kernel_addr_r} zImage"
|
if ext4load mmc ${devnum}:4 ${kernel_addr_r} zImage"; then
|
||||||
setenv bootargs "${bootargs_hassos} ${bootargs_b} rauc.slot=B ${cmdline}"
|
setenv bootargs "${bootargs_hassos} ${bootargs_b} rauc.slot=B ${cmdline}"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
@ -64,10 +65,8 @@ else
|
|||||||
reset
|
reset
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Loading kernel"
|
echo "Starting kernel"
|
||||||
run load_kernel
|
|
||||||
echo " Starting kernel"
|
|
||||||
bootz ${kernel_addr_r} - ${fdt_addr_r}
|
bootz ${kernel_addr_r} - ${fdt_addr_r}
|
||||||
|
|
||||||
echo "Fails on boot"
|
echo "Boot failed, resetting..."
|
||||||
reset
|
reset
|
||||||
|
@ -46,16 +46,18 @@ for BOOT_SLOT in "${BOOT_ORDER}"; do
|
|||||||
elif test "x${BOOT_SLOT}" = "xA"; then
|
elif test "x${BOOT_SLOT}" = "xA"; then
|
||||||
if test ${BOOT_A_LEFT} -gt 0; then
|
if test ${BOOT_A_LEFT} -gt 0; then
|
||||||
setexpr BOOT_A_LEFT ${BOOT_A_LEFT} - 1
|
setexpr BOOT_A_LEFT ${BOOT_A_LEFT} - 1
|
||||||
echo "Found valid slot A, ${BOOT_A_LEFT} attempts remaining"
|
echo "Trying to boot slot A, ${BOOT_A_LEFT} attempts remaining. Loading kernel ..."
|
||||||
setenv load_kernel "ext4load mmc ${devnum}:5 ${kernel_addr_r} Image"
|
if ext4load mmc ${devnum}:5 ${kernel_addr_r} Image; then
|
||||||
setenv bootargs "${bootargs_hassos} ${bootargs_a} rauc.slot=A ${cmdline}"
|
setenv bootargs "${bootargs_hassos} ${bootargs_a} rauc.slot=A ${cmdline}"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
elif test "x${BOOT_SLOT}" = "xB"; then
|
elif test "x${BOOT_SLOT}" = "xB"; then
|
||||||
if test ${BOOT_B_LEFT} -gt 0; then
|
if test ${BOOT_B_LEFT} -gt 0; then
|
||||||
setexpr BOOT_B_LEFT ${BOOT_B_LEFT} - 1
|
setexpr BOOT_B_LEFT ${BOOT_B_LEFT} - 1
|
||||||
echo "Found valid slot B, ${BOOT_B_LEFT} attempts remaining"
|
echo "Trying to boot slot B, ${BOOT_B_LEFT} attempts remaining. Loading kernel ..."
|
||||||
setenv load_kernel "ext4load mmc ${devnum}:7 ${kernel_addr_r} Image"
|
if ext4load mmc ${devnum}:7 ${kernel_addr_r} Image; then
|
||||||
setenv bootargs "${bootargs_hassos} ${bootargs_b} rauc.slot=B ${cmdline}"
|
setenv bootargs "${bootargs_hassos} ${bootargs_b} rauc.slot=B ${cmdline}"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
@ -70,12 +72,9 @@ else
|
|||||||
reset
|
reset
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Loading kernel"
|
|
||||||
run load_kernel
|
|
||||||
echo " Starting kernel"
|
|
||||||
printenv load_kernel
|
|
||||||
printenv bootargs
|
printenv bootargs
|
||||||
|
echo "Starting kernel"
|
||||||
booti ${kernel_addr_r} - ${fdt_addr_r}
|
booti ${kernel_addr_r} - ${fdt_addr_r}
|
||||||
|
|
||||||
echo "Fails on boot"
|
echo "Boot failed, resetting..."
|
||||||
reset
|
reset
|
||||||
|
@ -46,16 +46,18 @@ for BOOT_SLOT in "${BOOT_ORDER}"; do
|
|||||||
elif test "x${BOOT_SLOT}" = "xA"; then
|
elif test "x${BOOT_SLOT}" = "xA"; then
|
||||||
if test ${BOOT_A_LEFT} -gt 0; then
|
if test ${BOOT_A_LEFT} -gt 0; then
|
||||||
setexpr BOOT_A_LEFT ${BOOT_A_LEFT} - 1
|
setexpr BOOT_A_LEFT ${BOOT_A_LEFT} - 1
|
||||||
echo "Found valid slot A, ${BOOT_A_LEFT} attempts remaining"
|
echo "Trying to boot slot A, ${BOOT_A_LEFT} attempts remaining. Loading kernel ..."
|
||||||
setenv load_kernel "ext4load mmc ${devnum}:5 ${kernel_addr_r} Image"
|
if ext4load mmc ${devnum}:5 ${kernel_addr_r} Image; then
|
||||||
setenv bootargs "${bootargs_hassos} ${bootargs_a} rauc.slot=A ${cmdline}"
|
setenv bootargs "${bootargs_hassos} ${bootargs_a} rauc.slot=A ${cmdline}"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
elif test "x${BOOT_SLOT}" = "xB"; then
|
elif test "x${BOOT_SLOT}" = "xB"; then
|
||||||
if test ${BOOT_B_LEFT} -gt 0; then
|
if test ${BOOT_B_LEFT} -gt 0; then
|
||||||
setexpr BOOT_B_LEFT ${BOOT_B_LEFT} - 1
|
setexpr BOOT_B_LEFT ${BOOT_B_LEFT} - 1
|
||||||
echo "Found valid slot B, ${BOOT_B_LEFT} attempts remaining"
|
echo "Trying to boot slot B, ${BOOT_B_LEFT} attempts remaining. Loading kernel ..."
|
||||||
setenv load_kernel "ext4load mmc ${devnum}:7 ${kernel_addr_r} Image"
|
if ext4load mmc ${devnum}:7 ${kernel_addr_r} Image; then
|
||||||
setenv bootargs "${bootargs_hassos} ${bootargs_b} rauc.slot=B ${cmdline}"
|
setenv bootargs "${bootargs_hassos} ${bootargs_b} rauc.slot=B ${cmdline}"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
@ -70,12 +72,9 @@ else
|
|||||||
reset
|
reset
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Loading kernel"
|
|
||||||
run load_kernel
|
|
||||||
echo " Starting kernel"
|
|
||||||
printenv load_kernel
|
|
||||||
printenv bootargs
|
printenv bootargs
|
||||||
|
echo "Starting kernel"
|
||||||
booti ${kernel_addr_r} - ${fdt_addr_r}
|
booti ${kernel_addr_r} - ${fdt_addr_r}
|
||||||
|
|
||||||
echo "Fails on boot"
|
echo "Boot failed, resetting..."
|
||||||
reset
|
reset
|
||||||
|
@ -50,16 +50,18 @@ for BOOT_SLOT in "${BOOT_ORDER}"; do
|
|||||||
elif test "x${BOOT_SLOT}" = "xA"; then
|
elif test "x${BOOT_SLOT}" = "xA"; then
|
||||||
if test ${BOOT_A_LEFT} -gt 0; then
|
if test ${BOOT_A_LEFT} -gt 0; then
|
||||||
setexpr BOOT_A_LEFT ${BOOT_A_LEFT} - 1
|
setexpr BOOT_A_LEFT ${BOOT_A_LEFT} - 1
|
||||||
echo "Found valid slot A, ${BOOT_A_LEFT} attempts remaining"
|
echo "Trying to boot slot A, ${BOOT_A_LEFT} attempts remaining. Loading kernel ..."
|
||||||
setenv load_kernel "ext4load mmc ${devnum}:5 ${kernel_addr_r} Image"
|
if ext4load mmc ${devnum}:5 ${kernel_addr_r} Image; then
|
||||||
setenv bootargs "${bootargs_hassos} ${bootargs_a} rauc.slot=A ${cmdline}"
|
setenv bootargs "${bootargs_hassos} ${bootargs_a} rauc.slot=A ${cmdline}"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
elif test "x${BOOT_SLOT}" = "xB"; then
|
elif test "x${BOOT_SLOT}" = "xB"; then
|
||||||
if test ${BOOT_B_LEFT} -gt 0; then
|
if test ${BOOT_B_LEFT} -gt 0; then
|
||||||
setexpr BOOT_B_LEFT ${BOOT_B_LEFT} - 1
|
setexpr BOOT_B_LEFT ${BOOT_B_LEFT} - 1
|
||||||
echo "Found valid slot B, ${BOOT_B_LEFT} attempts remaining"
|
echo "Trying to boot slot B, ${BOOT_B_LEFT} attempts remaining. Loading kernel ..."
|
||||||
setenv load_kernel "ext4load mmc ${devnum}:7 ${kernel_addr_r} Image"
|
if ext4load mmc ${devnum}:7 ${kernel_addr_r} Image; then
|
||||||
setenv bootargs "${bootargs_hassos} ${bootargs_b} rauc.slot=B ${cmdline}"
|
setenv bootargs "${bootargs_hassos} ${bootargs_b} rauc.slot=B ${cmdline}"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
@ -74,12 +76,9 @@ else
|
|||||||
reset
|
reset
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Loading kernel"
|
|
||||||
run load_kernel
|
|
||||||
echo " Starting kernel"
|
|
||||||
printenv load_kernel
|
|
||||||
printenv bootargs
|
printenv bootargs
|
||||||
|
echo "Starting kernel"
|
||||||
booti ${kernel_addr_r} - ${fdt_addr_r}
|
booti ${kernel_addr_r} - ${fdt_addr_r}
|
||||||
|
|
||||||
echo "Fails on boot"
|
echo "Boot failed, resetting..."
|
||||||
reset
|
reset
|
||||||
|
@ -50,16 +50,18 @@ for BOOT_SLOT in "${BOOT_ORDER}"; do
|
|||||||
elif test "x${BOOT_SLOT}" = "xA"; then
|
elif test "x${BOOT_SLOT}" = "xA"; then
|
||||||
if test ${BOOT_A_LEFT} -gt 0; then
|
if test ${BOOT_A_LEFT} -gt 0; then
|
||||||
setexpr BOOT_A_LEFT ${BOOT_A_LEFT} - 1
|
setexpr BOOT_A_LEFT ${BOOT_A_LEFT} - 1
|
||||||
echo "Found valid slot A, ${BOOT_A_LEFT} attempts remaining"
|
echo "Trying to boot slot A, ${BOOT_A_LEFT} attempts remaining. Loading kernel ..."
|
||||||
setenv load_kernel "ext4load mmc ${devnum}:5 ${kernel_addr_r} zImage"
|
if ext4load mmc ${devnum}:5 ${kernel_addr_r} zImage; then
|
||||||
setenv bootargs "${bootargs_hassos} ${bootargs_a} rauc.slot=A ${cmdline}"
|
setenv bootargs "${bootargs_hassos} ${bootargs_a} rauc.slot=A ${cmdline}"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
elif test "x${BOOT_SLOT}" = "xB"; then
|
elif test "x${BOOT_SLOT}" = "xB"; then
|
||||||
if test ${BOOT_B_LEFT} -gt 0; then
|
if test ${BOOT_B_LEFT} -gt 0; then
|
||||||
setexpr BOOT_B_LEFT ${BOOT_B_LEFT} - 1
|
setexpr BOOT_B_LEFT ${BOOT_B_LEFT} - 1
|
||||||
echo "Found valid slot B, ${BOOT_B_LEFT} attempts remaining"
|
echo "Trying to boot slot B, ${BOOT_B_LEFT} attempts remaining. Loading kernel ..."
|
||||||
setenv load_kernel "ext4load mmc ${devnum}:7 ${kernel_addr_r} zImage"
|
if ext4load mmc ${devnum}:7 ${kernel_addr_r} zImage; then
|
||||||
setenv bootargs "${bootargs_hassos} ${bootargs_b} rauc.slot=B ${cmdline}"
|
setenv bootargs "${bootargs_hassos} ${bootargs_b} rauc.slot=B ${cmdline}"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
@ -74,13 +76,9 @@ else
|
|||||||
reset
|
reset
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Loading kernel"
|
|
||||||
run load_kernel
|
|
||||||
echo " Starting kernel"
|
|
||||||
printenv load_kernel
|
|
||||||
printenv bootargs
|
printenv bootargs
|
||||||
dmc ${ddr_freq}
|
echo "Starting kernel"
|
||||||
bootz ${kernel_addr_r} - ${fdt_addr_r}
|
booti ${kernel_addr_r} - ${fdt_addr_r}
|
||||||
|
|
||||||
echo "Fails on boot"
|
echo "Boot failed, resetting..."
|
||||||
reset
|
reset
|
||||||
|
@ -37,16 +37,18 @@ for BOOT_SLOT in "${BOOT_ORDER}"; do
|
|||||||
elif test "x${BOOT_SLOT}" = "xA"; then
|
elif test "x${BOOT_SLOT}" = "xA"; then
|
||||||
if test ${BOOT_A_LEFT} -gt 0; then
|
if test ${BOOT_A_LEFT} -gt 0; then
|
||||||
setexpr BOOT_A_LEFT ${BOOT_A_LEFT} - 1
|
setexpr BOOT_A_LEFT ${BOOT_A_LEFT} - 1
|
||||||
echo "Found valid slot A, ${BOOT_A_LEFT} attempts remaining"
|
echo "Trying to boot slot A, ${BOOT_A_LEFT} attempts remaining. Loading kernel ..."
|
||||||
setenv load_kernel "ext4load ${devtype} ${devnum}:2 ${kernel_addr_r} zImage"
|
if ext4load ${devtype} ${devnum}:2 ${kernel_addr_r} zImage; then
|
||||||
setenv bootargs "${bootargs_hassos} ${bootargs_rpi} ${bootargs_a} rauc.slot=A"
|
setenv bootargs "${bootargs_hassos} ${bootargs_rpi} ${bootargs_a} rauc.slot=A"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
elif test "x${BOOT_SLOT}" = "xB"; then
|
elif test "x${BOOT_SLOT}" = "xB"; then
|
||||||
if test ${BOOT_B_LEFT} -gt 0; then
|
if test ${BOOT_B_LEFT} -gt 0; then
|
||||||
setexpr BOOT_B_LEFT ${BOOT_B_LEFT} - 1
|
setexpr BOOT_B_LEFT ${BOOT_B_LEFT} - 1
|
||||||
echo "Found valid slot B, ${BOOT_B_LEFT} attempts remaining"
|
echo "Trying to boot slot B, ${BOOT_B_LEFT} attempts remaining. Loading kernel ..."
|
||||||
setenv load_kernel "ext4load ${devtype} ${devnum}:4 ${kernel_addr_r} zImage"
|
if ext4load ${devtype} ${devnum}:4 ${kernel_addr_r} zImage"; then
|
||||||
setenv bootargs "${bootargs_hassos} ${bootargs_rpi} ${bootargs_b} rauc.slot=B"
|
setenv bootargs "${bootargs_hassos} ${bootargs_rpi} ${bootargs_b} rauc.slot=B"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
@ -62,10 +64,8 @@ else
|
|||||||
reset
|
reset
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Loading kernel"
|
echo "Starting kernel"
|
||||||
run load_kernel
|
|
||||||
echo " Starting kernel"
|
|
||||||
bootz ${kernel_addr_r} - ${fdt_org}
|
bootz ${kernel_addr_r} - ${fdt_org}
|
||||||
|
|
||||||
echo "Fails on boot"
|
echo "Boot failed, resetting..."
|
||||||
reset
|
reset
|
||||||
|
@ -37,16 +37,18 @@ for BOOT_SLOT in "${BOOT_ORDER}"; do
|
|||||||
elif test "x${BOOT_SLOT}" = "xA"; then
|
elif test "x${BOOT_SLOT}" = "xA"; then
|
||||||
if test ${BOOT_A_LEFT} -gt 0; then
|
if test ${BOOT_A_LEFT} -gt 0; then
|
||||||
setexpr BOOT_A_LEFT ${BOOT_A_LEFT} - 1
|
setexpr BOOT_A_LEFT ${BOOT_A_LEFT} - 1
|
||||||
echo "Found valid slot A, ${BOOT_A_LEFT} attempts remaining"
|
echo "Trying to boot slot A, ${BOOT_A_LEFT} attempts remaining. Loading kernel ..."
|
||||||
setenv load_kernel "ext4load ${devtype} ${devnum}:2 ${kernel_addr_r} Image"
|
if ext4load ${devtype} ${devnum}:2 ${kernel_addr_r} Image; then
|
||||||
setenv bootargs "${bootargs_hassos} ${bootargs_rpi} ${bootargs_a} rauc.slot=A"
|
setenv bootargs "${bootargs_hassos} ${bootargs_rpi} ${bootargs_a} rauc.slot=A"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
elif test "x${BOOT_SLOT}" = "xB"; then
|
elif test "x${BOOT_SLOT}" = "xB"; then
|
||||||
if test ${BOOT_B_LEFT} -gt 0; then
|
if test ${BOOT_B_LEFT} -gt 0; then
|
||||||
setexpr BOOT_B_LEFT ${BOOT_B_LEFT} - 1
|
setexpr BOOT_B_LEFT ${BOOT_B_LEFT} - 1
|
||||||
echo "Found valid slot B, ${BOOT_B_LEFT} attempts remaining"
|
echo "Trying to boot slot B, ${BOOT_B_LEFT} attempts remaining. Loading kernel ..."
|
||||||
setenv load_kernel "ext4load ${devtype} ${devnum}:4 ${kernel_addr_r} Image"
|
if ext4load ${devtype} ${devnum}:4 ${kernel_addr_r} Image"; then
|
||||||
setenv bootargs "${bootargs_hassos} ${bootargs_rpi} ${bootargs_b} rauc.slot=B"
|
setenv bootargs "${bootargs_hassos} ${bootargs_rpi} ${bootargs_b} rauc.slot=B"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
@ -62,10 +64,8 @@ else
|
|||||||
reset
|
reset
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Loading kernel"
|
echo "Starting kernel"
|
||||||
run load_kernel
|
|
||||||
echo " Starting kernel"
|
|
||||||
booti ${kernel_addr_r} - ${fdt_org}
|
booti ${kernel_addr_r} - ${fdt_org}
|
||||||
|
|
||||||
echo "Fails on boot"
|
echo "Boot failed, resetting..."
|
||||||
reset
|
reset
|
||||||
|
Loading…
x
Reference in New Issue
Block a user