aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/x86
diff options
context:
space:
mode:
authorJo-Philipp Wich <jow@openwrt.org>2016-02-09 12:33:17 +0000
committerJo-Philipp Wich <jow@openwrt.org>2016-02-09 12:33:17 +0000
commit5c41d991dc365d76c3d9c62793fcbebb97721eac (patch)
tree086ba162d0005151dbf3c4ce56d5ac1fa546035f /target/linux/x86
parent16cf9021e611d08e32debc67507dfee0ffa3ec11 (diff)
downloadmaster-187ad058-5c41d991dc365d76c3d9c62793fcbebb97721eac.tar.gz
master-187ad058-5c41d991dc365d76c3d9c62793fcbebb97721eac.tar.bz2
master-187ad058-5c41d991dc365d76c3d9c62793fcbebb97721eac.zip
x86: preserve partition table on sysupgrade
With this patch sysupgrade will write directly to the partitions instead of to the main disk. The UUID is copied from the image to the MBR as well. This prevents the mbr from being completely overwritten and losing the partition table. The -p option has been added to maintain the original behavior and overwite the entire disk with the new image. Tests have been added to ensure that the image partitions match up with the active partitions. Signed-off-by: Rob Mosher <nyt-openwrt@countercultured.net> git-svn-id: svn://svn.openwrt.org/openwrt/trunk@48682 3c298f89-4303-0410-b956-a3cf2f4a3e73
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
}