#!/bin/bash PATH="/usr/sbin:/usr/bin" update_part() { hdparm -z $1 partprobe $1 partx -u $1 udevadm settle echo 1 >/sys/block/${1#/dev/}/device/rescan } 2>/dev/null # el 自带 fdisk parted (el7的part不支持在线扩容) # ubuntu 自带 fdisk growpart # 删除分区用 # el/ubuntu fdisk # 扩容分区用 # el7 grownparted 额外安装 # el8/9/fedora parted # ubuntu grownpart # 找出主硬盘 # shellcheck disable=SC2010 root_drive=$(mount | awk '$3=="/" {print $1}') xda=$(lsblk -r --inverse "$root_drive" | grep -w disk | awk '{print $1}') # 删除 installer 分区 installer_num=$(readlink -f /dev/disk/by-label/installer | grep -o '[0-9]*$') if [ -n "$installer_num" ]; then # 要添加 LC_NUMERIC 或者将%转义成\%才能在cron里正确运行 # locale -a 不一定有"en_US.UTF-8",但肯定有"C.UTF-8" LC_NUMERIC="C.UTF-8" printf "d\n%s\nw" "$installer_num" | fdisk /dev/$xda update_part /dev/$xda fi # 找出现在的最后一个分区,也就是系统分区 # el7 的 lsblk 没有 --sort,所以用其他方法 # shellcheck disable=2012 part_num=$(ls -1v /dev/$xda* | tail -1 | grep -o '[0-9]*$') part_fstype=$(lsblk -no FSTYPE /dev/$xda$part_num) # 扩容分区 # ubuntu 和 el7 用 growpart,其他用 parted # el7 不能用parted在线扩容,而fdisk扩容会改变 PARTUUID,所以用 growpart if grep -E -i 'centos:7|ubuntu' /etc/os-release; then growpart /dev/$xda $part_num else printf 'yes\n100%%' | parted /dev/$xda resizepart $part_num ---pretend-input-tty fi update_part /dev/$xda # 扩容最后一个分区的文件系统 case $part_fstype in xfs) xfs_growfs / ;; ext*) resize2fs /dev/$xda$part_num ;; btrfs) btrfs filesystem resize max / ;; esac update_part /dev/$xda # 删除脚本自身 rm -f /resize.sh /etc/cron.d/resize