diff options
author | Kim Hagen <kim@sentrium.io> | 2021-11-11 05:01:45 -0600 |
---|---|---|
committer | Kim Hagen <kim@sentrium.io> | 2021-11-11 05:01:45 -0600 |
commit | e8c3b66a17473785044ab1a1515ad1485d0870b2 (patch) | |
tree | b73b3a297ab22da79f1a18039ae15c74b1ac4858 /src/op_mode | |
parent | deea1c6a2070276c0cd2f78bf0346c993773a900 (diff) | |
download | vyos-1x-e8c3b66a17473785044ab1a1515ad1485d0870b2.tar.gz vyos-1x-e8c3b66a17473785044ab1a1515ad1485d0870b2.zip |
T3946: Automatically resize the root partition if the drive has extra space
Diffstat (limited to 'src/op_mode')
-rwxr-xr-x | src/op_mode/force_part_resize.sh | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/src/op_mode/force_part_resize.sh b/src/op_mode/force_part_resize.sh new file mode 100755 index 000000000..eb0f26d8a --- /dev/null +++ b/src/op_mode/force_part_resize.sh @@ -0,0 +1,72 @@ +#!/usr/bin/env bash +# +# Copyright (C) 2021 VyOS maintainers and contributors +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# +# Function to get the vyos version from the commandline. +# +get_version () { +for item in `cat /proc/cmdline`; do + if [ "vyos-union" == "${item%=*}" ]; then + echo ${item#*=} + fi +done +} + +# +# VERSION is the output of the get_version output. +# DEVICEPART is the device partition where VyOS is mounted on. +# DEVICEPATH is the path to the device where VyOS is mounted on. +# DEVICE is the device of the device partition. +# PARTNR is the device partition number used for parted. +# +VERSION=$(get_version) +DEVICEPART=$(mount | grep $VERSION/grub | cut -d' ' -f1 | rev | cut -d'/' -f1 | rev) +DEVICEPATH=$(mount | grep $VERSION/grub | cut -d' ' -f1 | rev | cut -d'/' -f2- | rev) +DEVICE=$(lsblk -no pkname $DEVICEPATH/$DEVICEPART) +PARTNR=$(grep -c $DEVICEPART /proc/partitions) + +# +# Check if the device really exits. +# +fdisk -l $DEVICEPATH/$DEVICE >> /dev/null 2>&1 || (echo "could not find device $DEVICE" && exit 1) + +# +# START is the partition starting sector. +# CURSIZE is the partition start sector + the partition end sector. +# MAXSIZE is the device end sector. +# +START=$(cat /sys/block/$DEVICE/$DEVICEPART/start) +CURSIZE=$(($START+$(cat /sys/block/$DEVICE/$DEVICEPART/size))) +MAXSIZE=$(($(cat /sys/block/$DEVICE/size)-8)) + +# +# Check if the device size is larger then the partition size +# and if that is the case, resize the partition and grow the filesystem. +# +if [ $MAXSIZE -gt $CURSIZE ]; then +parted "${DEVICEPATH}/${DEVICE}" ---pretend-input-tty > /dev/null 2>&1 <<EOF +unit +s +resizepart +${PARTNR} +Yes +"$MAXSIZE" +quit +EOF + partprobe > /dev/null 2>&1 + resize2fs ${DEVICEPATH}/$DEVICEPART > /dev/null 2>&1 +fi + |