| name | storage-resize |
| version | 1.0.0 |
| description | Linux 磁盘扩容技能(RPM 包管理系统),实现云盘扩容后自动完成分区调整和文件系统扩容。支持系统盘/数据盘在线扩容,适配 XFS/EXT4/Btrfs 文件系统。适用于 RPM 包管理的 Linux 系统(如 Alibaba Cloud Linux)。 |
| layer | system |
| lifecycle | operations |
| dependencies | ["aliyun-ecs"] |
Storage resize - 磁盘扩容
核心定位
两阶段磁盘扩容流程:
- 云平台阶段:使用
aliyun-ecs skill 完成云盘扩容
- 操作系统阶段:执行分区调整和文件系统扩容
重要约束:
- ☁️ 阿里云云盘仅支持扩容,不支持缩容
- 📀 支持系统盘和数据盘两种场景
- ⚡ 在线扩容:云盘扩容后无需重启实例,通过 NVMe 重新扫描即可识别(NVMe 设备)
前置要求
1. 依赖技能
本技能依赖 aliyun-ecs skill 进行云平台操作:
- 查询磁盘信息 (
DescribeDisks)
- 执行磁盘扩容 (
ResizeDisk)
- 查询实例信息 (
DescribeInstances)
2. 工具安装
yum install -y cloud-utils-growpart xfsprogs e2fsprogs btrfs-progs
which growpart xfs_growfs resize2fs
3. 权限要求
- 阿里云 CLI 认证:需配置
aliyun configure(优先使用 EcsRamRole)
- 系统权限:需要 root 权限执行分区和文件系统操作
快速开始
一键扩容流程
lsblk -f /dev/nvme0n1
echo 1 > /sys/block/nvme0n1/device/rescan_controller
lsblk /dev/nvme0n1
growpart /dev/nvme0n1 3
xfs_growfs /
resize2fs /dev/nvme0n1p3
df -h /
文件系统支持
| 文件系统 | 扩容命令 | 参数类型 | 备注 |
|---|
| XFS | xfs_growfs /mountpoint | 挂载点 | Alinux4 默认文件系统 |
| EXT4 | resize2fs /dev/vdb1 | 设备路径 | 支持在线扩容 |
| Btrfs | btrfs filesystem resize max /mountpoint | 挂载点 | 需要 btrfs-progs |
文件系统类型检测
df -T /
lsblk -f /dev/nvme0n1p3
mount | grep "on / "
完整流程
步骤 1: 云平台扩容(使用 aliyun-ecs skill)
INSTANCE_ID=$(curl -s http://100.100.100.200/latest/meta-data/instance-id)
REGION_ID=$(curl -s http://100.100.100.200/latest/meta-data/region-id)
aliyun ecs DescribeDisks \
--RegionId $REGION_ID \
--InstanceId $INSTANCE_ID \
--DiskType system
aliyun ecs ResizeDisk \
--DiskId d-bp1234567890abcdef \
--NewSize 90 \
--RegionId $REGION_ID
步骤 2: 操作系统内扩容
lsblk
echo 1 > /sys/block/nvme0n1/device/rescan_controller
lsblk /dev/nvme0n1
growpart /dev/nvme0n1 3
FS_TYPE=$(df -T / | tail -1 | awk '{print $2}')
if [ "$FS_TYPE" = "xfs" ]; then
xfs_growfs /
elif [ "$FS_TYPE" = "ext4" ]; then
resize2fs /dev/nvme0n1p3
elif [ "$FS_TYPE" = "btrfs" ]; then
btrfs filesystem resize max /
fi
df -h /
lsblk /dev/nvme0n1
设备类型识别
| 设备类型 | 示例 | 重新扫描方法 |
|---|
| NVMe | /dev/nvme0n1 | echo 1 > /sys/block/nvme0n1/device/rescan_controller |
| VirtIO | /dev/vda | blockdev --rereadpt /dev/vda |
| SATA | /dev/sda | blockdev --rereadpt /dev/sda |
自动识别脚本
DEVICE="/dev/nvme0n1"
if [[ "$DEVICE" == /dev/nvme* ]]; then
echo 1 > /sys/block/$(basename $DEVICE)/device/rescan_controller
elif [[ "$DEVICE" == /dev/vd* ]] || [[ "$DEVICE" == /dev/sd* ]]; then
blockdev --rereadpt $DEVICE
fi
故障排查
问题 1: 未找到 growpart 命令
yum install -y cloud-utils-growpart
问题 2: 云盘扩容后 OS 未识别新容量
echo 1 > /sys/block/nvme0n1/device/rescan_controller
lsblk /dev/nvme0n1
问题 3: xfs_growfs 报错 "not mounted"
xfs_growfs /data
xfs_growfs /dev/vdb1
mount | grep vdb
问题 4: resize2fs 报错 "Device busy"
mount /dev/vdb1 /data
resize2fs /dev/vdb1
问题 5: 扩容后容量未变化
lsblk /dev/nvme0n1
lsblk /dev/nvme0n1p3
df -h /
问题 6: blockdev --rereadpt 报错 "Device or resource busy"
echo 1 > /sys/block/nvme0n1/device/rescan_controller
最佳实践
1. 扩容前备份
aliyun ecs CreateSnapshot \
--DiskId d-bp1234567890abcdef \
--SnapshotName "pre-resize-backup-$(date +%Y%m%d)"
2. 在线扩容流程
aliyun ecs ResizeDisk --DiskId <disk-id> --NewSize <new-size> --RegionId <region>
sleep 10
aliyun ecs DescribeDisks --RegionId <region> --DiskIds "[\"<disk-id>\"]"
echo 1 > /sys/block/nvme0n1/device/rescan_controller
growpart /dev/nvme0n1 3
resize2fs /dev/nvme0n1p3
3. 自动化脚本
#!/bin/bash
set -e
DEVICE=$1
PARTITION=$2
NEW_SIZE=$3
FS_TYPE=$(lsblk -f /dev/${DEVICE}${PARTITION} --noheadings --output FSTYPE | tr -d ' ')
growpart /dev/$DEVICE $PARTITION
if [ "$FS_TYPE" = "xfs" ]; then
MOUNTPOINT=$(df /dev/${DEVICE}${PARTITION} | tail -1 | awk '{print $6}')
xfs_growfs $MOUNTPOINT
elif [ "$FS_TYPE" = "ext4" ]; then
resize2fs /dev/${DEVICE}${PARTITION}
fi
echo "✅ 扩容完成!"
df -h /
扩展资源
适用版本: Alinux4
最后更新: 2026-03-19
依赖技能: aliyun-ecs