aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/x86
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/x86')
-rw-r--r--target/linux/x86/Makefile2
-rw-r--r--target/linux/x86/base-files/lib/upgrade/platform.sh51
2 files changed, 51 insertions, 2 deletions
diff --git a/target/linux/x86/Makefile b/target/linux/x86/Makefile
index e4bc0d9a50..45bb8c7cac 100644
--- a/target/linux/x86/Makefile
+++ b/target/linux/x86/Makefile
@@ -13,6 +13,8 @@ FEATURES:=squashfs ext4 vdi vmdk pcmcia targz
SUBTARGETS=generic xen_domu ep80579 geode kvm_guest 64
MAINTAINER:=Felix Fietkau <nbd@openwrt.org>
+DEFAULT_PACKAGES += partx-utils
+
KERNEL_PATCHVER:=4.4
KERNELNAME:=bzImage
diff --git a/target/linux/x86/base-files/lib/upgrade/platform.sh b/target/linux/x86/base-files/lib/upgrade/platform.sh
index 73ab5ef079..86696aec04 100644
--- a/target/linux/x86/base-files/lib/upgrade/platform.sh
+++ b/target/linux/x86/base-files/lib/upgrade/platform.sh
@@ -55,12 +55,59 @@ platform_copy_config() {
fi
}
+get_partitions() { # <device> <filename>
+ local disk="$1"
+ local filename="$2"
+
+ if [ -b "$disk" -o -f "$disk" ]; then
+ echo "Reading partition table from $filename..."
+ partx -r "$disk" -gbo NR,START,SECTORS > "/tmp/partx.$filename"
+ fi
+}
+
platform_do_upgrade() {
platform_export_bootpart
+ disk="${BOOTPART%[0-9]}"
- if [ -b "${BOOTPART%[0-9]}" ]; then
+ if [ -b "$disk" ]; then
sync
- get_image "$@" | dd of="${BOOTPART%[0-9]}" bs=4096 conv=fsync
+ if [ "$SAVE_PARTITIONS" = "1" ]; then
+ get_partitions "$disk" bootdisk
+
+
+ #get block size
+ sectors="$(partx -r $disk -gbo SECTORS --nr 1:1)"
+ size="$(partx -r $disk -gbo SIZE --nr 1:1)"
+ ibs="$(($size / $sectors))"
+
+ #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/partx.bootdisk /tmp/partx.image)"
+ if [ -n "$diff" ]; then
+ echo "Partition layout is changed. Full image will be written."
+ ask_bool 0 "Abort" && exit
+
+ get_image "$@" | dd of="$disk" 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
+ echo "Writing image to $disk$part..."
+ get_image "$@" | dd of="$disk$part" ibs="$ibs" obs=1M skip="$start" count="$size" conv=fsync
+ done < /tmp/partx.image
+
+ #copy partition uuid
+ echo "Writing new UUID to $disk$part..."
+ get_image "$@" | dd of="$disk" bs=1 skip=440 count=4 seek=440 conv=fsync
+ else
+ get_image "$@" | dd of="$disk" bs=4096 conv=fsync
+ fi
+
sleep 1
fi
}