我最近在使用 PVE (Proxmox VE) 虚拟机平台时,遇到了一个非常让人困惑的问题。我明明给我的 Linux 虚拟机分配了足足 100G 的硬盘空间,可当我登录到虚拟机里面,查看 1Panel 界面或者使用 df -h 命令时,系统却告诉我:我的总容量只有 50G 左右!
这剩下的 50G 空间去哪了?是不是 PVE 没给?还是被谁偷走了?别担心,这其实是一个非常常见的“假性”容量丢失问题。
💡 一些你需要知道的基础知识
在深入解决方案之前,我们先来简单了解一下 Linux 虚拟机里硬盘是怎么运作的,这对理解问题非常关键:
1. 虚拟硬盘 vs. 文件系统
你可以把 PVE 分配的 100G 虚拟硬盘想象成你刚买的一个 100G 空白硬盘盒。这个硬盘盒是硬件层面的。
而 文件系统 (Filesystem) 就像你在这个硬盘盒上贴的标签,上面写着“这里可以放文件,总共多少空间”。我们日常看到的“已使用”和“总容量”都是文件系统这个标签告诉我们的。
2. 分区和 LVM (逻辑卷管理)
在 Linux 虚拟机里,我们很少直接使用完整的硬盘。通常需要进行分区,而现代的 Linux 系统,尤其是自动化安装的系统,更喜欢使用一个叫 LVM 的技术来管理空间。
- LVM 卷组 (VG): 你可以把 卷组 想象成一个 “大仓库”。你的 100G 虚拟硬盘的大部分空间都会被放到这个大仓库里。
- LVM 逻辑卷 (LV): 逻辑卷 就像你从“大仓库”里划出来的一个个小房间,比如一个 50G 的小房间给根目录
/用,另一个 20G 的小房间给数据目录/data用。
我的 50G 空间到底跑哪去了?
通过查看虚拟机的硬盘结构(使用 lsblk 命令),我发现问题出在这里:
- 我的 100G 虚拟硬盘:它已经被虚拟机识别到了。
- 我的“大仓库”(LVM 卷组):它也拿到了接近 98G 的空间,说明 PVE 已经成功把空间交给了虚拟机。
- 我的“小房间”(LVM 逻辑卷):它就是我的根目录
/,但是它的大小只被设置成了 49G。
结论就是: 剩下的那 49G 空间 并没有丢失!它乖乖地待在 LVM 那个 “大仓库” 里,但是还没有被分配给任何“小房间”使用!
所以,1Panel 和 df -h 只能看到它被分配到的“小房间” (49G) 的大小。我们现在要做的,就是去告诉 LVM,把“大仓库”里剩下的 49G,全部加到我的根目录 / 这个“小房间”里。
🛠️ 解决方案:两步在线扩容
这个操作非常安全和简单,而且不需要关机,是 在线操作!
⚠️ 重要提醒: 虽然操作安全,但涉及磁盘操作,我还是强烈建议你在 PVE 里给虚拟机先做一个快照,以防万一。
第一步:扩展 LVM 逻辑卷(扩大“小房间”)
我们先用 lvextend 命令,将根目录 / 所在的逻辑卷扩展到其卷组(“大仓库”)中所有可用的剩余空间。
# 首先,确定我的逻辑卷的完整路径
# 你的路径可能是 /dev/mapper/ubuntu--vg-ubuntu--lv
LV_PATH="/dev/mapper/ubuntu--vg-ubuntu--lv"
# 命令解释:
# -l +100%FREE :使用卷组中全部的剩余空间来扩展
# $LV_PATH :我要扩展的对象是这个逻辑卷
sudo lvextend -l +100%FREE $LV_PATH运行后,LVM 会告诉你,逻辑卷(“小房间”)已经成功被扩大到接近 100G 了。
第二步:扩展文件系统(更新“标签”)
现在,“小房间”虽然大了,但是贴在上面的**文件系统“标签”**还是旧的 50G。我们必须运行一个命令来更新这个标签,让系统真正能使用新增加的空间。
这取决于你的文件系统类型(通常是 ext4 或 xfs)。
A. 如果你的文件系统是 Ext4 (最常见)
使用 resize2fs 命令:
# 命令解释:
# resize2fs:调整 Ext4 文件系统的大小
sudo resize2fs $LV_PATHB. 如果你的文件系统是 XFS
使用 xfs_growfs 命令(如果不知道类型,通常试试这个命令也没关系,它只对 XFS 有效):
# 命令解释:
# xfs_growfs:扩大 XFS 文件系统
sudo xfs_growfs /最终确认
操作完成后,再次运行 df -h:
df -h你会看到根目录 / 的 总容量 已经从 49G 成功变成了 98G 左右!现在,无论是你的终端还是 1Panel 面板,都会显示正确的 100G 空间了!
Happy Servering !
