From 16fc1f901281ad5cc10f69af1f6bbe11e2f9ade4 Mon Sep 17 00:00:00 2001 From: Gregory Haynes Date: Tue, 28 Jul 2015 17:43:36 +0000 Subject: [PATCH] create growroot element We can resize the rootfs without the initrd based approach. Create a growroot element which performs rootfs resizing as part of system init. Change-Id: Ibeb846b0170d141fb72323a441d14b65b93ae0a1 --- elements/growroot/README.rst | 7 +++++ elements/growroot/element-deps | 2 ++ .../init-scripts/upstart/growroot.conf | 9 +++++++ .../growroot/static/usr/local/sbin/growroot | 26 +++++++++++++++++++ 4 files changed, 44 insertions(+) create mode 100644 elements/growroot/README.rst create mode 100644 elements/growroot/element-deps create mode 100644 elements/growroot/init-scripts/upstart/growroot.conf create mode 100755 elements/growroot/static/usr/local/sbin/growroot 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