Add bootc-generic-growpart
This service is a backfill for lack of a better option as a baseline to run in cloud/virt environments: - Without cloud-init - Even with cloud-init, as it doesn't yet support growing on ostree/composefs Signed-off-by: Colin Walters <walters@verbum.org>
This commit is contained in:
parent
582297efcc
commit
ae9118576b
|
|
@ -0,0 +1,41 @@
|
|||
#!/bin/bash
|
||||
set -eu
|
||||
|
||||
backing_device=$(findmnt -vno SOURCE /sysroot)
|
||||
echo "Backing device: ${backing_device}"
|
||||
syspath=/sys/class/block/$(basename "${backing_device}")
|
||||
if ! test -d "${syspath}"; then
|
||||
echo "failed to find backing device ${syspath}"; exit 1
|
||||
fi
|
||||
|
||||
# Handling devicemapper targets is a whole other thing
|
||||
case $backing_device in
|
||||
/dev/mapper/*) "Not growing $backing_device"; exit 0 ;;
|
||||
esac
|
||||
|
||||
# Note that we expect that the rootfs is on a partition
|
||||
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
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
[Unit]
|
||||
Description=Bootc Fallback Root Filesystem Grow
|
||||
Documentation=https://gitlab.com/fedora/bootc/docs
|
||||
# For now we skip bare metal cases, and we also have nothing to do
|
||||
# for containers.
|
||||
ConditionVirtualization=vm
|
||||
# This helps verify that we're running in a bootc/ostree based target.
|
||||
ConditionPathIsMountPoint=/sysroot
|
||||
# We want to run before any e.g. large container images might be pulled.
|
||||
DefaultDependencies=no
|
||||
Requires=sysinit.target
|
||||
After=sysinit.target
|
||||
Before=basic.target
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/libexec/bootc-generic-growpart
|
||||
# So we can temporarily remount the sysroot writable
|
||||
MountFlags=slave
|
||||
# Just to auto-cleanup our temporary files
|
||||
PrivateTmp=yes
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
add-files:
|
||||
- - bootc-generic-growpart
|
||||
- /usr/libexec/bootc-generic-growpart
|
||||
- - bootc-generic-growpart.service
|
||||
- /usr/lib/systemd/system/bootc-generic-growpart.service
|
||||
|
||||
postprocess:
|
||||
- |
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
mkdir -p /usr/lib/systemd/system/local-fs.target.wants
|
||||
ln -s ../bootc-generic-growpart.service /usr/lib/systemd/system/local-fs.target.wants/bootc-generic-growpart.service
|
||||
|
|
@ -13,6 +13,7 @@ include:
|
|||
- fwupd.yaml
|
||||
- persistent-journal.yaml
|
||||
- initramfs-full.yaml
|
||||
- generic-growfs.yaml
|
||||
|
||||
packages:
|
||||
# Include and set the default editor
|
||||
|
|
|
|||
Loading…
Reference in New Issue