XFS是RHEL 7之后默认的文件系统,它最实用的特性之一就是支持在线扩容。当业务数据不断增长、原有的逻辑卷空间快用完时,运维人员不需要卸载文件系统,也不需要安排停机窗口,只要底层块设备的空间扩大了,再用xfs_growfs刷新一下文件系统的元数据,新的空间立刻就能投入使用。本文以LVM环境为例,完整演示xfs_growfs在线扩容的操作过程和注意事项。

一、XFS文件系统与xfs_growfs的工作原理
XFS是一种高性能的日志文件系统,最早由SGI开发,后来被引入Linux主线内核。它的元数据结构(超级块、分配组AG、空闲空间树等)决定了文件系统的总容量是在创建时固定的,但XFS允许在不中断服务的情况下重新计算并更新这些元数据,把新增的块设备空间纳入管理范围。xfs_growfs做的事情正是如此:读取底层块设备的实际大小,与文件系统当前记录的大小做对比,然后把差值部分的空闲块合并进文件系统的空闲空间管理结构中。
需要特别注意的一点是,XFS只支持扩大,不支持缩小。这与ext4可以通过resize2fs双向调整不同。如果业务上有缩减空间的需求,XFS无法满足,只能备份数据、重建文件系统再恢复。所以在规划存储时,如果不确定未来是否需要缩容,可以考虑使用ext4;如果只增不减,XFS配合LVM是非常省心的组合。
使用xfs_growfs有一个前提条件:底层块设备的容量必须先扩大。如果底层是LVM逻辑卷,就需要先用lvextend扩展逻辑卷;如果是普通分区,则需要先用parted或growpart调整分区大小。跳过这一步直接执行xfs_growfs,会提示没有可扩展的空间。
二、LVM环境下xfs_growfs扩容完整实操
下面通过一个实际场景演示完整流程。假设服务器上新加了一块磁盘/dev/sdb,需要把它加入现有的卷组datavg,扩展逻辑卷datalv,最后用xfs_growfs扩展/data文件系统。
第一步,创建物理卷并加入卷组:
# 创建物理卷 pvcreate /dev/sdb # 将新物理卷加入卷组 datavg vgextend datavg /dev/sdb # 查看卷组空闲空间,确认有了新的空闲PE vgs datavg
第二步,扩展逻辑卷。这里有两种常见写法,一种是固定增加大小,一种是直接用满所有空闲空间:
# 方式一:给逻辑卷增加 50G 空间 lvextend -L +50G /dev/datavg/datalv # 方式二:用完卷组所有空闲空间 lvextend -l +100%FREE /dev/datavg/datalv
第三步,执行在线扩容。xfs_growfs后面的参数是挂载点,不是设备名,这是新手最容易搞错的地方:
# 参数是挂载点路径 xfs_growfs /data # 扩容完成后验证 df -hT /data
执行成功的输出中会看到data blocks发生变化,最后显示文件系统已经成功扩容。整个过程/data目录上的业务可以继续读写,Nginx继续提供服务、数据库继续写入日志都不受影响,这正是在线扩容的价值所在。
顺便说明一个更简洁的做法,lvextend提供了-r参数,会在扩展逻辑卷之后自动调用文件系统的扩容工具,XFS环境下自动调用的就是xfs_growfs,一条命令搞定:
lvextend -r -l +100%FREE /dev/datavg/datalv
这条命令等价于lvextend加xfs_growfs两步操作,生产环境推荐使用,能避免忘记第二步导致磁盘看起来没变大的问题。
三、常见报错与避坑经验
第一类问题是报错data size unchanged, skipping。出现这个提示说明xfs_growfs发现文件系统大小和块设备大小一致,没有可扩展的余地。原因通常是忘了先执行lvextend,或者逻辑卷虽然扩展了但扩展的设备路径不对。用lvs命令确认逻辑卷大小,用df -h对比文件系统大小,两者不一致时才需要执行xfs_growfs。
第二类问题是把设备名当参数传入。xfs_growfs/dev/mapper/datavg-datalv这样的写法虽然多数情况下也能执行(命令会自动找到挂载点),但规范用法是直接传挂载点,尤其当设备有多处挂载时,传设备可能产生歧义。记住口诀:resize2fs传设备,xfs_growfs传挂载点。
第三类问题是误操作尝试缩小XFS。xfs_growfs的-d参数并不是缩容选项,有人误以为加参数就能减小文件系统,实际上XFS根本不支持在线缩容,强行操作只会得到报错。如果确实要释放空间,正确做法是:备份/data数据、umount卸载、重建逻辑卷和文件系统、恢复数据,同时要同步修改/etc/fstab中的挂载信息避免重启失败。
第四类是分区场景下的扩容。如果文件系统直接建在分区上而不是LVM上,流程是先用growpart扩大分区号,再执行xfs_growfs:
# 安装工具并扩大分区(云盘扩容后常用) yum install -y cloud-utils-growpart growpart /dev/sdb 1 # 在线扩展文件系统 xfs_growfs /data
最后一点经验:扩容前务必用df -h确认使用率,用vgs确认卷组空闲空间,操作完成后再次df -h核对。云服务器(如阿里云、AWS的EBS)扩容云盘后,由于云盘已经是LVM底层的pv或者直接作为分区使用,进入系统后执行growpart加xfs_growfs即可完成整个链条。养成操作前后各截取一次状态的习惯,出现异常时能快速定位是哪一步出了问题。
xfs_growfsRHELXFS文件系统扩容修改时间:2026-09-07 05:12:29