mirror of
https://gitlab.com/fedora/bootc/base-images.git
synced 2026-11-14 16:23:10 +00:00
49 lines
1.6 KiB
Bash
Executable file
49 lines
1.6 KiB
Bash
Executable file
#!/bin/bash
|
|
set -eu
|
|
|
|
backing_device=$(findmnt -vno SOURCE /sysroot)
|
|
echo "Backing device: ${backing_device}"
|
|
|
|
# Handling devicemapper targets is a whole other thing
|
|
case $backing_device in
|
|
/dev/mapper/*) echo "Not growing $backing_device"; exit 0 ;;
|
|
esac
|
|
|
|
syspath=/sys/class/block/$(basename "${backing_device}")
|
|
if ! test -d "${syspath}"; then
|
|
echo "failed to find backing device ${syspath}"; exit 1
|
|
fi
|
|
|
|
# Only partitions have a "partition" attribute in sysfs. A rootfs on an
|
|
# mdraid array, on a device-mapper node, or directly on a whole disk has
|
|
# nothing here for us to grow, and growing those is a different
|
|
# operation. Skip rather than fail, so that the unit does not leave an
|
|
# otherwise healthy system "degraded".
|
|
if ! test -f "${syspath}"/partition; then
|
|
echo "Not growing ${backing_device}: not a partition"; exit 0
|
|
fi
|
|
partition=$(cat "${syspath}"/partition)
|
|
|
|
# Walk up to find the parent blockdev
|
|
parentpath=$(dirname "$(realpath "${syspath}")")
|
|
devmajmin=$(cat "${parentpath}"/dev)
|
|
parent="/dev/block/${devmajmin}"
|
|
|
|
# Grow the partition
|
|
tmpf=$(mktemp)
|
|
# Ignore errors because growpart exits 1 if nothing changed;
|
|
# we need to check the output for NOCHANGE:
|
|
if ! /usr/bin/growpart "${parent}" "${partition}" > "${tmpf}"; then
|
|
cat "${tmpf}"
|
|
if grep -qEe '^NOCHANGE: ' "${tmpf}"; then
|
|
exit 0
|
|
fi
|
|
echo "growpart failed"
|
|
exit 1
|
|
fi
|
|
cat "${tmpf}"
|
|
# Now, temporarily remount the sysroot writable in our mount namespace
|
|
mount -o remount,rw /sysroot
|
|
# And defer to systemd's growfs wrapper which handles dispatching on
|
|
# the target filesystem type.
|
|
/usr/lib/systemd/systemd-growfs /sysroot
|