#!/usr/bin/env bash # # JbTecWiz Support Centre -- generated fix script # # Fault : A disk was enlarged but the filesystem is still the old size # Fix : Grow every layer in order # Source: https://jbtecwiz.com/support/lnx-sto-grow # # Run as : Root shell # Expect : 25 minutes # Risk : medium # Reversible : NO -- read the undo note below # # WHEN THIS IS THE RIGHT FIX # LVM. Each command below only does one layer, which is why partial # attempts appear to fail. # # HOW TO UNDO IT # Growing is not reversible. Snapshot the virtual machine before # starting. # # Walks the fix one step at a time and asks before each. Steps with no # command are yours to do -- it prints those and waits. DRYRUN=1 prints # without executing; UNATTENDED=1 does not ask. # # -------------------------------------------------------------------- # NO WARRANTY - USE AT YOUR OWN RISK # # This script is provided by JbTecWiz as-is and with no warranty of any # kind, express or implied. You run it entirely at your own risk. # # JbTecWiz accepts no liability for any loss or damage arising from its # use, including but not limited to data loss, downtime, or configuration # changes that turn out to be wrong for your system. # # You are responsible for reading this script before running it, for # satisfying yourself that it suits the machine in front of you, and for # having a working backup first. Some steps cannot be undone. # -------------------------------------------------------------------- set -uo pipefail DRYRUN="${DRYRUN:-0}" UNATTENDED="${UNATTENDED:-0}" failed=0 if [ "$(id -u)" -ne 0 ]; then echo " This fix is documented as needing root. Re-run with sudo." >&2 exit 3 fi rule() { printf "\n%s\n" "$(printf '-%.0s' $(seq 1 70))"; if [ $# -gt 0 ]; then echo "$1"; fi; } prose() { echo "$1" | fold -s -w 74 | sed "s/^/ /"; } # Returns 0 when the caller should run the command, 1 when it should not. # A manual step always returns 1 -- there is nothing for the caller to run. step() { # step [command lines...] local n="$1" dotext="$2" why="$3" mode="$4"; shift 4 rule " Step $n of 6" prose "$dotext" if [ -n "$why" ]; then echo; prose "$why"; fi if [ "$mode" = "manual" ]; then echo; echo " -> Do this yourself, then press Enter to carry on." if [ "$UNATTENDED" = "0" ] && [ "$DRYRUN" = "0" ]; then read -r _; fi return 1 fi echo; printf " %s\n" "$@"; echo if [ "$DRYRUN" = "1" ]; then echo " (dry run -- not executed)"; return 1; fi if [ "$UNATTENDED" = "0" ]; then read -r -p " Run this step? [Y]es / [S]kip / [Q]uit " a case "$a" in [Qq]*) echo " Stopped at your request."; exit 0 ;; [Ss]*) echo " Skipped."; return 1 ;; esac fi return 0 } rule echo " A disk was enlarged but the filesystem is still the old size" echo " Grow every layer in order" echo echo " Risk: medium NOT REVERSIBLE 25 minutes" echo prose 'No warranty. Use at your own risk - JbTecWiz accepts no liability. Read it before you run it, and have a backup.' rule echo if [ "$UNATTENDED" = "0" ] && [ "$DRYRUN" = "0" ]; then read -r -p " Ready? [y/N] " go case "$go" in [Yy]*) ;; *) echo " Nothing was changed."; exit 0;; esac fi if step 1 'Confirm the kernel has seen the new size. If it has not, nothing else will work.' '' cmd 'lsblk' 'sudo dmesg -T | tail -5'; then lsblk sudo dmesg -T | tail -5 if [ $? -ne 0 ]; then failed=$((failed+1)) echo " Step 1 failed. The rest of the fix may depend on it." >&2 fi fi if step 2 'Rescan the device if the new size is not visible, which avoids a reboot.' '' cmd 'echo 1 | sudo tee /sys/class/block/sda/device/rescan'; then echo 1 | sudo tee /sys/class/block/sda/device/rescan if [ $? -ne 0 ]; then failed=$((failed+1)) echo " Step 2 failed. The rest of the fix may depend on it." >&2 fi fi if step 3 'Grow the partition. growpart handles the alignment and the GPT backup header correctly.' 'Doing this by hand in fdisk means deleting and recreating the partition at the same start sector. It works, and one mistyped start sector destroys the filesystem. growpart is the safe equivalent.' cmd 'sudo growpart /dev/sda 3' 'sudo partprobe /dev/sda'; then sudo growpart /dev/sda 3 sudo partprobe /dev/sda if [ $? -ne 0 ]; then failed=$((failed+1)) echo " Step 3 failed. The rest of the fix may depend on it." >&2 fi fi if step 4 'Grow the physical volume.' '' cmd 'sudo pvresize /dev/sda3' 'sudo pvs'; then sudo pvresize /dev/sda3 sudo pvs if [ $? -ne 0 ]; then failed=$((failed+1)) echo " Step 4 failed. The rest of the fix may depend on it." >&2 fi fi if step 5 'Grow the logical volume and the filesystem together.' 'The -r flag resizes the filesystem in the same command, choosing resize2fs or xfs_growfs as appropriate. It removes the most commonly forgotten step.' cmd 'sudo lvextend -r -l +100%FREE /dev/vg0/root'; then sudo lvextend -r -l +100%FREE /dev/vg0/root if [ $? -ne 0 ]; then failed=$((failed+1)) echo " Step 5 failed. The rest of the fix may depend on it." >&2 fi fi if step 6 'Confirm.' '' cmd 'df -h /' 'sudo lvs'; then df -h / sudo lvs if [ $? -ne 0 ]; then failed=$((failed+1)) echo " Step 6 failed. The rest of the fix may depend on it." >&2 fi fi rule " Confirm it worked" prose 'df shows the new size and the filesystem is still mounted read-write.' if [ "$DRYRUN" = "0" ]; then df -h; lsblk fi rule if [ "$failed" -gt 0 ]; then echo " Finished with $failed failed step(s)." echo " Read the full write-up at https://jbtecwiz.com/support/lnx-sto-grow" else echo " Finished." fi echo prose 'To undo: Growing is not reversible. Snapshot the virtual machine before starting.' rule