在管理 Linux 磁盘时,你是否遇到过这样的困惑:正常扩容之后,发现GParted 显示某个分区还有几十 GiB 可用,但 df -h
却提示该分区已接近满额?这种 “空间幻觉” 背后是系统存储管理的分层设计,本文将从原理到实践,带你彻底解决这个问题。
阅读说明
一、背景与扩容步骤 这部分是关于虚拟机如何扩容步骤及相关背景
二、解决不一致问题(未正常扩容) 这一部分是说明按照扩容步骤正常扩容之后,但是使用df -h查看磁盘却未发生任何改变。(可能是因为LVM2的原因)
后续其余部分是关于LVM2为什么会出现相关情况,及LVM相关操作的相关说明
根据实际情况选择需要的部分阅读。
一、背景与扩容步骤
环境:VMware 安装的Ubuntu24.04 .1 server版本
事件起因:当我发现虚拟机磁盘空间被占满时,进行了相关的扩容操作。如下图所示:
1、发现磁盘告警
2、扩容
关闭虚拟机–>点击硬盘–>扩展–>根据需要设置磁盘总大小 (我在截图之前是60g,后来改成了70g,但是不影响具体步骤)
改好之后启动虚拟机。
3、使用gparted工具调整大小(使用可视化工具,最简单)
由于我安装的Ubuntu server版本(如果使用的是其它桌面版,就不会存在这个问题,直接运行命令sudo gparted 即可),在命令行无法支持ui界面。所以我采用一个远程工具(MobaXterm)进行ssh远程连接到服务器(Ubuntu server)。
执行命令:
sudo gparted
可能遇到的问题:
1、未安装gparted工具
sudo install gparted //安装gparted工具
2、MobeXterm 可能会遇到的问题。如下图:
打开图上所示网页,可以找到解决办法:
执行命令,成功之后会看见gparted的ui界面,如下图:
sudo xauth add $(xauth -f ~ml/.Xauthority list|tail -l) //命令中的ml改为自己的用户名
sudo gparted //再执行这个命令即可正常打开
打开gparted工具界面之后,选择想要更改大小的分区,鼠标右键–>Resize/Move
更改文件系统大小,可以直接拖动。也可以直接改数字,如图(说明:截图中是已经改过了的,未改之前会发现是有颜色区分的):
改好之后点击Resize -> 再点击上面勾按钮
最后点击应用(Apply)
说明:正常情况下,从开始步骤到这个地方,已经完成了虚拟机的扩容操作。,但是我装虚拟机默认使用的LVM2 全称是 Logical Volume Manager,即逻辑卷管理器。 就会出现扩容不成功(其实是扩容步骤还未完成,即df -h 与gparted不一致问题)。 最后我会说明为什么会出现这个问题。
4、发现不一致问题截图对比
现象:GParted 显示物理卷(如 /dev/sda3
)有未分配空间,但 df -h 显示逻辑卷(如 /dev/mapper/ubuntu--vg-ubuntu--lv
)已接近满额。
二、解决不一致问题(未正常扩容)
解决步骤:扩展逻辑卷 + 扩展文件系统
1、检查卷组剩余空间
sudo vgdisplay # 查看卷组(如 ubuntu-vg)的剩余空间
输出中 Free PE
有数值(图中为 39.00 GiB),说明卷组有未分配空间。如图:
2 、扩展逻辑卷
将逻辑卷(如 ubuntu-vg/ubuntu-lv
)扩展到卷组剩余空间的 100%:
sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
(或指定具体大小:lvextend -L +39G /dev/...
)
3、扩展文件系统
根据文件系统类型选择命令(ext4 用 resize2fs
,xfs 用 xfs_growfs
):
# ext4 示例
sudo resize2fs /dev/ubuntu-vg/ubuntu-lv
# xfs 示例
sudo xfs_growfs /dev/ubuntu-vg/ubuntu-lv
4 、验证结果
再次执行 df -h
,确认逻辑卷的 “Size” 和 “Avail” 已更新。
三 、详细解释不一致的原因:
1. 显示的对象不同
gparted
:显示的是物理卷(PV) 的大小。即:硬盘上划分出来的那个类型为lvm2 pv
的分区有多大。这是“分配给LVM的总空间”。df -h
:显示的是逻辑卷(LV) 上的文件系统的使用情况。即:从LVM池子里划出来的那个“逻辑分区”(如根目录/
对应的那个卷)有多大以及用了多少。这是“你实际可用的空间”。
2. 层级关系
空间分配的流程是:物理磁盘 → 分区(PV) → 卷组(VG) → 逻辑卷(LV) → 文件系统 → 存储文件。
gparted
在第二层,df -h
在第五层。中间的任何变化都会导致两者显示的数字不同。
四、为什么会出现这种情况?常见场景:
场景一:LVM卷组有剩余空间(最常见)
这是最普遍的情况。安装系统时,你可能把整个磁盘都作为一个物理卷(PV)给了LVM的卷组(VG),但只从卷组中划出了一部分空间来创建根文件系统(LV)。
gparted
显示:整个PV的大小(例如:100GB)。df -h
显示:根逻辑卷(LV)的大小(例如:90GB)。- 差异:剩下的 10GB 空间仍在卷组(VG)中,是未分配的“空闲空间”,可以被用来扩展现有的逻辑卷或创建新的逻辑卷。这部分空间
df -h
是看不到的。
如何验证?
使用 sudo vgdisplay
命令查看卷组信息,你会看到:
- VG Size:应该接近
gparted
显示的大小。 - Free PE / Size:这里会显示卷组中尚未分配出去的剩余空间。这个数字大致就是
gparted
大小减去df -h
大小的差值。
场景二:文件系统没有占满整个逻辑卷(LV)
即使逻辑卷(LV)本身有100GB,你在上面创建的文件系统(如ext4)也可能只用了90GB。
gparted
显示:PV大小 = 100GBlsblk
显示:LV大小 = 100GBdf -h
显示:文件系统大小 = 90GB
如何验证?
使用 sudo lvdisplay
和 lsblk
命令。lsblk
会同时显示LV的大小和其上层文件系统的大小,非常适合用来排查这种差异。
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 238.5G 0 disk
├─sda1 8:1 0 512M 0 part /boot/efi
├─sda2 8:2 0 732M 0 part /boot
└─sda3 8:3 0 237.3G 0 part└─ubuntu--vg-ubuntu--lv 253:0 0 100G 0 lvm / # 逻辑卷(LV)大小
# df -h 显示的是挂载到 / 的这个文件系统的使用情况,可能只有90G
场景三:保留了启动分区或交换空间
你的磁盘上可能不仅有LVM分区,还有独立的 /boot/efi
、/boot
分区或交换分区。gparted
会显示所有分区,而 df -h
只显示已挂载的文件系统。
五、如何全面了解你的磁盘空间?
要弄清所有空间去哪了,建议按顺序使用以下命令:
sudo fdisk -l
或sudo parted -l
:查看物理磁盘和最底层的分区布局。sudo pvdisplay
:查看物理卷(PV)信息,确认LVM管理的物理空间。sudo vgdisplay
:查看卷组(VG)信息,重点关注Free PE / Size
,这是谜题的关键。sudo lvdisplay
:查看逻辑卷(LV)信息。lsblk
:这是最直观的工具,它以树形结构一次性显示磁盘、分区、物理卷、逻辑卷和挂载点之间的关系和大小。df -h
:最后看文件系统的具体使用情况。
常用的LVM管理命令:
如果您想查看系统的LVM结构,可以在终端中使用以下命令:
命令 | 功能描述 |
---|---|
sudo pvdisplay | 显示物理卷的详细信息 |
sudo vgdisplay | 显示卷组的详细信息 |
sudo lvdisplay | 显示逻辑卷的详细信息 |
lsblk | 以树形结构清晰显示磁盘、分区和逻辑卷的关系 |
df -h | 查看已挂载的文件系统及其大小(会显示逻辑卷的挂载点) |
总结:gparted
和 df -h
的大小不一致是正常的,这恰恰体现了LVM将物理存储和逻辑存储分离的核心优势——卷组(VG)中的空闲空间为你提供了极大的灵活性,你可以随时将其添加到需要扩容的逻辑卷中,而无需重新分区。