#!/usr/bin/env bash
# ==============================================================================
# 脚本名称: auto_lvm_resize.sh
# 功能描述: 自动识别逻辑卷的文件系统类型 (EXT/XFS) 并执行对应的在线扩容刷新命令
# 使用方式: 在宿主机以 root 权限执行: ./auto_lvm_resize.sh <逻辑卷路径或挂载点>
# 示例: ./auto_lvm_resize.sh /data 或 ./auto_lvm_resize.sh /dev/mapper/data_vg-data_lv
# ==============================================================================
set -o pipefail
TARGET_INPUT=$1
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
PLAIN='\033[0m'
if [ -z "$TARGET_INPUT" ]; then
echo -e "${RED}用法: $0 <逻辑卷设备路径或挂载点目录>${PLAIN}"
exit 1
fi
echo -e "${BLUE}================================================================${PLAIN}"
echo -e "${BLUE} LVM 逻辑卷文件系统自动识别与在线扩展脚本 ${PLAIN}"
echo -e "${BLUE}================================================================${PLAIN}"
# 1. 解析目标设备路径、文件系统格式与挂载点
MOUNT_INFO=$(df -PT "$TARGET_INPUT" 2>/dev/null | awk 'NR==2 {print $1, $2, $7}')
if [ -z "$MOUNT_INFO" ]; then
echo -e "${RED}[ERROR] 无法解析目标 ${TARGET_INPUT},请确认路径存在且处于已挂载状态。${PLAIN}"
exit 1
fi
DEV_PATH=$(echo "$MOUNT_INFO" | awk '{print $1}')
FS_TYPE=$(echo "$MOUNT_INFO" | awk '{print $2}')
MOUNT_POINT=$(echo "$MOUNT_INFO" | awk '{print $3}')
echo -e "\n${YELLOW}[1/2] 解析挂载拓扑与文件系统类型...${PLAIN}"
echo -e " -> 设备路径 : ${GREEN}${DEV_PATH}${PLAIN}"
echo -e " -> 挂载目录 : ${GREEN}${MOUNT_POINT}${PLAIN}"
echo -e " -> 文件系统 : ${YELLOW}${FS_TYPE}${PLAIN}"
# 2. 根据文件系统类型执行对应的扩展指令
echo -e "\n${YELLOW}[2/2] 正在执行文件系统容量在线刷新...${PLAIN}"
# 修复了这里的逻辑或乱码
if [[ "$FS_TYPE" == "ext2" || "$FS_TYPE" == "ext3" || "$FS_TYPE" == "ext4" ]]; then
echo -e " -> 识别为 EXT 系列文件系统,调用 resize2fs 工具。"
echo -e " -> 执行命令: ${BLUE}resize2fs ${DEV_PATH}${PLAIN}\n"
resize2fs "$DEV_PATH"
EXEC_STATUS=$?
elif [[ "$FS_TYPE" == "xfs" ]]; then
echo -e " -> 识别为 XFS 文件系统,调用 xfs_growfs 工具 (传入挂载点目录)。"
echo -e " -> 执行命令: ${BLUE}xfs_growfs ${MOUNT_POINT}${PLAIN}\n"
xfs_growfs "$MOUNT_POINT"
EXEC_STATUS=$?
else
echo -e " -> ${RED}[FATAL] 当前脚本不支持该文件系统类型的在线扩展: ${FS_TYPE} (仅支持 ext2/3/4 与 xfs)。${PLAIN}"
exit 1
fi
echo -e "\n${BLUE}----------------------------------------------------------------${PLAIN}"
if [ $EXEC_STATUS -eq 0 ]; then
echo -e "${GREEN}[SUCCESS] 文件系统容量刷新成功,当前最新空间状态如下:${PLAIN}"
df -hT "$MOUNT_POINT" | awk 'NR==1 {print " " $0} NR==2 {print " \033[0;32m" $0 "\033[0m"}'
else
echo -e "${RED}[ERROR] 文件系统容量刷新失败,请检查逻辑卷底层是否已通过 lvextend 分配新增空间。${PLAIN}"
fi
echo -e "${BLUE}================================================================${PLAIN}"