Shell脚本如何扩展磁盘分区大小

wen 实用脚本 1

本文目录导读:

Shell脚本如何扩展磁盘分区大小

  1. LVM逻辑卷扩展(最推荐,支持在线扩展)
  2. 非LVM分区(需要卸载后操作)
  3. 虚拟机磁盘扩展(如VMware/KVM)
  4. 云服务器磁盘扩展(如AWS EBS)
  5. 自动检测并扩展脚本
  6. 条件检查和错误处理脚本
  7. 重要注意事项:
  8. 检查扩展结果:

在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"

重要注意事项:

  1. 备份数据:扩展分区前务必备份重要数据
  2. 文件系统检查:扩展后建议运行 fsck 检查文件系统完整性
  3. 在线扩展限制:部分文件系统(如ext2/3)不支持在线扩展
  4. 分区表类型:GPT和MBR分区表扩展方式不同
  5. 磁盘对齐:SSD磁盘需要注意分区对齐

检查扩展结果:

# 检查磁盘大小
lsblk
# 检查分区大小
fdisk -l /dev/sda
# 检查文件系统使用情况
df -h
# 检查LVM信息
lvdisplay
vgdisplay

根据不同场景选择合适的扩展方法,建议优先使用LVM方式,因为支持在线扩展且风险最低。

抱歉,评论功能暂时关闭!