解决 df -h 与 lsblk 显示不一致问题(XFS 文件系统实操记录)

在日常 Linux 运维工作中,我们经常会用到 lsblkdf -h 两个命令查看磁盘信息,但偶尔会遇到一个令人困惑的问题:两者显示的磁盘容量不一致。最近在维护一台 ECS 服务器时,就遇到了这种情况,特此记录排查过程和解决方法,供有同样需求的运维同行参考。

一、问题现象:两者显示差异明显

在服务器上执行 lsblk 命令查看磁盘信息,发现 /dev/sdc 磁盘容量为 215GB(实际购买的是 200GB 云硬盘,因计算进制差异显示为 215GB),且已挂载至 /var/lib/docker 目录。

具体执行结果如下:

dart 复制代码
[root@ecs-90894794 ~]# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda             8:0    0   40G  0 disk 
├─sda1          8:1    0    1G  0 part /boot
└─sda2          8:2    0   39G  0 part 
  └─klas-root 253:0    0   39G  0 lvm  /
sdb             8:16   0  200G  0 disk 
sdc             8:32   0  215G  0 disk /var/lib/docker
sr0            11:0    1  458K  0 rom  

但当执行 df -h /var/lib/docker 查看该挂载点的实际使用情况时,却发现容量仅为 50GB,已用 70%,与 lsblk 显示的 215GB 相差巨大。

typescript 复制代码
[root@ecs-90894794 ~]# df -h /var/lib/docker
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdc         50G   35G   16G   70% /var/lib/docker

二、问题排查:一步步定位原因

遇到这种差异,首先要明确两个命令的核心区别,才能针对性排查:

  • lsblk:查看的是物理磁盘/分区的硬件容量,反映的是磁盘本身的实际大小,不受文件系统影响;
  • df -h:查看的是文件系统已挂载的可用容量,显示的是文件系统实际可使用的空间,而非磁盘硬件本身的容量。

基于这个区别,排查思路如下:

1. 确认磁盘分区是否完整

首先怀疑是磁盘分区未占满整个物理磁盘,导致 lsblk 显示物理盘容量,而 df 显示分区容量。执行 parted /dev/sdc print 查看分区详情:

scss 复制代码
[root@ecs-90894794 ~]# parted /dev/sdc print
型号:QEMU QEMU HARDDISK (scsi)
磁盘 /dev/sdc:215GB
扇区大小 (逻辑/物理):512B/512B
分区表:loop
磁盘标志:

编号  起始点  结束点  大小   文件系统  标志
 1    0.00B   215GB   215GB  xfs

从输出可以看到,/dev/sdc 只有一个分区,且分区已占满整个 215GB 磁盘,排除"分区未占满物理盘"的问题。

2. 确认文件系统类型及状态

排除分区问题后,重点排查文件系统。执行df -T /var/lib/docker 查看文件系统类型:

typescript 复制代码
[root@ecs-90894794 ~]# df -T /var/lib/docker
文件系统       类型    1K-块     已用     可用 已用% 挂载点
/dev/sdc       xfs  52403200 36295308 16107892   70% /var/lib/docker

确认文件系统为 XFS,这是关键信息。结合排查结果,最终定位原因:

磁盘已从 50GB 在线扩容至 215GB,分区表已自动同步扩容,但 XFS 文件系统未跟随扩容,仍停留在原来的 50GB 大小

补充说明:XFS 文件系统本身不支持自动扩容,即使底层磁盘/分区扩容,也需要手动执行命令让文件系统识别新增空间。

三、解决方法:一键扩容 XFS 文件系统

由于分区已占满整个物理磁盘,且文件系统为 XFS,只需执行一条命令即可完成扩容,无需停机、不丢失数据,全程在线操作。

核心命令(直接复制执行)

bash 复制代码
xfs_growfs /var/lib/docker

命令说明

xfs_growfs 是 XFS 文件系统的扩容工具,作用是将文件系统大小扩展至底层分区的最大可用空间。这里直接指定挂载点 /var/lib/docker,工具会自动识别对应的分区和文件系统,完成扩容。

验证结果

扩容完成后,再次执行 df -h /var/lib/docker 查看效果:

typescript 复制代码
[root@ecs-90894794 ~]# df -h /var/lib/docker
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdc        215G   35G  180G   17% /var/lib/docker

此时 df -h 显示的容量与 lsblk 一致,问题彻底解决。

四、常见场景补充(避坑指南)

除了本次遇到的"XFS 文件系统未扩容"场景,df -hlsblk 不一致还有以下两种常见情况,可对应排查:

场景1:分区未占满物理磁盘

表现:lsblk 显示物理盘容量大,parted 查看分区仅占一部分空间。

解决:先通过 parted 调整分区大小(扩大至物理盘100%),再执行对应文件系统的扩容命令(XFS 用 xfs_growfs,ext4 用 resize2fs)。

场景2:文件系统为 ext4 未扩容

表现:与本次场景类似,但文件系统为 ext4。

解决:分区扩容后,执行 resize2fs /dev/xxx(xxx 为分区名,如 /dev/sdc1)即可。

相关推荐
_Evan_Yao4 小时前
别让“规范”困住你:前后端交互中的方法选择与认知突围
java·后端·交互·restful
成为大佬先秃头5 小时前
开放标准(RFC 7519):JSON Web Token (JWT)
spring boot·后端·json·jwt
回家路上绕了弯5 小时前
Git worktree 终极指南:告别分支切换烦恼,实现多分支并行开发
git·后端
@atweiwei5 小时前
用 Rust 构建agent的 LLM 应用的高性能框架
开发语言·后端·rust·langchain·eclipse·llm·agent
skilllite作者5 小时前
Spec + Task 作为「开发协议层」:Rust 大模型辅助的标准化、harness 化与可回滚
开发语言·人工智能·后端·安全·架构·rust·rust沙箱
懒得起名_yyf5 小时前
Http---详细格式介绍
后端
程序员cxuan5 小时前
今天看到很多人讨论 Linux 终于要接受 AI 提交的代码了,我的第一反应是,真的吗?作为喷 AI 最狠的祖师爷到底咋看这件事儿?
后端·程序员
何陋轩5 小时前
GitHub Copilot深度使用指南:手把手教你在IDEA中榨干AI生产力
人工智能·后端
fish20265 小时前
车载日志限流稽查系统
后端