#!/bin/bash # batocera-ventoy-resize.sh 20240921 n2qz/maximumentropy # Expand a Batocera installation image file to make storage space # available in SHARE when booting the image from Ventoy. # # Tested on Ubuntu 24.04.1 LTS with e2fsprogs 1.47.0. May not work on # older versions of linux, as current Batocera images (v41+) use newer # ext4 features not available with older ext4 utilities err () { exitcode=$? echo "... Exit code $exitcode on line ${BASH_LINENO[0]} while executing command: $BASH_COMMAND" exit $exitcode } trap err ERR growsize="$1" inputimage="$2" outputimage="$3" if [ -z "${growsize}" -o -z "${inputimage}" -o "${inputimage}" = "${outputimage}" -o "${outputimage}" != "$(basename "${outputimage}" .gz)" ] then echo "Usage: $0 growsize inputimage[.gz] [outputimage]" echo "Example: $0 32G batocera.img ventoy.img" exit 2 fi image=$(basename "${inputimage}" .gz) if [ -z "${outputimage}" ] then outputimage="ventoy-${image}" fi if [ "${inputimage}" = "${image}" ] then echo "... Copy ${inputimage} to ${outputimage}" cp "${inputimage}" "{$outputimage}" else echo "... Decompress ${inputimage} to ${outputimage}" gzip -vkcd "${inputimage}" > "${outputimage}" fi echo "... Grow image ${outputimage}" truncate -s "+${growsize}" "$outputimage" echo "... Set up loopback device" lodev=$(sudo losetup --find --show --partscan "${outputimage}") echo "... Loopback device is: ${lodev}" sharepart=2 sharepartdev="${lodev}p${sharepart}" echo "... Adjust GPT on ${lodev}" sudo sgdisk -e "${lodev}" echo "... Show free space on ${sharepartdev}" sudo dumpe2fs "${sharepartdev}" | grep '^Free blocks' echo "... Resize SHARE partition ${sharepartdev}" sudo parted -s "${lodev}" "resizepart ${sharepart} 100%" echo "... Check ${sharepartdev}" sudo fsck -f "${sharepartdev}" echo "... Grow ${sharepartdev}" sudo resize2fs "${sharepartdev}" echo "... Show free space on ${sharepartdev}" sudo dumpe2fs "${sharepartdev}" | grep '^Free blocks' echo "... Detach loopback device ${lodev}" sudo losetup -d "${lodev}" echo "... Successfully completed"