ECS 实例磁盘空间满了,这是运维过程中最常见、也最让人头疼的问题之一。别慌,处理这个问题的核心逻辑只有一条:扩容文件系统之前,必须先扩容云盘本身。
很多人容易搞反顺序,导致扩容后系统里看不到新空间,或者更糟——数据丢失。下面我按操作风险从低到高、适用场景分类,给你梳理一套完整的实战方案。
一、 核心原则:先扩盘,再扩文件系统
阿里云的云盘(无论是高效云盘、SSD 云盘还是 ESSD)是块存储设备。你在操作系统里看到的 /dev/vdb 或 /dev/xvda 只是这块物理存储的一个“窗口”。
- 第一步:在阿里云控制台修改云盘的“大小”属性。这步操作不会立即改变操作系统里的分区大小,它只是扩大了底层存储池。
- 第二步:在 Linux/Windows 操作系统内部,通过命令或工具识别并扩展文件系统,让操作系统真正使用这部分新增的空间。
二、 具体操作步骤(以最常见的 Linux + LVM + ext4/xfs 为例)
假设你的数据盘挂载点为 /data,对应的云盘设备为 /dev/vdb。
1. 控制台扩容云盘
- 登录阿里云 ECS 控制台。
- 找到目标实例 -> 点击“云盘”标签页。
- 选中你要扩容的那块数据盘,点击“更多” -> “云盘设置” -> “扩容”。
- 输入新的容量值(例如从 100G 扩容到 200G),确认订单支付。
- 注意:扩容完成后,云盘状态会变为“运行中”,但此时进入服务器
df -h查看,空间通常不会变。
2. 重启实例(可选但推荐)
虽然大多数现代 Linux 内核支持热加载,但为了确保分区表识别无误,建议重启一次 ECS 实例。如果业务不允许停机,可以尝试执行 echo 1 > /sys/class/block/vdb/device/rescan 来扫描 SCSI 总线,但重启是最稳妥的。
3. 操作系统内扩容
这里分两种情况:LVM 管理 和 非 LVM(直接分区)。
情况 A:使用 LVM(推荐生产环境)
如果你的磁盘是通过 LVM 管理的(大部分云主机默认如此),这是最安全、最灵活的方式。
# 1. 确认当前分区状态
lsblk
# 2. 扩容分区表(假设原分区为 vdb1)
parted /dev/vdb resizepart 1 100%
# 或者使用 fdisk/gdisk,但 parted 对无损扩容支持更好
# 3. 通知 LVM 有新空间
pvresize /dev/vdb1
# 4. 扩容逻辑卷(LV)
lvextend -l +100%FREE /dev/mapper/<vg_name>-<lv_name>
# 例如: lvextend -l +100%FREE /dev/mapper/data-data
# 5. 扩容文件系统
# 如果是 ext4:
resize2fs /dev/mapper/data-data
# 如果是 xfs (CentOS 7+/Ubuntu 18+ 常见):
xfs_growfs /data
情况 B:非 LVM,直接格式化在分区上
这种情况多见于早期创建的实例或特殊定制镜像。操作风险稍高,务必先备份!
# 1. 扩容分区
fdisk /dev/vdb
# 依次输入: d (删除旧分区), n (新建分区), p (主分区), 1 (分区号),
# 回车(默认起始扇区), 回车(默认结束扇区), w (保存)
# 注意:只要起始扇区不变,文件系统元数据不会损坏,但强烈建议测试环境验证后再上生产。
# 2. 刷新内核分区表
partprobe /dev/vdb
# 3. 扩容文件系统
# ext4:
resize2fs /dev/vdb1
# xfs:
xfs_growfs /data
情况 C:Windows 实例
- 控制台扩容云盘。
- 进入 Windows 服务器,打开“磁盘管理” (
diskmgmt.msc)。 - 右键点击对应磁盘 -> “扩展卷”,按照向导完成即可。
三、 高阶方案:不重启、不停机扩容(高级用户)
如果你正在跑高可用集群,无法接受任何重启,且使用的是较新的 Linux 内核(4.x+)和云盘类型(ESSD),可以考虑以下方法:
- 在线扩容云盘:在控制台操作时,选择“在线扩容”(部分云盘类型支持)。
- 内核热加载:如前所述,使用
rescan命令。 - LVM 在线扩容:上述
pvresize和lvextend配合resize2fs或xfs_growfs均支持在线操作,无需卸载文件系统。
关键点:确保你的文件系统是 ext4 或 xfs,并且没有挂载为只读。对于 xfs,xfs_growfs 必须指定挂载点路径,而不是设备路径。
四、 避坑指南 & 注意事项
-
备份!备份!备份!
- 在执行任何
fdisk、parted等分区操作前,必须对关键数据进行快照备份。一旦操作失误导致分区表错乱,恢复成本极高。 - 推荐使用阿里云“云盘快照”功能,一键创建,随时可回滚。
- 在执行任何
-
根目录(/)扩容要格外小心
- 系统盘(通常是
/dev/vda或/dev/xvda)包含操作系统和引导文件。扩容系统盘的风险远高于数据盘。 - 如果系统盘满了,优先考虑清理日志、临时文件,或使用
yum clean all等命令释放空间,而不是盲目扩容。 - 如果必须扩容系统盘,建议在控制台操作后,重启实例,然后按上述 LVM 步骤操作。不要尝试在不重启的情况下对系统盘进行复杂的分区重组。
- 系统盘(通常是
-
文件系统类型判断
- 使用
df -T命令查看文件系统类型。 ext4用resize2fs。xfs用xfs_growfs。- 用错了命令会报错,甚至可能导致文件系统损坏。
- 使用
-
扩容上限
- 单块云盘最大支持 32TiB(具体取决于云盘类型和实例规格)。如果单个磁盘不够,考虑挂载多块数据盘,并使用 LVM 将多块盘合并为一个逻辑卷,实现横向扩容。
-
监控与预警
- 扩容不是长久之计。建议部署 Prometheus + Grafana 或阿里云云监控,设置磁盘使用率超过 80% 时发送告警。
- 定期清理无用日志、旧版本镜像、缓存文件,比被动扩容更重要。
五、 总结
- 小修小补:先清垃圾文件,再考虑扩容。
- 常规扩容:控制台改大小 -> 重启实例 -> 操作系统内
pvresize+lvextend+resize2fs/xfs_growfs。 - 高风险操作:系统盘扩容或非 LVM 分区调整,务必先做快照。
- 长期策略:启用自动快照策略,建立磁盘使用监控告警,避免“最后一刻才扩容”的窘境。
记住,云计算的优势在于弹性,但弹性的前提是规范的操作流程。每一步操作前,问自己一句:“如果失败了,我能快速回滚吗?” 如果不能,那就先做快照。
云技术博客