From e8c3b66a17473785044ab1a1515ad1485d0870b2 Mon Sep 17 00:00:00 2001 From: Kim Hagen Date: Thu, 11 Nov 2021 05:01:45 -0600 Subject: T3946: Automatically resize the root partition if the drive has extra space --- op-mode-definitions/force-part-resize.xml.in | 13 +++++ src/op_mode/force_part_resize.sh | 72 ++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 op-mode-definitions/force-part-resize.xml.in create mode 100755 src/op_mode/force_part_resize.sh diff --git a/op-mode-definitions/force-part-resize.xml.in b/op-mode-definitions/force-part-resize.xml.in new file mode 100644 index 000000000..cb76273c7 --- /dev/null +++ b/op-mode-definitions/force-part-resize.xml.in @@ -0,0 +1,13 @@ + + + + + + + Resize the VyOS partition + + ${vyos_op_scripts_dir}/force_part_resize.sh + + + + 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 . + +# +# 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 < /dev/null 2>&1 + resize2fs ${DEVICEPATH}/$DEVICEPART > /dev/null 2>&1 +fi + -- cgit v1.2.3