[openwrt/openwrt] base-files: add generic sdcard upgrade method

LEDE Commits lede-commits at lists.infradead.org
Fri Aug 6 16:31:19 PDT 2021


stintel pushed a commit to openwrt/openwrt.git, branch master:
https://git.openwrt.org/8347d8b4fbe41ce7db386f948df3ebb6c6bc32d3

commit 8347d8b4fbe41ce7db386f948df3ebb6c6bc32d3
Author: Stijn Tintel <stijn at linux-ipv6.be>
AuthorDate: Fri Jul 30 01:11:37 2021 +0300

    base-files: add generic sdcard upgrade method
    
    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 at linux-ipv6.be>
---
 package/base-files/Makefile                    |  9 +++
 package/base-files/files/lib/upgrade/sdcard.sh | 91 ++++++++++++++++++++++++++
 scripts/target-metadata.pl                     |  1 +
 target/Config.in                               |  3 +
 4 files changed, 104 insertions(+)

diff --git a/package/base-files/Makefile b/package/base-files/Makefile
index 5f816a0d1b..f19b07cfe1 100644
--- a/package/base-files/Makefile
+++ b/package/base-files/Makefile
@@ -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
index 0000000000..2052805acb
--- /dev/null
+++ b/package/base-files/files/lib/upgrade/sdcard.sh
@@ -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
+}
diff --git a/scripts/target-metadata.pl b/scripts/target-metadata.pl
index dff24998cd..34fb32a07e 100755
--- a/scripts/target-metadata.pl
+++ b/scripts/target-metadata.pl
@@ -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";
diff --git a/target/Config.in b/target/Config.in
index 51a278cae9..fde7ea4137 100644
--- a/target/Config.in
+++ b/target/Config.in
@@ -101,6 +101,9 @@ config RFKILL_SUPPORT
 config NAND_SUPPORT
 	bool
 
+config SDCARD_SUPPORT
+	bool
+
 config ARCH_64BIT
 	bool
 



More information about the lede-commits mailing list