本文目录导读:

- LVM逻辑卷扩展(最推荐,支持在线扩展)
- 非LVM分区(需要卸载后操作)
- 虚拟机磁盘扩展(如VMware/KVM)
- 云服务器磁盘扩展(如AWS EBS)
- 自动检测并扩展脚本
- 条件检查和错误处理脚本
- 重要注意事项:
- 检查扩展结果:
在Shell脚本中扩展磁盘分区大小,需要根据不同的文件系统和分区类型采用不同的方法,以下是常见的几种场景及对应的脚本解决方案:
LVM逻辑卷扩展(最推荐,支持在线扩展)
#!/bin/bash
# LVM扩展脚本
LV_PATH="/dev/vg_name/lv_name" # 逻辑卷路径
NEW_SIZE="+10G" # 要增加的大小
# 扩展逻辑卷
lvextend -L $NEW_SIZE $LV_PATH
# 扩展文件系统(根据文件系统类型)
if blkid $LV_PATH | grep -q "ext4"; then
resize2fs $LV_PATH
elif blkid $LV_PATH | grep -q "xfs"; then
xfs_growfs $LV_PATH
fi
echo "LVM扩展完成"
非LVM分区(需要卸载后操作)
#!/bin/bash
DISK="/dev/sda" # 磁盘设备
PART_NUM="1" # 分区号
PART_PATH="${DISK}${PART_NUM}"
# 卸载分区
umount $PART_PATH
# 使用fdisk扩展分区(非交互方式)
(
echo d # 删除分区
echo $PART_NUM # 选择分区号
echo n # 新建分区
echo p # 主分区
echo $PART_NUM # 分区号
echo # 默认起始扇区
echo # 默认结束扇区(使用全部空间)
echo w # 写入
) | fdisk $DISK
# 通知内核分区表变化
partprobe $DISK
# 检查并修复文件系统
e2fsck -f $PART_PATH
# 扩展文件系统
resize2fs $PART_PATH
# 重新挂载
mount $PART_PATH /mnt/your_mount_point
虚拟机磁盘扩展(如VMware/KVM)
#!/bin/bash # 首先在虚拟机管理工具中扩展磁盘(外部操作) # 然后执行以下命令重新扫描 # 重新扫描SCSI设备 echo "- - -" > /sys/class/scsi_host/host0/scan # 查看新磁盘大小 lsblk # 扩展分区 growpart /dev/sda 1 # 扩展文件系统 resize2fs /dev/sda1
云服务器磁盘扩展(如AWS EBS)
#!/bin/bash # AWS EBS扩展示例 INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id) VOLUME_ID="vol-xxxxxxx" # 需要先扩展EBS卷大小 # 通知内核卷大小变化 echo 1 > /sys/class/block/xvda/device/rescan # 扩展分区 growpart /dev/xvda 1 # 扩展文件系统 resize2fs /dev/xvda1
自动检测并扩展脚本
#!/bin/bash
# 自动检测分区类型并扩展
extend_partition() {
local device=$1
local mount_point=$2
# 获取文件系统类型
local fs_type=$(blkid -o value -s TYPE $device)
echo "检测到文件系统: $fs_type"
case $fs_type in
ext4|ext3|ext2)
umount $mount_point 2>/dev/null
e2fsck -f $device
resize2fs $device
mount $device $mount_point
;;
xfs)
xfs_growfs $mount_point
;;
btrfs)
btrfs filesystem resize max $mount_point
;;
*)
echo "不支持的文件系统类型: $fs_type"
return 1
;;
esac
echo "扩展完成"
}
# 使用示例
extend_partition "/dev/sda1" "/data"
条件检查和错误处理脚本
#!/bin/bash
set -e # 出错立即退出
safe_extend_lvm() {
local lv_path=$1
local new_size=$2
# 检查LVM是否存在
if ! lvs $lv_path &>/dev/null; then
echo "错误: 逻辑卷 $lv_path 不存在"
exit 1
fi
# 检查是否有足够的物理空间
local vg_name=$(lvs --noheadings -o vg_name $lv_path | tr -d ' ')
local available=$(vgs --noheadings -o vg_free $vg_name | tr -d ' ')
echo "卷组 $vg_name 可用空间: $available"
# 执行扩展
lvextend -L $new_size $lv_path || {
echo "扩展失败"
exit 1
}
# 扩展文件系统
local fs_type=$(blkid -o value -s TYPE $lv_path)
echo "扩展文件系统: $fs_type"
case $fs_type in
ext4|ext3|ext2)
resize2fs $lv_path
;;
xfs)
xfs_growfs $(df -h | grep $lv_path | awk '{print $6}')
;;
esac
echo "成功扩展 $new_size"
}
# 使用
safe_extend_lvm "/dev/vg_data/lv_data" "+20G"
重要注意事项:
- 备份数据:扩展分区前务必备份重要数据
- 文件系统检查:扩展后建议运行
fsck检查文件系统完整性 - 在线扩展限制:部分文件系统(如ext2/3)不支持在线扩展
- 分区表类型:GPT和MBR分区表扩展方式不同
- 磁盘对齐:SSD磁盘需要注意分区对齐
检查扩展结果:
# 检查磁盘大小 lsblk # 检查分区大小 fdisk -l /dev/sda # 检查文件系统使用情况 df -h # 检查LVM信息 lvdisplay vgdisplay
根据不同场景选择合适的扩展方法,建议优先使用LVM方式,因为支持在线扩展且风险最低。