每日壁纸

解决虚拟机分配空间与实际使用不符的问题

Published on
/7 mins read/---

我最近在使用 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 命令),我发现问题出在这里:

  1. 我的 100G 虚拟硬盘:它已经被虚拟机识别到了。
  2. 我的“大仓库”(LVM 卷组):它也拿到了接近 98G 的空间,说明 PVE 已经成功把空间交给了虚拟机。
  3. 我的“小房间”(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。我们必须运行一个命令来更新这个标签,让系统真正能使用新增加的空间。

这取决于你的文件系统类型(通常是 ext4xfs)。

A. 如果你的文件系统是 Ext4 (最常见)

使用 resize2fs 命令:

# 命令解释:
# resize2fs:调整 Ext4 文件系统的大小
sudo resize2fs $LV_PATH

B. 如果你的文件系统是 XFS

使用 xfs_growfs 命令(如果不知道类型,通常试试这个命令也没关系,它只对 XFS 有效):

# 命令解释:
# xfs_growfs:扩大 XFS 文件系统
sudo xfs_growfs /

最终确认

操作完成后,再次运行 df -h

df -h

你会看到根目录 /总容量 已经从 49G 成功变成了 98G 左右!现在,无论是你的终端还是 1Panel 面板,都会显示正确的 100G 空间了!

Happy Servering !