扩容剩余空间到根目录/的脚本
真正智能、安全、自动化的 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