<!DOCTYPE html>
一、为什么控制台已经扩容,系统里却还是原来的大小
很多 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),再动手,配合快照兜底,磁盘扩容就是一条可以反复执行的无损操作。




