From b9a2b88370e515cd78758bd6ac257978417ca075 Mon Sep 17 00:00:00 2001 From: Cyril Brulebois Date: Sat, 20 Jul 2024 18:02:40 +0200 Subject: [PATCH] Import rpi-resizerootfs hook and script from image-specs. As of commit ff7fdbf07c727ba1d2277dc7f274bd234f2e2bfa in the image-specs repository (https://salsa.debian.org/raspi-team/image-specs). --- raspberrypi/files/rpi-resizerootfs.hook | 52 ++++++++++++++++++++ raspberrypi/files/rpi-resizerootfs.script | 59 +++++++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100755 raspberrypi/files/rpi-resizerootfs.hook create mode 100755 raspberrypi/files/rpi-resizerootfs.script diff --git a/raspberrypi/files/rpi-resizerootfs.hook b/raspberrypi/files/rpi-resizerootfs.hook new file mode 100755 index 0000000..35e67fc --- /dev/null +++ b/raspberrypi/files/rpi-resizerootfs.hook @@ -0,0 +1,52 @@ +#!/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 + +. /usr/share/initramfs-tools/hook-functions + +# List ALL the programs we need, because we explicitly call them +# Don't *assume* it will be included! +# The update-initramfs script will figure out any dependencies +# that also need to be included, so lets not do that +# +# Find the path as used by the package itself; usrmerge may not be used + +# from coreutils +copy_exec /usr/bin/realpath +copy_exec /usr/bin/tail +copy_exec /usr/bin/test + +# from dosfstools +copy_exec /sbin/fsck.vfat + +# from e2fsprogs +copy_exec /sbin/resize2fs +copy_exec /sbin/fsck.ext4 + +# from grep +copy_exec /bin/grep + +# from logsave +copy_exec /sbin/logsave + +# from mount +copy_exec /bin/mount +copy_exec /bin/umount + +# from parted +copy_exec /sbin/parted +copy_exec /sbin/partprobe + +# from util-linux +copy_exec /bin/lsblk +copy_exec /sbin/blkid +copy_exec /sbin/fsck diff --git a/raspberrypi/files/rpi-resizerootfs.script b/raspberrypi/files/rpi-resizerootfs.script new file mode 100755 index 0000000..3826847 --- /dev/null +++ b/raspberrypi/files/rpi-resizerootfs.script @@ -0,0 +1,59 @@ +#!/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; fail if unset or empty (shellcheck SC2154) +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" + +# After resizing, (re)check the root partition's filesystem +fsck "$rootpart" + +# Remount root +# Don't quote ${ROOTFLAGS} as that results in an extra (empty) argument +# to 'mount', which in turn causes a boot failure +# shellcheck disable=SC2086 +if ! mount -r ${FSTYPE:+-t "${FSTYPE}"} ${ROOTFLAGS} "${ROOT}" "${rootmnt?}"; then + panic "Failed to mount ${ROOT} as root file system." +fi + +log_end_msg