磁盘分区无损扩容脚本扩展站点存储空间
场景说明
站点跑着跑着,磁盘快满了,业务被迫中断?
很多人第一反应是重新分区或重装系统——但其实大多数场景下,可以对已有分区进行无损扩容,数据一点也不会丢。
本文围绕磁盘分区无损扩容脚本展开,带你一步步把站点所在的分区安全撑大。
扩容前的准备工作
先把下面三件事确认好,后面才不会手忙脚乱。
- 查看当前分区使用情况
登录服务器,执行:
df -h
重点关注站点数据挂载的那个分区(比如 /dev/vda1 挂载在 / 或 /data 下),记下它的设备名和已用百分比。
- 确认磁盘还有剩余空间
执行:
lsblk
对比分区的总大小和磁盘总大小。
如果磁盘本身已经用满(比如 /dev/vda 的大小等于所有分区之和),需要先在虚拟化平台或云控制台给磁盘扩容(比如 AWS 调整 EBS 卷大小、VMware 扩展虚拟磁盘),这是前置操作。
- 备份重要数据
这是保命步骤。
虽然无损脚本理论上安全,但任何操作都有风险。
至少把站点文件、数据库导出一份到其他磁盘或对象存储。
使用无损扩容脚本的核心步骤
1. 获取并运行脚本
目前社区比较成熟的无损扩容脚本是 growpart 配合 resize2fs(ext4)或 xfs_growfs(XFS)。
多数 Linux 发行版安装方式如下:
# Ubuntu/Debian
apt update && apt install -y cloud-guest-utils
# CentOS/RHEL
yum install -y cloud-utils-growpart
安装后执行扩容分区(假设设备是 /dev/vda1):
sudo growpart /dev/vda 1
注意 growpart 的参数是磁盘设备名和分区号之间用空格隔开,不是 /dev/vda1 这样的完整路径。
2. 文件系统扩容
分区扩大后,文件系统还没感知到,需要执行对应命令:
- ext4 文件系统(最常见):
sudo resize2fs /dev/vda1
- XFS 文件系统(先确认挂载点):
sudo xfs_growfs /data
完成后用 df -h 检查,应该已经看到分区大小增加了。
3. 一键脚本封装(复用)
把上面两个命令写成一个脚本,以后扩容只需执行一次脚本,适合多台服务器批量处理。
示例脚本内容:
#!/bin/bash
DISK=${1:-/dev/vda}
PART=${2:-1}
MOUNT=$(df -h | grep "$DISK$PART" | awk '{print $6}')
if [ -z "$MOUNT" ]; then
echo "获取挂载点失败"
exit 1
fi
growpart "$DISK" "$PART" || { echo "growpart 失败"; exit 1; }
FSTYPE=$(lsblk -no FSTYPE "${DISK}${PART}")
if [ "$FSTYPE" = "xfs" ]; then
xfs_growfs "$MOUNT"
else
resize2fs "${DISK}${PART}"
fi
echo "扩容完成,新大小:$(df -h --output=size "$MOUNT" | tail -1)"
使用时:sudo ./expand.sh /dev/vda 1。
避坑说明
- 分区号不能错:
growpart第二个参数是分区号不是分区名,写错会报找不到分区。 - 必须预留相邻空闲空间:如果目标分区后面还有别的分区或 LVM 卷组,脚本会失败,需要先移动或删除后面分区(风险高,建议提前规划)。
- 确认文件系统类型:
growpart只扩容分区,resize 命令必须与文件系统匹配,否则报错。 - 在运行中的服务不影响:扩容操作不需要卸载分区,但在脚本执行期间磁盘 IO 会升高,建议低峰期操作。
效果验证
执行完上述步骤后,用以下命令确认:
df -h | grep /dev/vda1
与之前记录的值对比,可用空间应该明显增加。
也可以用 lsblk 查看分区大小是否匹配磁盘剩余空间。
最后访问网站或写入测试文件确保站点功能正常。
常见问题解答
Q1:执行 growpart 提示“NOCHANGE: partition 1 is already at the end of the disk”怎么办?
说明分区已经在磁盘尾部且没有未分配空间,你需要先在控制台或虚拟机管理工具中手动增加磁盘大小,然后再执行脚本。
Q2:resize2fs 报错“The filesystem is already 大小 blocks”
代表文件系统已经被上一次命令扩容过了,无需重复操作,检查一下 df -h,可能已经成功。
Q3:LVM(逻辑卷管理)怎么扩?
LVM 结构的扩容流程不一样,需要先扩 PV(pvresize)、再扩 LV(lvextend)、最后扩文件系统,不适用于本文的 growpart 脚本。
Q4:扩容后数据会丢失吗?
无损扩展不涉及数据移动,理论上不会丢失,但任何磁盘操作都有风险,请务必提前备份。
通过上述流程,你可以安全高效地利用磁盘分区无损扩容脚本来解决站点存储空间不足的问题,无需重装系统或迁移数据。
遇到其他报错时,建议先回看避坑部分,再结合错误日志搜索解决方案。