在日常 linux 运维工作中,我们经常会用到 lsblk 和 df -h 两个命令查看磁盘信息,但偶尔会遇到一个令人困惑的问题:两者显示的磁盘容量不一致。最近在维护一台 ecs 服务器时,就遇到了这种情况,特此记录排查过程和解决方法,供有同样需求的运维同行参考。
一、问题现象:两者显示差异明显
在服务器上执行 lsblk 命令查看磁盘信息,发现 /dev/sdc 磁盘容量为 215gb(实际购买的是 200gb 云硬盘,因计算进制差异显示为 215gb),且已挂载至 /var/lib/docker 目录。
具体执行结果如下:
[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 相差巨大。
[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 查看分区详情:
[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 查看文件系统类型:
[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,只需执行一条命令即可完成扩容,无需停机、不丢失数据,全程在线操作。
核心命令(直接复制执行)
xfs_growfs /var/lib/docker
命令说明
xfs_growfs 是 xfs 文件系统的扩容工具,作用是将文件系统大小扩展至底层分区的最大可用空间。这里直接指定挂载点 /var/lib/docker,工具会自动识别对应的分区和文件系统,完成扩容。
验证结果
扩容完成后,再次执行 df -h /var/lib/docker 查看效果:
[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)即可。
到此这篇关于linux中df -h与lsblk显示不一致问题的解决方法的文章就介绍到这了,更多相关linux df -h与lsblk显示不一致内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论