首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >云硬盘扩容后 df 仍是旧容量:分区与文件系统扩展

云硬盘扩容后 df 仍是旧容量:分区与文件系统扩展

原创
作者头像
一只特立独行的兔先生
发布于 2026-11-10 21:17:58
发布于 2026-11-10 21:17:58
200
举报

控制台里云硬盘容量已经从 50 GiB 调到 60 GiB,进系统执行 df -h,根分区还是旧的。控制台改的是块设备容量,分区表和文件系统不会跟着变,df 读的是文件系统,所以数字不动。

下面按块设备、分区、文件系统三层把容量对上,再决定要不要 growpart、该跑 resize2fs 还是 xfs_growfs。步骤以《扩容分区及文件系统(Linux)》(文档更新时间 2025-05-28)为准。文中的 50 GiB、60 GiB、70 GiB、100 GiB 取自该文档的示例环境,不是某台机器的实测。设备名以你机器上的 lsblk 为准,不要照抄 /dev/vda。

先对上三层容量

扩容涉及三层。任何一层没跟上,业务看到的可用空间都不会变。

层

谁负责改

怎么看

块设备

控制台或 API 扩容

fdisk -l 的 Disk 行,或 lsblk 里 TYPE 为 disk 的那一行

分区

实例内扩展;没分区的裸设备跳过

lsblk 里 TYPE 为 part 的行,或 fdisk -l 的 Device 行

文件系统

实例内扩展

df -h、df -TH

文档示例环境是 TencentOS Server 4。系统盘 /dev/vda 从 50 GiB 扩到 60 GiB,分区仍可能停在 50 GiB。数据盘 /dev/vdb 初始化时没分区,文件系统是 XFS,从 70 GiB 扩到 100 GiB。另一块 /dev/vdc 有 GPT 分区 /dev/vdc1,文件系统是 EXT4,从 100 GiB 扩到 150 GiB。三块盘要走的命令不一样,先看清自己是哪一种,再往下执行。

代码语言:bash
复制
df -h
uname -a
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT
sudo fdisk -l
ls -l /dev/disk/by-id

对照输出走三条路,不要三条一起试。

整盘大小还是旧值:内核还没看到新容量。这时跑 growpart 没有空闲扇区可用。文档对 growpart 失败的处理是按提示重启,重启后再执行同一条命令。重启后 Disk 行仍不变,回到控制台确认扩容是否完成、云硬盘是否使用中,不要改分区表。

整盘已经变大,分区还是旧大小:先扩分区,再扩文件系统。df 在这一步之后才会变。

整盘和分区都已经是新大小,或者本来就没有分区、整盘已变大,只有 df 是旧的:跳过 growpart,只扩文件系统。

/dev/disk/by-id 里 disk- 开头的编号对应控制台云硬盘 ID。机器上挂了多块容量和类型都一样的盘时,先用它确认设备名。扩错盘不会立刻报错,新增空间会加到另一块盘上,你盯着的那个挂载点仍然不变。

df -h 按 1024 进位,df -TH 按 1000 进位,和控制台的 GiB 对不齐一截是单位换算,再加上文件系统元数据,df 的总容量会比分区略小。文档验收用的是 df -TH。少掉的如果是刚扩出来的那一整段,才是分区或文件系统没扩。

另一个常见看错:扩的是数据盘,却在看根分区。df -h 不带挂载点时,先找到目标挂载点那一行,再和 lsblk 的 MOUNTPOINT 对。根分区没变,不代表数据盘没扩成。

动手前先排除不能扩的情况

文档把下面几条写成前提。缺一条就不要进 growpart。

实例要是运行中,云硬盘要是使用中。已经隔离的云硬盘不支持扩容。只有云硬盘能扩,本地盘不能扩。控制台没有扩容入口的盘,不要在系统里找命令硬扩。

云硬盘只支持扩容,不支持缩容。resize2fs 缩小、删了重建更小的分区,都不是可回退路径。扩错了只能用扩容前的快照回滚。分区和文件系统操作不慎可能影响已有数据,文档要求操作前先做快照。

根分区使用率不能是 100%。文档要求先执行 df -h 确认。写满时先清出一点空间再扩,不要在 100% 上硬跑。

在线扩容要求内核不低于 3.6.0,用 uname -a 看。低于这个版本,走文档里的「低内核版本系统离线扩展分区及文件系统(Linux)」,不要套本文的在线命令。

数据盘不能合并进系统盘。容量不够时扩对应的那块盘,或者新挂一块盘。不存在把 /dev/vdb 的空间并进 / 的操作。

文件系统类型不要凭发行版猜。CentOS 7 常见 XFS,Ubuntu 常见 EXT4,TencentOS 镜像两者都有。用文档给的命令看:

代码语言:bash
复制
sudo file -s /dev/vdb
sudo file -s /dev/vda1

有分区时对分区设备跑,没分区时对整盘设备跑。回显里 XFS filesystem 是 XFS,ext4 filesystem 是 EXT4,ext3 filesystem 是 EXT3。对整盘跑 file -s 如果看到的是分区表而不是文件系统,说明这块盘有分区,下一步应该看分区设备,不要对整盘做 resize2fs。

分区表格式在 sudo fdisk -l 里看 Disklabel type:dos 是 MBR,gpt 是 GPT。有的系统不显示这个字段,看 System 列:Linux 表示 MBR,GPT 表示 GPT。系统盘一定有分区,文档写的是形如 /dev/vda1,不会是裸设备。

控制台扩容不会改 df

控制台路径以文档为准。云服务器控制台里,目标实例行选更多、资源调整、云硬盘扩容,选中要扩的盘,目标容量必须大于当前容量。也可以在云硬盘控制台对目标盘选更多、扩容。向导里有一步就叫「扩容分区及文件系统」,那里是查阅注意事项后点确定。点完并不等于已经登录实例改了分区表。文档的下一步仍是按操作系统继续做分区和文件系统扩展,Linux 要进实例执行命令,新增容量才能被使用。

按计费方式不同,这一步可能要支付。费用以订单页为准,这里不写价目。

用 API 扩也一样。弹性数据盘是 ResizeDisk,系统盘或 2018 年及以前创建的非弹性数据盘是 ResizeInstanceDisks。两个接口都只扩容量,分区和文件系统仍要在实例里做。

扩容完成后有两种用法:把新增容量划进已有分区,或者格式化成独立的新分区。业务目录已经在旧分区上时,应扩已有分区。新分区是空的,旧目录不会自动变大,应用依然写在满的那个挂载点上。

新建独立分区还有一个容易漏的限制。常见问题写明:Linux 下把扩容部分做成新分区前,要先把这块盘上已有分区全部卸载。挂载点是 /data 就执行 umount /data,再用 mount | grep '/dev/vdb' 确认这块盘上已经没有挂载,然后再动分区表。扩已有分区的在线路径不要求先卸载。扩原有分区一般不用改 /etc/fstab,文件系统 UUID 还是原来的。真要新建分区并写入开机挂载,用 UUID 或 label,不要写 /dev/vdb1。同一台机器上多次挂载、卸载后,内核设备名可能变。

系统盘还有一条自动路径,不要理解成重启就行。扩容完成后看 /etc/cloud/cloud.cfg 里有没有 growpart 和 resizefs。文档对这两项的说明是:growpart 把分区扩到磁盘大小,resizefs 把文件系统扩到分区大小。两项都在,并且扩的是系统盘,并且在线扩容做不了,才需要重启,由 cloud-init 在启动过程里调用这两项。缺任何一项,就得手动扩。数据盘不在这段描述里,重启不会替你扩 /data。

代码语言:bash
复制
grep -n -E 'growpart|resizefs' /etc/cloud/cloud.cfg

有输出只说明配置项在,不代表这次已经扩完。仍以 lsblk 和 df -TH 为准。配置项在,但 lsblk 里分区还是旧大小,就按下一节手动扩,不要空等重启。

有分区就先扩分区

无分区的裸设备跳过这一节。有分区时,MBR 且扩容后容量不超过 2 TiB,或者本来就是 GPT,才走 growpart。

MBR 这一档的上限,扩容步骤文档写的是 2 TiB,常见问题写的是 2TB,指的都是不要在 MBR 上扩过这一档。扩容目标超过这一档时,扩容步骤要求先把分区表转成 GPT,再扩分区、再扩文件系统。常见问题给的另一条路是:另建一块 GPT 数据盘,把数据拷过去。转换分区表有丢数据的风险,转换前快照不能省。转换命令以文档里「转换 MBR 分区为 GPT 分区」为准,不要凭记忆用 fdisk 删分区再重建。起始扇区一旦变了,文件系统就对不上。

GPT 要先装 gdisk,MBR 不用装。然后装 growpart。文档示例系统是 TencentOS Server 4,安装命令按 CentOS 与 Ubuntu 或 Debian 分开写。TencentOS、OpenCloudOS 用 CentOS 那条,系统里没有 yum 就换 dnf,包名不变。

代码语言:bash
复制
# MBR 不用装 gdisk。GPT 才需要下面的 gdisk 行
sudo yum install -y gdisk
sudo yum install -y cloud-utils-growpart

# Ubuntu 或 Debian
sudo apt-get install -y gdisk
sudo apt-get install -y cloud-guest-utils

扩分区时,磁盘名和分区号之间必须有空格。文档示例是系统盘第 1 个分区,并带了 LC_ALL。中文 locale 下不加这个变量,growpart 解析分区表输出可能失败,照抄。

代码语言:bash
复制
sudo LC_ALL=en_US.UTF-8 growpart /dev/vda 1

数据盘第 1 个分区把设备名换成实际的,例如 sudo LC_ALL=en_US.UTF-8 growpart /dev/vdb 1。写成 growpart /dev/vda1 会把分区号粘进设备名,工具找不到盘。

分区号不要无脑写 1。文档示例里系统盘文件系统在 /dev/vda1。如果根在逻辑卷上,lsblk 里根对应的往往是另一块分区,growpart 的分区号要跟物理卷所在的那个分区走。写错号会把空间加到别的分区上,根分区仍然不变。

growpart 扩的是该分区之后的空闲扇区。lsblk 里这个分区后面还有别的分区时,盘尾的空闲扩不进来。这时不要删中间分区腾位置,先确认要扩的是不是最后一个分区。

成功时工具会打印 CHANGED。打印 NOCHANGE 表示这个分区没有被扩大,回到 Disk 行和分区顺序看,不要当成已经扩完。若回显要求重启,按提示重启,再执行同一条命令,不要改用 fdisk 删分区。重启后仍失败,对刚才操作的那块盘执行 sudo fdisk -l /dev/vdb(设备名换成实际的),看第 1 个分区的起始扇区。文档写明:如果从第 34 扇区开始、不是 2048 对齐,要改走「扩展 GPT 分区及文件系统(大于 2TB)」,继续 growpart 对齐不了。

growpart 只改分区表,不改文件系统。跑完再看 lsblk,part 行应变大,df 仍可能是旧的。这是预期,不是命令没生效。

按文件系统类型扩,不要混用命令

EXT 和 XFS 的命令不能互换。文档给出的容量上限:EXT3 最大 16 TB,单个文件 2 TB;EXT4 最大 1 EB,单个文件 16 TB。初始化场景介绍里,GPT 的理论上限是 18 EiB,云硬盘当前最大容量是 32 TiB。实际能买到的容量以购买页为准。

EXT2、EXT3、EXT4 对设备名执行 resize2fs,不带大小参数就是铺满当前分区或裸设备。文档示例里 /dev/vdc1 是 EXT4:

代码语言:bash
复制
# 有分区
sudo resize2fs /dev/vdc1

# 无分区,文件系统直接建在裸设备上
sudo resize2fs /dev/vdb

文档说明执行过程中可能提示先做 e2fsck。e2fsck 不能对正在挂载的文件系统跑。数据盘先停写,再卸载挂载点。卸载失败就停,不要对仍在挂载的文件系统做检查。卸载成功后再检查、扩容、挂回。下面的 /data 换成 df 里的实际挂载点:

代码语言:bash
复制
sudo umount /data
sudo e2fsck -f /dev/vdc1
sudo resize2fs /dev/vdc1
sudo mount /dev/vdc1 /data

根分区卸不掉。提示必须检查时,不要对 / 强行 e2fsck。在线路径下先看 resize2fs 自己是否已经成功;它要求检查而根分区又卸不掉时,改走低内核版本那篇离线文档,或在维护窗口用快照兜底。不要为了检查把根分区卸掉。

XFS 用挂载点,不用设备名。挂载点用 df -TH 查。文档示例是 /dev/vda1 挂在 /,/dev/vdb 挂在 /data1:

代码语言:bash
复制
sudo xfs_growfs /
sudo xfs_growfs /data1

xfs_growfs /dev/vda1 不是文档写法。XFS 必须处于挂载状态才能扩,也不能缩小。对 EXT4 跑 xfs_growfs 会报不是 XFS;对 XFS 跑 resize2fs 会报不是 ext 文件系统。报错就停,回到 file -s 的结果换命令。

裸设备没有分区时,不要插一步 growpart。growpart 需要分区号,对没有分区的 /dev/vdb 没有合法的第二个参数。按文档示例推演一块无分区的 XFS 数据盘:控制台已从 70 GiB 扩到 100 GiB 后,sudo fdisk -l /dev/vdb 的 Disk 行应已是新容量,且没有 /dev/vdb1;sudo file -s /dev/vdb 确认是 XFS;df -TH /data1 确认挂载点;然后只执行 sudo xfs_growfs /data1。有 GPT 分区的 EXT4 数据盘则是先 growpart,再 resize2fs 对分区设备,两步都做,少一步 df 都不变。

逻辑卷要在分区之后再扩一层

《扩容分区及文件系统(Linux)》的主路径没有写 LVM。lsblk 的 TYPE 出现 lvm,或者 df 的设备是 /dev/mapper/ 开头,只扩底层分区不够,文件系统看的是逻辑卷大小。

顺序是:底层分区如果有,先用上一节的 growpart 扩完,再扩物理卷、逻辑卷,最后扩逻辑卷上的文件系统。下面的名字是示例,换成 pvs、lvs 里看到的:

代码语言:bash
复制
sudo pvs
sudo lvs
sudo pvresize /dev/vdb1
sudo lvextend -l +100%FREE /dev/mapper/vgdata-lvdata

逻辑卷上是 EXT4,接着 sudo resize2fs /dev/mapper/vgdata-lvdata。是 XFS,对挂载点执行 sudo xfs_growfs /data。lvextend -r 会调用 fsadm 顺带扩文件系统,系统里有 fsadm 时可以代替分步;没有就分步做,不要假设 -r 一定可用。

LVM 跨了多块物理盘时,先确认要扩的是哪一块 PV,再 pvresize。扩错 PV 不会损坏数据,但 lvextend 看不到新增空间,df 仍然不动。系统盘如果是 /boot 在普通分区、根在逻辑卷,growpart 的目标是逻辑卷下面那块分区,不是 /boot 所在的分区。

验收和几个会反复出现的误判

扩完用文档的验收命令。看的是文件系统,不是控制台容量。最后一行的挂载点换成实际目录。

代码语言:bash
复制
df -TH
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT
sudo touch /data1/.cbs-expand-ok && sudo rm -f /data1/.cbs-expand-ok

能创建再删除,说明不是只读,也没有 I/O 错误。三层数字应一致到新增的那一段已经进了挂载点。业务进程如果缓存了磁盘剩余空间,重启该进程或等它下次查询,不要只看扩容前打开的监控页面。

数据异常时用扩容前的快照回滚,不要在已经写坏的文件系统上继续 resize2fs。

这几类误判会把人带回原地:

  • 控制台容量变了,就认为 df 应该变。块设备、分区、文件系统是三步,控制台只做第一步。向导里那个同名步骤只是确认注意事项。
  • 重启指望 cloud-init。只有系统盘、cloud.cfg 里同时有 growpart 和 resizefs、且在线扩容做不了,重启才会补这一步。数据盘要手动做。
  • growpart /dev/vda1。分区号是单独参数,和磁盘名之间有空格。GPT 没装 gdisk 就跑,也会失败。
  • XFS 用了 resize2fs,或 xfs_growfs 传了设备名。EXT 传设备,XFS 传挂载点。
  • 裸设备跑 growpart,或有分区却直接对整盘设备做 resize2fs。后者扩不到分区里的文件系统。
  • MBR 盘扩过 2 TiB 仍直接 growpart。超过这一档要先转 GPT,或按常见问题另建 GPT 盘拷数据。
  • 根分区已经 100% 还继续。先腾出空间。内核低于 3.6.0 仍套在线命令,同样不该继续。
  • 多块盘不看 /dev/disk/by-id,把空间扩到另一块盘。或者扩了数据盘,却一直看根分区的 df。
  • 扩完想缩回去。不支持缩容,退路是快照,不是再跑一遍反向命令。

排查时按这个顺序问,不要跳:

  1. 控制台这块盘是否已是目标容量,状态是否使用中,是不是云硬盘而不是本地盘。
  2. fdisk -l 的 Disk 行有没有变成新容量。没有就先解决内核识别,不要改分区表。
  3. 有没有分区。有的话,要扩的那个分区是不是最后一个,分区行有没有变大。没有就 growpart,注意空格、GPT 先装 gdisk、MBR 不超过 2 TiB。
  4. file -s 是 EXT 还是 XFS。EXT 用 resize2fs 对设备,XFS 用 xfs_growfs 对挂载点。
  5. 是不是 LVM。是的话 pvresize 之后再 lvextend,然后扩文件系统。
  6. df -TH 与挂载点写入是否正常。异常用快照回滚。

参考文档:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 先对上三层容量
  • 动手前先排除不能扩的情况
  • 控制台扩容不会改 df
  • 有分区就先扩分区
  • 按文件系统类型扩,不要混用命令
  • 逻辑卷要在分区之后再扩一层
  • 验收和几个会反复出现的误判
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档