我在运行 Hyper-V Server 2008 R2 的主机上托管了多台虚拟机。大约 16 个月前,磁盘最初在另一台服务器(2008,不是 R2)上配置,并在一年前迁移到此服务器上。大多数客户机运行的是 Windows 7。
最近,我将 VHD 大小与客户机报告的已用空间进行比较,发现几台机器的 VHD 文件比实际需要的大 50-100%。因此,我决定尝试压缩 VHD 文件以释放主机上的空间。我按照在网上找到的说明进行操作,大致如下:
- 在客户机中运行 CHKDSK
- 在客户机中运行碎片整理程序(Windows 内置碎片整理程序)
- 关闭来宾
- 在 Hyper-V 管理器中打开“编辑磁盘...”工具
- 选择感兴趣的 VHD 并选择压缩它
我第一次尝试这个时,它运行完美,并将我的 VHD 大小减少了约 50%。但对于其他每个客户的磁盘,我都收到此错误消息:
The server encountered an error trying to edit the virtual disk.
'The system failed to compact 'C:\example.vhd'. Error Code: The requested
operation could not be completed due to a file system limitation
没有客户机启用 NTFS 压缩。这些磁盘没有快照。还有什么可能导致此错误?
编辑:如果有人能描述出一种可以自动控制动态 VHD 大小的解决方案,那么他将获得加分。
答案1
从客户机中删除卷影副本。这样就完成了!
vssadmin delete shadows /all
答案2
为了互联网搜索整合:最终找到了此链接,这是在 HyperV compact 不起作用时有效的方法: https://fiddley.wordpress.com/2014/01/27/dynamically-expanding-vhd-not-compacting-in-hyper-v/
在管理命令提示符下,运行DISKPART
在 DISKPART 命令提示符下
select vdisk File=”I:\path\to\your.vhd”
attach vdisk readonly
compact vdisk
detach vdisk
答案3
除了建议删除卷影副本外,您还应该使用SDelete
用于在压缩之前将空白空间清零,因为有时它可以压缩更多未使用的空间。例如,要将 C 中的空白空间清零:您应该运行此命令从内部虚拟机:
sdelete -z c:
就我而言,我有一个总大小为 80 GB 的虚拟磁盘文件,第一次压缩仅将其减少到 78 GB,删除影子副本并再次压缩将其减少到 72 GB,但运行sdelete
下一次压缩后文件大小减少到 56 GB。
答案4
以上所有方法对我来说都不起作用,因为我需要先对 WSL vdisk 进行碎片整理。我找到了一种方法,请随意查看: https://github.com/bendover94/reclaim_wsl_mem