aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxim Uvarov <maxim.uvarov@linaro.org>2022-08-18 12:28:46 +0300
committerAntonio Terceiro <antonio.terceiro@linaro.org>2022-08-18 17:45:55 +0000
commit30f16c021a9e9dd3674dd2b6037635017fb1de7d (patch)
treef1a4cfff314ceb875e879cc3b73c08345333a227
parente51910abf033723b2714279bb1dae9560b0e8ca7 (diff)
ts-merge-images.sh: update with rootfs creation w/o root privelages
Apply Antonio's patch for ts-merge-images-esp.sh, but for ts-merge-images.sh. Script was tested and image booted on STM board. For now we do not use it under CI but plan to switch to it just after stm32programmmer tool will be update. Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org> Change-Id: Ie56e364afb112cb6c0fef58239584d249f5d480f
-rw-r--r--ledge/ts/scripts/ts-merge-images.sh104
1 files changed, 56 insertions, 48 deletions
diff --git a/ledge/ts/scripts/ts-merge-images.sh b/ledge/ts/scripts/ts-merge-images.sh
index 1cc56e8fab..f985f1a40b 100644
--- a/ledge/ts/scripts/ts-merge-images.sh
+++ b/ledge/ts/scripts/ts-merge-images.sh
@@ -4,59 +4,67 @@ os_image=$2
set -e
+export LANG=C
+
[ "$#" -ne 2 ] && echo "$0 <firmware .wic> <rootfs .wic>" && exit 1
-clean_up () {
- echo "Cleaning up /dev/mapper"
- sudo kpartx -d $os_image
- sudo kpartx -d $firmware_image
-}
+# src esp size
+src_start=`fdisk -l ${os_image} | grep wic1 | awk '{print $2}'` # in sectors
+src_end=`fdisk -l ${os_image} | grep wic1 | awk '{print $3}'` # in sectors
+src_size=$((src_end - src_start + 1)) # in sectors
+
+# rootfs size
+rootfs_start=`fdisk -l ${os_image} | grep wic2 | awk '{print $2}'` # in sectors
+rootfs_end=`fdisk -l ${os_image} | grep wic2 | awk '{print $3}'` # in sectors
+rootfs_size=$((rootfs_end - rootfs_start + 1)) # in sectors
+
+extra_size=$(((src_size + rootfs_size) * 512 + 10*1024*1024)) # 10MB extra at the end
+
+truncate $firmware_image --size +${extra_size}
+#fix image after resize with sgdisk + fdisk
+sgdisk -e $firmware_image
+fdisk $firmware_image <<EOF
+w
+EOF
+
+# Create new ESP and rootfs partitions
+fdisk $firmware_image <<EOF
+n
-truncate $firmware_image --size +4G
-# qemu-img resize $firmware_image +4G >> /dev/null 2>&1
-# GNU Parted version 3.5+ comes with --fix/-f option to --script mode,
-# older versions don't, which requires fdisk to write changes to the image
-# Ref: https://lists.gnu.org/archive/html/info-gnu/2022-04/msg00010.html
-err=0
-parted_flags="-s"
++$((src_size - 1))
+t
-parted_version=`parted --version|head -n 1 | sed 's/parted (GNU parted) //'`
+1
+n
-ret=`echo "${parted_version} < 3.5" |bc`
-if [ $ret -eq 1 ]; then
- sudo sgdisk -e $firmware_image
- sudo fdisk $firmware_image <<EOF
-p
+
++$((rootfs_size - 1))
+t
+
+20
w
EOF
-else
- parted_flags="-sf"
-fi
-
-start=$(sudo parted $firmware_image ${parted_flags} print | awk NF | tail -1 | \
- awk -F " " '{print $3}' | sed 's/[A-Za-z]*//g')
-# Create ESP from end+256M
-end=$(echo $start + 256 | bc)
-end="$end"'MiB'
-
-sudo parted -s $firmware_image -- \
- mkpart primary fat32 $start $end \
- mkpart primary ext4 $end 100% >> /dev/null 2>&1
-
-sudo kpartx -av $firmware_image > kpartx.log
-ts_esp=`cat kpartx.log | tail -2 |head -1 | cut -d " " -f 3`
-ts_root=`cat kpartx.log | tail -1 |head -1 | cut -d " " -f 3`
-sudo kpartx -av $os_image > kpartx.log
-os_esp=`cat kpartx.log |tail -n 2 |head -n1 |cut -d " " -f 3`
-os_root=`cat kpartx.log |tail -n 1 |head -n1 |cut -d " " -f 3`
-rm kpartx.log >> /dev/null 2>&1
-echo "Copy: $os_esp to $ts_esp"
-sudo dd if=/dev/mapper/$os_esp of=/dev/mapper/$ts_esp >> /dev/null 2>&1
-echo "Copy: $os_root to $ts_root"
-sudo dd if=/dev/mapper/$os_root of=/dev/mapper/$ts_root >> /dev/null 2>&1
-sudo sync >> /dev/null 2>&1
-# FIXME sometimes kpartx -dv fails without waiting
-sleep 5
-
-trap clean_up EXIT
+fdisk -l $firmware_image
+
+esp_dest_start=`fdisk -l ${firmware_image} | tail -n 2 | head -n 1 | awk '{print $2}'`
+
+dd conv=notrunc \
+ bs=512 \
+ count=${src_size} \
+ skip=${src_start} \
+ seek=${esp_dest_start} \
+ if=${os_image} \
+ of=${firmware_image} \
+ status=progress
+
+
+rootfs_dest_start=`fdisk -l ${firmware_image} | tail -n 1 | awk '{print $2}'`
+dd conv=notrunc \
+ bs=512 \
+ count=${rootfs_size} \
+ skip=${rootfs_start} \
+ seek=${rootfs_dest_start} \
+ if=${os_image} \
+ of=${firmware_image} \
+ status=progress