diff --git a/lib/tiny-cloud/init-early b/lib/tiny-cloud/init-early index 652aac2..ca34252 100644 --- a/lib/tiny-cloud/init-early +++ b/lib/tiny-cloud/init-early @@ -7,22 +7,19 @@ expand_root() { skip_action expand_root && return - # explicitly use busybox, in case util-linux is also installed - local mountpoint=$(busybox mountpoint -n / | cut -d' ' -f1) - local volume=$(echo "$mountpoint" | - sed -Ee "s/(nvme\d+n\d|(xv|s)d[a-z])p?\d?$/\1/" - ) - local partition + local dev=$(awk '$2 == "/" {print $1}' "$ROOT"/proc/mounts) + local partition=$(cat "$ROOT/sys/class/block/${dev#/dev/}/partition" 2>/dev/null) - if [ "$mountpoint" != "$volume" ]; then + if [ -n "$partition" ]; then # it's a partition, resize it - partition=$(echo "$mountpoint" | sed -Ee "s/.*(\d+)$/\1/") - echo ", +" | sfdisk -q --no-reread -N "$partition" "$volume" - partx -u "$volume" + local volume=$(readlink -f "$ROOT/sys/class/block/${dev#/dev/}/..") + volume="/dev/${volume##*/}" + echo ", +" | $MOCK sfdisk -q --no-reread -N "$partition" "$volume" + $MOCK partx -u "$volume" fi # resize filesystem - mount -orw,remount / - resize2fs "$mountpoint" + $MOCK mount -orw,remount / + $MOCK resize2fs "$dev" } has_cloud_hotplugs() { [ -n "$HOTPLUG_MODULES" ]; } diff --git a/tests/init-early.test b/tests/init-early.test new file mode 100755 index 0000000..2d3539d --- /dev/null +++ b/tests/init-early.test @@ -0,0 +1,51 @@ +#!/usr/bin/env atf-sh + +. $(atf_get_srcdir)/test_env.sh + +export PREFIX="$srcdir" +export MOCK=echo + +init_tests \ + expand_root \ + expand_root_partition + +PROVIDERS="aws azure gcp nocloud oci" + +expand_root_body() { + fake_bin test-expand-root <<-EOF + #!/bin/sh + . "$srcdir"/lib/tiny-cloud/init-early + expand_root + EOF + mkdir proc + echo "/dev/xvda / ext4 rw,noatime 0 0" > proc/mounts + for provider in $PROVIDERS; do + CLOUD="$provider" atf_check \ + -o match:"resize2fs /dev/xvda" \ + test-expand-root + done +} + +expand_root_partition_body() { + fake_bin test-expand-root <<-EOF + #!/bin/sh + . "$srcdir"/lib/tiny-cloud/init-early + expand_root + EOF + mkdir -p proc sys/class/block \ + sys/devices/pci0000:00/0000:00:1b.0/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2 \ + sys/devices/pci0000:00/0000:00:1b.0/0000:01:00.0/nvme/nvme0/nvme0n1/device + ln -s ../../devices/pci0000:00/0000:00:1b.0/0000:01:00.0/nvme/nvme0/nvme0n1 sys/class/block/nvme0n1 + ln -s ../../devices/pci0000:00/0000:00:1b.0/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2 sys/class/block/nvme0n1p2 + echo 2 > sys/class/block/nvme0n1p2/partition + + echo "/dev/nvme0n1p2 / ext4 rw,noatime 0 0" > proc/mounts + for provider in $PROVIDERS; do + CLOUD="$provider" atf_check \ + -o match:"sfdisk .*/dev/nvme0n1" \ + -o match:"partx .*/dev/nvme0n1" \ + -o match:"resize2fs /dev/nvme0n1p2" \ + test-expand-root + done +} +