52d28c1140
The staged sysupgrade allows to properly unmount the rootfs before writing the new partitions. This will fix upgrades losing configuration when parition sizes change on x86 and similar image types.
91 lines
3.0 KiB
Diff
91 lines
3.0 KiB
Diff
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
|
Date: Wed, 3 May 2017 09:05:25 +0200
|
|
Subject: x86: sysupgrade: refactor platform_do_upgrade
|
|
|
|
By returning early when no upgrade device can be found and handling the
|
|
SAVE_PARTITIONS=0 case differently, we can get rid of two levels of if.
|
|
|
|
Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
|
|
|
|
diff --git a/target/linux/x86/base-files/lib/upgrade/platform.sh b/target/linux/x86/base-files/lib/upgrade/platform.sh
|
|
index 81b349a81816033eef9df464b2a70fdb998e5a1d..4fa71999be7be3972676a1019488972dccd57fa2 100644
|
|
--- a/target/linux/x86/base-files/lib/upgrade/platform.sh
|
|
+++ b/target/linux/x86/base-files/lib/upgrade/platform.sh
|
|
@@ -47,40 +47,43 @@ platform_copy_config() {
|
|
platform_do_upgrade() {
|
|
local diskdev partdev diff
|
|
|
|
- if export_bootdevice && export_partdevice diskdev 0; then
|
|
- sync
|
|
- if [ "$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)"
|
|
- if [ -n "$diff" ]; then
|
|
- get_image "$@" | dd of="/dev/$diskdev" bs=4096 conv=fsync
|
|
- return 0
|
|
- fi
|
|
-
|
|
- #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
|
|
+ export_bootdevice && export_partdevice diskdev 0 || {
|
|
+ echo "Unable to determine upgrade device"
|
|
+ return 1
|
|
+ }
|
|
+
|
|
+ sync
|
|
+
|
|
+ if [ "$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
|
|
+ return 0
|
|
+ fi
|
|
+
|
|
+ #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
|
|
- get_image "$@" | dd of="/dev/$diskdev" bs=4096 conv=fsync
|
|
+ echo "Unable to find partition $part device, skipped."
|
|
fi
|
|
+ done < /tmp/partmap.image
|
|
|
|
- sleep 1
|
|
- fi
|
|
+ #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
|
|
}
|