【适用场景】
在 Proxmox VE (PVE) 环境下使用 LVM-Thin (注意是LVM-Thin格式)的磁盘作为存储。虚拟机操作系统为 Windows。在 Windows 虚拟机内部删除了大量文件(例如,清理了 D 盘的日志文件),但发现 PVE 宿主机上该虚拟磁盘实际占用的物理空间(通过 lvs
命令查看 Data%
或 Web 界面观察)并没有相应减少。
虚拟机中已清理磁盘
PVE磁盘占用情况
【核心原理】
- LVM-Thin (精简置备): 它只在数据实际写入时分配物理块。
- Discard/TRIM/UNMAP: 这是操作系统通知底层存储“这些块我不再使用了,你可以回收了”的命令。
- 问题: 虚拟机需要将内部的 TRIM 命令正确传递给宿主机的 LVM-Thin 存储层。同时,文件系统本身需要准确知道哪些块是空闲的。
【操作步骤】
-
备份虚拟机 : 对虚拟机进行完整备份!可以使用 PVE 的备份功能或虚拟机内部的备份工具。
-
启用虚拟磁盘的 “Discard” 选项:
- 在 PVE Web 界面中,选中 Windows 虚拟机。
- 转到 “Hardware” (硬件) 选项卡。
- 找到要操作的硬盘条目 (例如
Hard Disk (scsi0)
,Hard Disk (virtio1)
等)。 - 双击该条目或选中后点击 “Edit” (编辑)。
- 勾选 “Discard” 复选框。 (如果使用 VirtIO 磁盘,勾选 “SSD Emulation” 通常也会自动启用 Discard,推荐勾选)。
- 点击 “OK” 保存。 (如果之前未启用,可能需要重启虚拟机才能完全生效)
-
【可选但推荐】使用 SDelete 零填充空闲空间:
- 下载微软 Sysinternals Suite 中的
sdelete
工具。
官网链接: 直达 - 以 管理员身份 打开命令提示符 (CMD) 或 PowerShell。
- 运行命令 (假设清理 D 盘,
sdelete64.exe
在C:\Sysinternals
):
*(或者将C:\Sysinternals\sdelete64.exe -z D:
sdelete64.exe
复制到C:\Windows\System32
后直接运行sdelete64 -z D:
) * - 目的: 将所有未被文件占用的空闲空间写入零。这使得后续 TRIM 操作能更有效地识别和回收空间。
- 注意: 此过程可能非常耗时,取决于磁盘大小和性能,等待完成即可。
- 下载微软 Sysinternals Suite 中的
-
【关键步骤】检查并修复文件系统 (
chkdsk /f
):- 以 管理员身份 打开命令提示符 (CMD) 或 PowerShell。
- 运行命令 (检查 D 盘):
chkdsk D: /f
- 系统很可能会提示卷正在使用中,
若提示 : 是否要强制卸除该卷? (Y/N),选择N,后面选择重启检查
,并询问是否要在下次重启时检查。输入 Y
并按 Enter。
* 重新启动 Windows 虚拟机。
* 在重启过程中,耐心等待 chkdsk
完成检查和修复。不要中断此过程!
* 目的: 确保文件系统内部没有错误或不一致,这些问题可能阻止操作系统正确跟踪空闲块,从而使 TRIM 失效。
-
执行 TRIM 命令 (
Optimize-Volume -ReTrim
):-
在
chkdsk /f
(包括重启) 完成之后,再次以 管理员身份 打开 PowerShell。 -
运行命令 (针对 D 盘):
Optimize-Volume -DriveLetter D -ReTrim -Verbose
-
目的: 强制 Windows 向底层存储发送 TRIM 命令,通知其回收所有现在已知是未使用的块(包括被
sdelete -z
写入零的块和chkdsk
修复后确认的空闲块)。 -
-Verbose
参数会显示详细输出。
-
-
验证空间回收 (PVE 宿主机):
- 通过 SSH 或控制台登录到 PVE 宿主机。
- 运行命令:
lvs
- 找到代表虚拟机磁盘的那个逻辑卷 (例如
vm-102-disk-2
)。 - 观察该行的
Data%
列。 这个百分比应该已经显著降低了,表明物理空间已被回收。 - (PVE Web 界面的使用率显示可能会有延迟,
lvs
命令更实时准确)
【关键点总结】
- 备份是前提
- 虚拟机磁盘必须启用 “Discard” 选项。
- 仅删除文件是不够的,需要触发 TRIM。
sdelete -z
有助于最大化回收效果(推荐)。chkdsk /f
对于确保文件系统一致性至关重要,是 TRIM 生效的基础。Optimize-Volume -ReTrim
是手动触发 TRIM 的命令。- 最终在 PVE 宿主机使用
lvs
命令验证Data%
。