diff --git a/elements/growroot/README.rst b/elements/growroot/README.rst new file mode 100644 index 000000000..c05150e6c --- /dev/null +++ b/elements/growroot/README.rst @@ -0,0 +1,7 @@ +======== +growroot +======== + +Grow the root partition on first boot. + +This only supported on ubuntu trusty or later. diff --git a/elements/growroot/element-deps b/elements/growroot/element-deps new file mode 100644 index 000000000..69a71fded --- /dev/null +++ b/elements/growroot/element-deps @@ -0,0 +1,2 @@ +dib-init-system +install-static diff --git a/elements/growroot/init-scripts/upstart/growroot.conf b/elements/growroot/init-scripts/upstart/growroot.conf new file mode 100644 index 000000000..676226c47 --- /dev/null +++ b/elements/growroot/init-scripts/upstart/growroot.conf @@ -0,0 +1,9 @@ +description "Growing root partition" + +console output + +start on mounted MOUNTPOINT=/ + +post-start script +/usr/local/sbin/growroot +end script diff --git a/elements/growroot/static/usr/local/sbin/growroot b/elements/growroot/static/usr/local/sbin/growroot new file mode 100755 index 000000000..dfd85f544 --- /dev/null +++ b/elements/growroot/static/usr/local/sbin/growroot @@ -0,0 +1,26 @@ +#!/bin/bash +# dib-lint: disable=dibdebugtrace + +set -exu +set -o pipefail + +root_dev=$(df -P / | tail -n 1 | awk '/.*/ { print $1 }') +minor_dev_no=$(stat --printf="%T" $root_dev) +major_dev_no=$(stat --printf="%t" $root_dev) + +# The last digit of our minor number should, on a partitioned block device, +# be the partition number of the device (starting at 1). We need to convert +# this value to decimal from hex for use in growpart. +part_no=$(echo $minor_dev_no | tail -c 2) +part_no=$((16#$part_no)) + +disk=$(find /sys/dev/block -name "$((16#$major_dev_no)):${minor_dev_no::-1}0") +disk="/dev/$(source ${disk}/uevent; echo $DEVNAME)" + +set +e +growpart $disk $part_no +# Error code 1 means no change +if [ "$?" -le 1 ]; then + # always return true because this might not work if were are non ext4 + resize2fs $root_dev || true +fi