mvebu: sysupgrade: sdcard: keep user added partitons

Currently sysupgrade overwrites whole disk and destroys partitions added
by user. Sync the sysupgrade code with the one present in x86 target to
remedy this behaviour.

Signed-off-by: Tomasz Maciej Nowak <tomek_n@o2.pl>
openwrt-19.07
Tomasz Maciej Nowak 2019-03-28 18:07:09 +01:00 committed by Hauke Mehrtens
parent 4e8345ff68
commit 2e5a0b81ec
5 changed files with 83 additions and 11 deletions

View File

@ -8,7 +8,14 @@ RAMFS_COPY_DATA='/etc/fw_env.config /var/lock/fw_printenv.lock'
REQUIRE_IMAGE_METADATA=1 REQUIRE_IMAGE_METADATA=1
platform_check_image() { platform_check_image() {
return 0 case "$(board_name)" in
armada-385-turris-omnia|armada-388-clearfog-base|armada-388-clearfog-pro|globalscale,espressobin|marvell,armada8040-mcbin)
platform_check_image_sdcard "$ARGV"
;;
*)
return 0
;;
esac
} }
platform_do_upgrade() { platform_do_upgrade() {

View File

@ -6,7 +6,7 @@ get_magic_at() {
platform_check_image_sdcard() { platform_check_image_sdcard() {
local file="$1" local file="$1"
local magic local magic diskdev partdev diff
magic=$(get_magic_at "$file" 510) magic=$(get_magic_at "$file" 510)
[ "$magic" != "55aa" ] && { [ "$magic" != "55aa" ] && {
@ -14,18 +14,82 @@ platform_check_image_sdcard() {
return 1 return 1
} }
return 0; 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() { platform_do_upgrade_sdcard() {
local board=$(board_name) local board=$(board_name)
local diskdev local diskdev partdev diff
export_bootdevice && export_partdevice diskdev 0 || {
echo "Unable to determine upgrade device"
return 1
}
sync sync
if export_bootdevice && export_partdevice diskdev 0; then
get_image "$1" | dd of=/dev/$diskdev bs=2M conv=fsync 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 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"
return 0
fi
#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
case "$board" in case "$board" in
armada-385-turris-omnia) armada-385-turris-omnia)
fw_setenv openwrt_bootargs 'earlyprintk console=ttyS0,115200 root=/dev/mmcblk0p2 rootfstype=auto rootwait' fw_setenv openwrt_bootargs 'earlyprintk console=ttyS0,115200 root=/dev/mmcblk0p2 rootfstype=auto rootwait'

View File

@ -11,6 +11,6 @@ ARCH:=aarch64
BOARDNAME:=Marvell Armada 3700LP (ARM64) BOARDNAME:=Marvell Armada 3700LP (ARM64)
CPU_TYPE:=cortex-a53 CPU_TYPE:=cortex-a53
FEATURES+=ext4 FEATURES+=ext4
DEFAULT_PACKAGES+=e2fsprogs ethtool mkf2fs DEFAULT_PACKAGES+=e2fsprogs ethtool mkf2fs partx-utils
KERNELNAME:=Image dtbs KERNELNAME:=Image dtbs

View File

@ -11,6 +11,6 @@ ARCH:=aarch64
BOARDNAME:=Marvell Armada 7k/8k (ARM64) BOARDNAME:=Marvell Armada 7k/8k (ARM64)
CPU_TYPE:=cortex-a72 CPU_TYPE:=cortex-a72
FEATURES+=ext4 FEATURES+=ext4
DEFAULT_PACKAGES+=e2fsprogs ethtool mkf2fs DEFAULT_PACKAGES+=e2fsprogs ethtool mkf2fs partx-utils
KERNELNAME:=Image dtbs KERNELNAME:=Image dtbs

View File

@ -126,7 +126,7 @@ define Device/armada-388-clearfog-pro
KERNEL_INSTALL := 1 KERNEL_INSTALL := 1
KERNEL := kernel-bin KERNEL := kernel-bin
DEVICE_TITLE := SolidRun ClearFog Pro DEVICE_TITLE := SolidRun ClearFog Pro
DEVICE_PACKAGES := mkf2fs e2fsprogs swconfig DEVICE_PACKAGES := mkf2fs e2fsprogs partx-utils swconfig
IMAGES := sdcard.img.gz IMAGES := sdcard.img.gz
IMAGE/sdcard.img.gz := boot-scr | boot-img-ext4 | sdcard-img-ext4 | gzip | append-metadata IMAGE/sdcard.img.gz := boot-scr | boot-img-ext4 | sdcard-img-ext4 | gzip | append-metadata
DEVICE_DTS := armada-388-clearfog-pro armada-388-clearfog-base DEVICE_DTS := armada-388-clearfog-pro armada-388-clearfog-base
@ -139,7 +139,7 @@ define Device/armada-388-clearfog-base
KERNEL_INSTALL := 1 KERNEL_INSTALL := 1
KERNEL := kernel-bin KERNEL := kernel-bin
DEVICE_TITLE := SolidRun ClearFog Base DEVICE_TITLE := SolidRun ClearFog Base
DEVICE_PACKAGES := mkf2fs e2fsprogs DEVICE_PACKAGES := mkf2fs e2fsprogs partx-utils
IMAGES := sdcard.img.gz IMAGES := sdcard.img.gz
IMAGE/sdcard.img.gz := boot-scr | boot-img-ext4 | sdcard-img-ext4 | gzip | append-metadata IMAGE/sdcard.img.gz := boot-scr | boot-img-ext4 | sdcard-img-ext4 | gzip | append-metadata
DEVICE_DTS := armada-388-clearfog-pro armada-388-clearfog-base DEVICE_DTS := armada-388-clearfog-pro armada-388-clearfog-base
@ -162,7 +162,8 @@ define Device/turris-omnia
DEVICE_TITLE := Turris Omnia DEVICE_TITLE := Turris Omnia
DEVICE_PACKAGES := \ DEVICE_PACKAGES := \
mkf2fs e2fsprogs kmod-fs-vfat kmod-nls-cp437 kmod-nls-iso8859-1 \ mkf2fs e2fsprogs kmod-fs-vfat kmod-nls-cp437 kmod-nls-iso8859-1 \
wpad-basic kmod-ath9k kmod-ath10k-ct ath10k-firmware-qca988x-ct wpad-basic kmod-ath9k kmod-ath10k-ct ath10k-firmware-qca988x-ct \
partx-utils
IMAGES := $$(IMAGE_PREFIX)-sysupgrade.img.gz omnia-medkit-$$(IMAGE_PREFIX)-initramfs.tar.gz IMAGES := $$(IMAGE_PREFIX)-sysupgrade.img.gz omnia-medkit-$$(IMAGE_PREFIX)-initramfs.tar.gz
IMAGE/$$(IMAGE_PREFIX)-sysupgrade.img.gz := boot-img | sdcard-img | gzip | append-metadata IMAGE/$$(IMAGE_PREFIX)-sysupgrade.img.gz := boot-img | sdcard-img | gzip | append-metadata
IMAGE/omnia-medkit-$$(IMAGE_PREFIX)-initramfs.tar.gz := omnia-medkit-initramfs | gzip IMAGE/omnia-medkit-$$(IMAGE_PREFIX)-initramfs.tar.gz := omnia-medkit-initramfs | gzip