aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/brcm2708/base-files
diff options
context:
space:
mode:
authorChristian Lamparter <chunkeey@gmail.com>2017-12-17 15:18:49 +0100
committerÁlvaro Fernández Rojas <noltari@gmail.com>2017-12-25 12:19:43 +0100
commit246916ddf4a1a95fd063e6d7c00d73bb0b5f36a6 (patch)
tree0ec2f21e63ffbda34f52f01316028a4c2efe5125 /target/linux/brcm2708/base-files
parent6f041288927b6b7f64a7ee2a2b2df1d5dcd91990 (diff)
downloadupstream-246916ddf4a1a95fd063e6d7c00d73bb0b5f36a6.tar.gz
upstream-246916ddf4a1a95fd063e6d7c00d73bb0b5f36a6.tar.bz2
upstream-246916ddf4a1a95fd063e6d7c00d73bb0b5f36a6.zip
brcm2708: use x86's upgrade scripts for all rpi targets
Advantages: - preserves existing partition layout on the sd-card. Only the boot and rootfs partition will be overwritten. Please note that sysupgrade will refuse to upgrade, if the existing installation has an incompatible partition layout. Future changes to the bootfs and/or rootfs partition size will likely cause breakage to the sysupgrade procedure. In these cases, the ext4-sdcard.img.gz will have to be written to the sdcard manually. Please don't forget to backup your configuration in this case. Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
Diffstat (limited to 'target/linux/brcm2708/base-files')
-rw-r--r--target/linux/brcm2708/base-files/lib/upgrade/platform.sh102
1 files changed, 93 insertions, 9 deletions
diff --git a/target/linux/brcm2708/base-files/lib/upgrade/platform.sh b/target/linux/brcm2708/base-files/lib/upgrade/platform.sh
index 5b8e1e15b3..b9cd8d282f 100644
--- a/target/linux/brcm2708/base-files/lib/upgrade/platform.sh
+++ b/target/linux/brcm2708/base-files/lib/upgrade/platform.sh
@@ -1,20 +1,104 @@
+. /lib/functions.sh
+
REQUIRE_IMAGE_METADATA=1
+# copied from x86's platform.sh
+
platform_check_image() {
- return 0
+ local diskdev partdev diff
+
+ [ "$#" -gt 1 ] && return 1
+
+ export_bootdevice && export_partdevice diskdev -2 || {
+ 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
+
+ return 0;
}
platform_do_upgrade() {
+ local diskdev partdev diff
+
+ export_bootdevice && export_partdevice diskdev -2 || {
+ echo "Unable to determine upgrade device"
+ return 1
+ }
+
sync
- get_image "$1" | dd of=/dev/mmcblk0 bs=2M conv=fsync
- sleep 1
+
+ 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=2M 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
+
+ #iterate over each partition from the image and write it to the boot disk
+ while read part start size; do
+ # root is /dev/sd[a|b]2 and not /dev/sd[a|b] this causes some problem
+ # one of which is this offset, I'm not sure what's the best fix, so
+ # here's a WA.
+ let part=$((part - 2))
+ 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
}
platform_copy_config() {
- mkdir -p /boot
- [ -f /boot/kernel.img ] || mount -t vfat -o rw,noatime /dev/mmcblk0p1 /boot
- cp -af "$CONF_TAR" /boot/
- tar --directory / -xvf "$CONF_TAR" boot/config.txt
- sync
- umount /boot
+ local partdev
+
+ # Same as above /dev/sd[a|b]2 is root, so /boot is -1
+ if export_partdevice partdev -1; then
+ mkdir -p /boot
+ [ -f /boot/kernel.img ] || mount -t vfat -o rw,noatime "/dev/$partdev" /boot
+ cp -af "$CONF_TAR" /boot/
+ tar --directory / -xvf "$CONF_TAR" boot/config.txt
+ sync
+ unmount /boot
+ fi
}