1. AWS EC2 Ubuntu根目录扩容实战指南
作为云计算运维工程师,我们经常会遇到服务器存储空间不足的情况。最近我在管理AWS EC2实例时就遇到了根目录空间不足的报警,通过实践总结了这套Ubuntu系统根目录扩容的完整方案。本文将详细介绍从控制台调整到系统内部分区扩展的全过程,包含标准NVMe实例和特殊Xen虚拟化实例两种场景的处理方法。
2. 扩容前的准备工作
2.1 确认存储空间现状
在开始扩容前,我们需要先确认当前的磁盘使用情况。通过SSH连接到EC2实例后,执行以下命令:
bash复制df -h
这个命令会显示各挂载点的磁盘使用情况,重点关注/dev/root或/目录的使用率。当使用率超过80%时,就应该考虑扩容了。
另一个关键命令是:
bash复制lsblk
这个命令会显示块设备信息,包括磁盘名称、分区情况和大小。例如典型的NVMe实例输出可能是:
code复制NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 15G 0 disk
└─nvme0n1p1 259:1 0 10G 0 part /
这里可以看到虽然磁盘已经有15G空间,但分区只使用了10G。
2.2 了解AWS EBS卷特性
AWS的EBS(Elastic Block Store)卷支持在线扩容,这是我们的操作基础。需要注意:
- 扩容只能增加不能减少卷大小
- 扩容后需要在OS内扩展文件系统才能真正使用新增空间
- 某些旧实例类型使用Xen虚拟化,设备命名与NVMe不同
提示:执行扩容操作前,建议先对重要数据做快照备份,以防操作失误导致数据丢失。
3. 标准NVMe实例扩容流程
3.1 在AWS控制台调整EBS卷大小
- 登录AWS管理控制台,进入EC2服务
- 在"实例"页面找到目标实例,记下其挂载的EBS卷ID
- 进入"卷"页面,选择需要扩容的EBS卷
- 右键点击卷,选择"修改卷"
- 在弹出窗口中输入新的卷大小(如从10G改为15G)
- 点击"修改"确认更改
修改完成后,AWS会显示"正在修改中"的状态。通常1-2分钟后修改就会完成,此时卷大小已经增加,但操作系统还未使用新增空间。
3.2 在Ubuntu系统中扩展分区
回到EC2的SSH会话中,首先确认卷大小已经改变:
bash复制lsblk
现在应该能看到磁盘总大小已经变为15G,但分区仍为10G。接下来需要扩展分区:
bash复制sudo growpart /dev/nvme0n1 1
这个命令中:
/dev/nvme0n1是磁盘设备名1是要扩展的分区编号
注意:如果提示"growpart: command not found",需要先安装cloud-guest-utils包:
bash复制sudo apt update sudo apt install cloud-guest-utils
3.3 调整文件系统大小
分区扩展后,还需要调整文件系统以使用新增空间。对于ext4文件系统,使用:
bash复制sudo resize2fs /dev/nvme0n1p1
如果是xfs文件系统,则使用:
bash复制sudo xfs_growfs /
最后再次验证空间是否已经扩展:
bash复制df -h
现在应该能看到根目录的可用空间已经增加了。
4. 特殊场景:Xen虚拟化实例处理
4.1 识别Xen虚拟化实例
某些通过虚拟机导入AMI创建的EC2实例使用Xen虚拟化技术,其设备命名规则不同。通过lsblk可以看到类似如下的输出:
code复制NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 80G 0 disk
├─xvda1 202:1 0 1M 0 part
├─xvda2 202:2 0 1G 0 part /boot
└─xvda5 202:5 0 30G 0 part /
这里可以看到磁盘有80G,但根分区(xvda5)只使用了30G。
4.2 Xen实例扩容步骤
- 同样先在AWS控制台扩大EBS卷大小
- SSH连接到实例后,执行分区扩展:
bash复制sudo growpart /dev/xvda 5
注意这里的分区号是5,而不是NVMe实例常见的1。
- 然后调整文件系统:
bash复制sudo resize2fs /dev/xvda5
- 验证空间扩展结果:
bash复制df -h
5. 图形化分区工具cfdisk
对于不熟悉命令行操作的用户,可以使用cfdisk工具进行图形化分区调整:
bash复制sudo apt install util-linux
sudo cfdisk /dev/sdb
在cfdisk界面中:
- 选择要调整的分区
- 选择"Resize"选项
- 调整分区大小
- 选择"Write"保存更改
- 退出后执行resize2fs使更改生效
注意:cfdisk操作有一定风险,建议先在测试环境练习后再在生产环境使用。
6. 常见问题与解决方案
6.1 growpart命令找不到
如果执行growpart时提示命令不存在,需要安装cloud-guest-utils:
bash复制sudo apt update
sudo apt install cloud-guest-utils
6.2 扩容后空间未增加
如果AWS控制台显示卷已扩容,但系统内空间未增加,检查:
- 是否执行了growpart扩展分区
- 是否执行了resize2fs调整文件系统
- 使用lsblk确认分区是否真的扩展了
6.3 扩容后系统无法启动
极少数情况下,扩容操作可能导致系统无法启动。这时可以:
- 从快照恢复卷
- 使用AWS的EC2串行控制台进行故障排查
- 考虑使用救援实例挂载卷进行修复
7. 最佳实践与经验分享
-
监控先行:设置CloudWatch警报,在磁盘使用率达到70%时就收到通知,避免紧急扩容。
-
测试验证:在生产环境扩容前,先在测试环境验证操作流程。
-
文档记录:记录每个实例的磁盘配置和扩容历史,方便后续管理。
-
自动化脚本:对于需要频繁扩容的环境,可以编写自动化脚本:
bash复制#!/bin/bash
# 自动扩展根分区到最大可用空间
DISK=$(lsblk -no PKNAME $(df / --output=source | tail -1))
PART=$(df / --output=source | tail -1 | sed 's/.*[^0-9]//')
growpart /dev/$DISK $PART
resize2fs $(df / --output=source | tail -1)
- 考虑长期方案:对于持续增长的应用,考虑:
- 使用单独的EBS卷存储数据
- 实施日志轮转和清理策略
- 评估是否应该升级实例类型
通过本文介绍的方法,我已经成功为数十个EC2实例完成了根目录扩容操作。关键是要理解AWS存储架构和Linux分区原理,按照步骤谨慎操作。记住先在测试环境验证,做好备份,就能安全地完成这项常见的运维任务。