base-files: add generic sdcard upgrade method
authorStijn Tintel <stijn@linux-ipv6.be>
Thu, 29 Jul 2021 22:11:37 +0000 (01:11 +0300)
committerStijn Tintel <stijn@linux-ipv6.be>
Fri, 6 Aug 2021 22:34:40 +0000 (01:34 +0300)
Add a generic sdcard upgrade method instead of duplicating code in yet
another target, and add a feature flag to only install this upgrade
method in targets that set this flag. Copied from mvebu.

Signed-off-by: Stijn Tintel <stijn@linux-ipv6.be>
package/base-files/Makefile
package/base-files/files/lib/upgrade/sdcard.sh [new file with mode: 0644]
scripts/target-metadata.pl
target/Config.in

index 5f816a0d1bd7fde8efb6a9148fd374274c8b419f..f19b07cfe12266c95b50714d5ae546568f8d719b 100644 (file)
@@ -23,6 +23,7 @@ PKG_LICENSE:=GPL-2.0
 PKG_CONFIG_DEPENDS += \
        CONFIG_SIGNED_PACKAGES CONFIG_TARGET_INIT_PATH CONFIG_TARGET_PREINIT_DISABLE_FAILSAFE \
        CONFIG_NAND_SUPPORT \
+       CONFIG_SDCARD_SUPPORT \
        CONFIG_CLEAN_IPKG \
        CONFIG_PER_FEED_REPO \
        $(foreach feed,$(FEEDS_AVAILABLE),CONFIG_FEED_$(feed))
@@ -123,10 +124,18 @@ ifeq ($(CONFIG_NAND_SUPPORT),)
   endef
 endif
 
+ifeq ($(CONFIG_SDCARD_SUPPORT),)
+  define Package/base-files/sdcard-support
+       rm -f $(1)/lib/upgrade/sdcard.sh
+  endef
+endif
+
+
 define Package/base-files/install
        $(CP) ./files/* $(1)/
        $(Package/base-files/install-key)
        $(Package/base-files/nand-support)
+       $(Package/base-files/sdcard-support)
        if [ -d $(GENERIC_PLATFORM_DIR)/base-files/. ]; then \
                $(CP) $(GENERIC_PLATFORM_DIR)/base-files/* $(1)/; \
        fi
diff --git a/package/base-files/files/lib/upgrade/sdcard.sh b/package/base-files/files/lib/upgrade/sdcard.sh
new file mode 100644 (file)
index 0000000..2052805
--- /dev/null
@@ -0,0 +1,91 @@
+sdcard_check_image() {
+       local file="$1"
+       local diskdev partdev diff
+
+       export_bootdevice && export_partdevice diskdev 0 || {
+               v "Unable to determine upgrade device"
+       return 1
+       }
+
+       get_partitions "/dev/$diskdev" bootdisk
+
+       v "Extract boot sector from the image"
+       get_image_dd "$1" 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)"
+
+       rm -f /tmp/image.bs /tmp/partmap.bootdisk /tmp/partmap.image
+
+       if [ -n "$diff" ]; then
+               v "Partition layout has changed. Full image will be written."
+               ask_bool 0 "Abort" && exit 1
+               return 0
+       fi
+}
+
+sdcard_do_upgrade() {
+       local board=$(board_name)
+       local diskdev partdev diff
+
+       export_bootdevice && export_partdevice diskdev 0 || {
+               v "Unable to determine upgrade device"
+       return 1
+       }
+
+       sync
+
+       if [ "$UPGRADE_OPT_SAVE_PARTITIONS" = "1" ]; then
+               get_partitions "/dev/$diskdev" bootdisk
+
+               v "Extract boot sector from the image"
+               get_image_dd "$1" 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 "$1" 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"
+       else
+               v "Writing bootloader to /dev/$diskdev"
+               get_image_dd "$1" 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
+                               v "Writing image to /dev/$partdev..."
+                               get_image_dd "$1" of="/dev/$partdev" ibs="512" obs=1M skip="$start" count="$size" conv=fsync
+                       else
+                               v "Unable to find partition $part device, skipped."
+                       fi
+               done < /tmp/partmap.image
+
+               v "Writing new UUID to /dev/$diskdev..."
+               get_image_dd "$1" of="/dev/$diskdev" bs=1 skip=440 count=4 seek=440 conv=fsync
+       fi
+
+       sleep 1
+}
+
+sdcard_copy_config() {
+       local partdev
+
+       if export_partdevice partdev 1; then
+               mkdir -p /boot
+               [ -f /boot/kernel.img ] || mount -o rw,noatime /dev/$partdev /boot
+               cp -af "$UPGRADE_BACKUP" "/boot/$BACKUP_FILE"
+               sync
+               umount /boot
+       fi
+}
index dff24998cd2b6c725dcf4b7c225180ab29f33201..34fb32a07e6d8580d7098cbef437afd48a9cae63 100755 (executable)
@@ -36,6 +36,7 @@ sub target_config_features(@) {
                /^rfkill$/ and $ret .= "\tselect RFKILL_SUPPORT\n";
                /^rootfs-part$/ and $ret .= "\tselect USES_ROOTFS_PART\n";
                /^rtc$/ and $ret .= "\tselect RTC_SUPPORT\n";
+               /^sdcard$/ and $ret .= "\tselect SDCARD_SUPPORT\n";
                /^separate_ramdisk$/ and $ret .= "\tselect USES_INITRAMFS\n\tselect USES_SEPARATE_INITRAMFS\n";
                /^small_flash$/ and $ret .= "\tselect SMALL_FLASH\n";
                /^spe_fpu$/ and $ret .= "\tselect HAS_SPE_FPU\n";
index 51a278cae94ea7e85979ac4217521d97357985e7..fde7ea4137497b6dafcd2172a4f59956ca28496f 100644 (file)
@@ -101,6 +101,9 @@ config RFKILL_SUPPORT
 config NAND_SUPPORT
        bool
 
+config SDCARD_SUPPORT
+       bool
+
 config ARCH_64BIT
        bool