Raspi-image-spec/rootfs/etc/initramfs-tools/scripts/local-bottom/rpi-resizerootfs
Andres Salomon 4816680ba6 resizerootfs: switch from using sfdisk to parted for resizing partitions
sfdisk is a bit crusty - it doesn't understand gpt partition tables very well,
for example. By switching to parted, we can handle gpt issues (which may be
useful in the future, and is definitely useful for other boards), and we no
longer have to hardcode that 4M alignment workaround. Parted will tell us
the free space at the end of the disk.

Because we're already using partprobe, there's no additional dependencies
needed.
2021-08-25 01:23:20 +02:00

54 lines
1.4 KiB
Bash
Executable file

#!/bin/sh
set -e
#
# List the soft prerequisites here. This is a space separated list of
# names, of scripts that are in the same directory as this one, that
# must be run before this one can be.
#
PREREQS=""
case $1 in
prereqs) echo "$PREREQS"; exit 0;;
esac
. /scripts/functions
# Given the root partition, get the underlying device and partition number
rootpart=$(realpath $ROOT)
rootpart_nr=$(blkid -sPART_ENTRY_NUMBER -o value -p $rootpart)
rootdev="/dev/$(lsblk -no pkname "$rootpart")"
# Parted will detect if the GPT label is messed up and fix it
# automatically, we just need to tell it to do so.
parted -s $rootdev print 2>&1 | grep -z "fix the GPT" && {
echo "Fix" | parted ---pretend-input-tty $rootdev print
}
# Check if there's free space at the end of the device
free_space="$(parted -m -s $rootdev print free | tail -n1 | grep free)"
if test -z "$free_space"; then
# Great, we already resized; nothing left to do!
exit 0
fi
log_begin_msg "$0 resizing $ROOT"
# Unmount for safety
umount "${rootmnt}"
# Expand the partition size to fill the entire device
parted -s $rootdev resizepart $rootpart_nr 100%
wait_for_udev 5
# Now resize the filesystem
partprobe $rootdev
resize2fs $rootpart
# Remount root
if ! mount -r ${FSTYPE:+-t "${FSTYPE}"} ${ROOTFLAGS} "${ROOT}" "${rootmnt?}"; then
panic "Failed to mount ${ROOT} as root file system."
fi
log_end_msg