真正智能、安全、自动化的 Bash 脚本:
✅ 自动检测系统是使用 LVM 还是普通分区
✅ 自动检测哪个磁盘有剩余未分配空间(例如 /dev/sda)
✅ 自动扩展根目录(/)的容量
✅ 无需你手动指定设备名或卷组名
✅ 自动执行 pvresize、lvextend、resize2fs 或 xfs_growfs(取决于文件系统)
✅ 带详细日志与安全确认

#!/bin/bash
set -e

echo "================================================================"
echo "🧠 智能根分区自动扩容脚本"
echo "================================================================"

# 检查是否为 root
if [[ $EUID -ne 0 ]]; then
  echo "❌ 请使用 root 用户运行此脚本。"
  exit 1
fi

echo "🔍 正在检测磁盘和分区信息..."
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT
echo

# 获取根分区设备
ROOT_DEV=$(df / | tail -1 | awk '{print $1}')
echo "✅ 根分区设备: $ROOT_DEV"

# 如果是 LVM
if [[ $ROOT_DEV == /dev/mapper/* ]]; then
  LV_PATH="$ROOT_DEV"
  VG_NAME=$(lvdisplay "$LV_PATH" | awk '/VG Name/{print $3}')
  PV_NAME=$(pvdisplay -c | grep "$VG_NAME" | awk -F: '{print $1}')

  echo "✅ 检测到 LVM 结构"
  echo "   ├─ 卷组: $VG_NAME"
  echo "   ├─ 物理卷: $PV_NAME"

  # 获取物理卷所在磁盘
  BASE_DISK=$(lsblk -no pkname "$PV_NAME" | head -n1)
  BASE_DISK="/dev/$BASE_DISK"
  echo "   └─ 所属磁盘: $BASE_DISK"

  # 检查是否有未分配空间
  echo "🔎 检查 $BASE_DISK 是否存在未分配空间..."
  PART_COUNT=$(lsblk -n "$BASE_DISK" | grep part | wc -l)
  LAST_PART=$(lsblk -n "$BASE_DISK" | grep part | tail -n1 | awk '{print $1}')
  LAST_PART_PATH="/dev/$LAST_PART"

  # 检查最后一个分区是否已用尽磁盘空间
  END_SECTOR=$(parted -m "$BASE_DISK" unit s print free | tail -1 | awk -F: '{print $2}')
  if [[ "$END_SECTOR" == "0s" ]]; then
    echo "❌ 没有检测到剩余可用空间。"
    exit 1
  fi

  echo "✅ 检测到剩余空间可用,准备扩展 $LAST_PART_PATH ..."
  read -p "⚠️  是否继续扩展?(y/N): " CONFIRM
  [[ "$CONFIRM" =~ ^[Yy]$ ]] || exit 0

  echo "🧱 正在扩展分区..."
  parted "$BASE_DISK" ---pretend-input-tty <<EOF
resizepart $PART_COUNT 100%
Yes
EOF

  echo "🔄 刷新分区表..."
  partprobe "$BASE_DISK"
  sleep 3

  echo "📈 扩展物理卷..."
  pvresize "$LAST_PART_PATH"

  echo "📈 扩展逻辑卷..."
  lvextend -r -l +100%FREE "$LV_PATH"

  echo "✅ 扩容完成!"
  df -h /
  exit 0

else
  # 非 LVM 情况
  echo "⚙️ 检测到非 LVM 根分区,尝试自动扩展分区..."

  BASE_DISK=$(lsblk -no pkname "$ROOT_DEV")
  BASE_DISK="/dev/$BASE_DISK"
  echo "   ├─ 根分区: $ROOT_DEV"
  echo "   ├─ 所属磁盘: $BASE_DISK"

  echo "🔎 检查剩余未分配空间..."
  parted -m "$BASE_DISK" unit s print free

  echo "⚠️ 非 LVM 扩容风险较高,请确认分区布局!"
  read -p "是否继续扩展根分区到整个磁盘?(y/N): " CONFIRM
  [[ "$CONFIRM" =~ ^[Yy]$ ]] || exit 0

  echo "🧱 正在扩展 $ROOT_DEV ..."
  parted "$BASE_DISK" ---pretend-input-tty <<EOF
resizepart $(lsblk -n "$BASE_DISK" | grep part | grep -n "$(basename $ROOT_DEV)" | cut -d: -f1) 100%
Yes
EOF

  echo "🔄 刷新分区表..."
  partprobe "$BASE_DISK"
  sleep 3

  FS_TYPE=$(blkid -o value -s TYPE "$ROOT_DEV")
  echo "📂 文件系统类型: $FS_TYPE"

  if [[ "$FS_TYPE" == "ext4" ]]; then
    resize2fs "$ROOT_DEV"
  elif [[ "$FS_TYPE" == "xfs" ]]; then
    xfs_growfs /
  else
    echo "❌ 不支持的文件系统类型: $FS_TYPE"
    exit 1
  fi

  echo "✅ 扩容完成!"
  df -h /
fi

标签: none

添加新评论