VPS磁盘扩容实战:控制台扩容后growpart扩展分区与文件系统resize全流程


<!DOCTYPE html>

VPS磁盘扩容实战:控制台扩容后growpart扩展分区与文件系统resize全流程

一、为什么控制台已经扩容,系统里却还是原来的大小

很多 VPS 用户在云厂商控制台点了"扩容磁盘",回到服务器里执行 df -h,却发现根分区容量一点没变。原因很简单:控制台扩容只是把云盘在宿主机层面的"总容量"变大,而操作系统里的分区表和文件系统并不知道这件事,需要手动把"多出来的空间"分配给分区和文件系统。

先看一下服务器的真实情况:

# 查看挂载点使用情况
df -h

# 查看块设备与分区布局
lsblk

# 查看磁盘与分区表
fdisk -l

典型现象:/dev/vda 显示 100G,但 /dev/vda1 只有 40G,根挂载点 / 也只有 40G——多出来的 60G 处于"未分配"状态。接下来要做的就是把这段空间一步步交给分区和文件系统。

二、动手前先确认:分区表与文件系统类型

后续命令的选择完全取决于两项信息:文件系统类型(ext4 还是 xfs)和分区表类型(MBR 还是 GPT)。先用一条命令确认:

# 查看文件系统类型
df -T /
blkid /dev/vda1

# 查看分区表类型(MBR 显示 dos,GPT 显示 gpt)
fdisk -l /dev/vda | head -n 5
parted -s /dev/vda print

对照关系速查表:

文件系统  扩容命令              操作对象
ext4      resize2fs /dev/vda1  分区设备
xfs       xfs_growfs /         挂载点(xfs 不能缩小,只能扩大)

分区表   扩展分区命令
MBR       growpart /dev/vda 1
GPT       growpart /dev/vda 1  或 parted resizepart

三、安装工具并扩展分区(growpart)

growpart 是 cloud-init 自带的工具,多数发行版需要单独安装:

# Debian / Ubuntu
apt update && apt install -y cloud-guest-utils

# CentOS / Rocky / AlmaLinux
yum install -y cloud-utils-growpart

安装完成后,把根分区扩展到整个磁盘:

# 语法:growpart 设备名 分区号
growpart /dev/vda 1

成功输出类似:

CHANGED: partition=1 start=2048 old: size=83884032 end=83886079 new: size=209715166 end=209717247

如果磁盘是 GPT 分区表且 growpart 报 "unexpected input" 之类错误,可以改用 parted 交互式调整分区大小:

parted /dev/vda
(parted) resizepart 1 100%
(parted) quit

调整分区后,让内核重新读取分区表(必要时重启):

partprobe /dev/vda
# 或者只更新某个分区
partx -u /dev/vda1

四、扩展文件系统:resize2fs 与 xfs_growfs

分区变大了,文件系统还停在旧大小,最后一步就是扩展文件系统。ext4 文件系统使用 resize2fs:

# ext4:直接对分区设备执行,在线即可
resize2fs /dev/vda1

xfs 文件系统使用 xfs_growfs,且必须指定挂载点而不是分区设备:

# xfs:xfs_growfs 挂载点
xfs_growfs /

# 也可以指定挂载目录,如 /home 挂载的独立数据盘
xfs_growfs /home

执行完回到 df -h 确认结果:

df -h
# 期望看到 /dev/vda1 已变为 100G,Use% 明显下降

五、常见报错与排错方法

1. growpart 报 "unexpected input"
通常是 GPT 分区表,growpart 解析失败。改用 parted /dev/vda resizepart 1 100%,或用 sgdisk -e /dev/vda 把 GPT 转换为可扩展格式后再 growpart。

2. growpart 报 "No space left on device"
说明分区已经占满磁盘、没有可分配空间。先确认控制台扩容是否真正完成(部分厂商系统盘扩容需要重启实例才生效),或确认你操作的是正确的设备名(vda / vdb / sda / nvme0n1 前缀各不相同)。

3. resize2fs 报 "Bad magic number in super-block"
说明该分区根本不是 ext 系列文件系统(可能是 xfs 或 btrfs)。改用 xfs_growfs /,不要硬用 resize2fs。

4. resize2fs 提示 "The file system is already X blocks long"
表示文件系统已经是分区大小,说明上一步分区没有真正变大,回退检查 growpart 输出。

5. 扩容后 df -h 没变化
依次排查:是否操作了错误的分区号(如系统盘是 vda1 你却扩了 vda2);扩容系统盘是否忘了重启;是否只扩了分区忘了扩文件系统。

6. 系统盘是 LVM 逻辑卷
先 pvresize /dev/vda1 让 PV 吸收新空间,再 lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv,最后根据文件系统类型执行 resize2fs 或 xfs_growfs。

六、扩容前的安全建议

  • 扩容前先在控制台创建快照,或至少备份重要数据,误操作分区表可能直接导致数据丢失。
  • 系统盘扩容通常要求重启实例后分区表才生效;数据盘(如 /data、/home)一般支持在线扩容。
  • xfs 文件系统只支持扩大不支持缩小,规划容量时留出余量。
  • 磁盘扩容后想扩展 swap 空间,先 swapoff,调整 swap 文件大小后重新 mkswap && swapon,并把 fstab 条目保持正确。
  • 扩容完成后建议 sync 并观察一段时间,确认 df -h、lsblk 与 dmesg 均无异常。

七、总结

VPS 磁盘扩容三步走:控制台扩容 → growpart/parted 扩展分区 → resize2fs/xfs_growfs 扩展文件系统。绝大多数"扩容没生效"的案例,都是漏掉了后两步中的一步。记住先查文件系统类型(ext4 用 resize2fs、xfs 用 xfs_growfs),再动手,配合快照兜底,磁盘扩容就是一条可以反复执行的无损操作。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

Linux 日志轮转实战:logrotate 配置、按天切割与常见排错

Nginx 反向代理进阶实战:WebSocket 转发、真实 IP 透传与灰度发布

评 论
更换验证码