mirror of
https://github.com/openwrt/openwrt.git
synced 2025-01-10 06:52:53 +00:00
f10332c292
Move the update procedure from sysupgrade to first boot, which is much
more convenient in the sysupgrade case (otherwise the environment is
always one generation behind).
Check whether we have an old U-Boot release installed, and update the
environment only if necessary.
Some notes on the U-Boot environment:
The first 9 lines are a copy of the default environment of the old U-Boot
release - only modified, to run "distro_bootcmd", in case "mmcboot" fails
to boot the factory OS.
The remaining 16 lines are a backport of the default environment of the
new U-Boot release (shipped with CZ11NIC23). The main entry point is
"distro_bootcmd", which eventually sources boot.scr. This way, we have
a unified boot protocol for all Turris Omnia revisions so far.
This commit also fixes a shortcoming of previous Turris Omnia support:
Users may install OpenWrt with the Turris Omnia in factory state
(i.e. invalid environment store). In that case, neither fw_setenv, nor
U-Boot itself, would import the default environment from the image -
screwing up the rescue system, at least!
Signed-off-by: Klaus Kudielka <klaus.kudielka@gmail.com>
Reviewed-by: Tomasz Maciej Nowak <tomek_n@o2.pl>
Tested-by: W. Michael Petullo <mike@flyn.org> (Turris Omnia "2020")
Tested-by: Klaus Kudielka <klaus.kudielka@gmail.com> (Turris Omnia)
(cherry picked from commit dfa357a3de
)
105 lines
2.6 KiB
Bash
105 lines
2.6 KiB
Bash
get_magic_at() {
|
|
local file="$1"
|
|
local pos="$2"
|
|
get_image "$file" | dd bs=1 count=2 skip="$pos" 2>/dev/null | hexdump -v -n 2 -e '1/1 "%02x"'
|
|
}
|
|
|
|
platform_check_image_sdcard() {
|
|
local file="$1"
|
|
local magic diskdev partdev diff
|
|
|
|
magic=$(get_magic_at "$file" 510)
|
|
[ "$magic" != "55aa" ] && {
|
|
echo "Failed to verify MBR boot signature."
|
|
return 1
|
|
}
|
|
|
|
export_bootdevice && export_partdevice diskdev 0 || {
|
|
echo "Unable to determine upgrade device"
|
|
return 1
|
|
}
|
|
|
|
get_partitions "/dev/$diskdev" bootdisk
|
|
|
|
#extract the boot sector from the image
|
|
get_image "$@" | dd of=/tmp/image.bs count=1 bs=512b 2>/dev/null
|
|
|
|
get_partitions /tmp/image.bs image
|
|
|
|
#compare tables
|
|
diff="$(grep -F -x -v -f /tmp/partmap.bootdisk /tmp/partmap.image)"
|
|
|
|
rm -f /tmp/image.bs /tmp/partmap.bootdisk /tmp/partmap.image
|
|
|
|
if [ -n "$diff" ]; then
|
|
echo "Partition layout has changed. Full image will be written."
|
|
ask_bool 0 "Abort" && exit 1
|
|
return 0
|
|
fi
|
|
}
|
|
|
|
platform_do_upgrade_sdcard() {
|
|
local board=$(board_name)
|
|
local diskdev partdev diff
|
|
|
|
export_bootdevice && export_partdevice diskdev 0 || {
|
|
echo "Unable to determine upgrade device"
|
|
return 1
|
|
}
|
|
|
|
sync
|
|
|
|
if [ "$UPGRADE_OPT_SAVE_PARTITIONS" = "1" ]; then
|
|
get_partitions "/dev/$diskdev" bootdisk
|
|
|
|
#extract the boot sector from the image
|
|
get_image "$@" | dd of=/tmp/image.bs count=1 bs=512b
|
|
|
|
get_partitions /tmp/image.bs image
|
|
|
|
#compare tables
|
|
diff="$(grep -F -x -v -f /tmp/partmap.bootdisk /tmp/partmap.image)"
|
|
else
|
|
diff=1
|
|
fi
|
|
|
|
if [ -n "$diff" ]; then
|
|
get_image "$@" | dd of="/dev/$diskdev" bs=4096 conv=fsync
|
|
|
|
# Separate removal and addtion is necessary; otherwise, partition 1
|
|
# will be missing if it overlaps with the old partition 2
|
|
partx -d - "/dev/$diskdev"
|
|
partx -a - "/dev/$diskdev"
|
|
else
|
|
#write uboot image
|
|
get_image "$@" | dd of="$diskdev" bs=512 skip=1 seek=1 count=2048 conv=fsync
|
|
#iterate over each partition from the image and write it to the boot disk
|
|
while read part start size; do
|
|
if export_partdevice partdev $part; then
|
|
echo "Writing image to /dev/$partdev..."
|
|
get_image "$@" | dd of="/dev/$partdev" ibs="512" obs=1M skip="$start" count="$size" conv=fsync
|
|
else
|
|
echo "Unable to find partition $part device, skipped."
|
|
fi
|
|
done < /tmp/partmap.image
|
|
|
|
#copy partition uuid
|
|
echo "Writing new UUID to /dev/$diskdev..."
|
|
get_image "$@" | dd of="/dev/$diskdev" bs=1 skip=440 count=4 seek=440 conv=fsync
|
|
fi
|
|
|
|
sleep 1
|
|
}
|
|
|
|
platform_copy_config_sdcard() {
|
|
local partdev
|
|
|
|
if export_partdevice partdev 1; then
|
|
mkdir -p /boot
|
|
[ -f /boot/kernel.img ] || mount -o rw,noatime /dev/$partdev /boot
|
|
cp -af "$UPGRADE_BACKUP" "/boot/$BACKUP_FILE"
|
|
sync
|
|
umount /boot
|
|
fi
|
|
}
|