在日常 Linux 运维工作中,我们经常会用到 lsblk 和 df -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 -h 与 lsblk 不一致还有以下两种常见情况,可对应排查:
场景1:分区未占满物理磁盘
表现:lsblk 显示物理盘容量大,parted 查看分区仅占一部分空间。
解决:先通过 parted 调整分区大小(扩大至物理盘100%),再执行对应文件系统的扩容命令(XFS 用 xfs_growfs,ext4 用 resize2fs)。
场景2:文件系统为 ext4 未扩容
表现:与本次场景类似,但文件系统为 ext4。
解决:分区扩容后,执行 resize2fs /dev/xxx(xxx 为分区名,如 /dev/sdc1)即可。