减小VMware虚拟机虚拟磁盘大小

减小 vmware 虚拟机的硬盘容量,不是压缩

vmware虚拟机的所有编号了的.*s001.*.vmdk片段虚拟磁盘文件是虚拟化的虚拟机最大空间(Maximum Size),比如我有一个Win10虚拟机的Maximum Size是84GiB(1GiB=1024MiB,1GB=1000MB),虚拟机生成了.*s001~s022.vmdk共22个虚拟机磁盘文件vmdk,该虚拟机的"Window 10 x64-cl1.vmdk"中详实记录了这22个vmdk文件(从而进行各分片虚拟磁盘文件的按名索引):

RW 8323072 SPARSE "Windows 10 x64-cl1-s001.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s002.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s003.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s004.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s005.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s006.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s007.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s008.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s009.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s010.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s011.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s012.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s013.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s014.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s015.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s016.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s017.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s018.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s019.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s020.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s021.vmdk"
RW 1376256 SPARSE "Windows 10 x64-cl1-s022.vmdk"

,vmdk文件的"8323072"数字表示簇,2簇=1KiB,则这22个vmdk文件对应了21×8323072/2/1024/1024+1376256/2/1024/1024=21×3.96875GiB+0.65625Gib=84GiB,将将好。

但同时也注意到8323072簇的虚拟磁盘文件的大小并不等于3.96875GiB,从最小的s014.vmdk的524.3KiB到最大的s006.vmdk的4.1GiB各不相同,我猜这可能是使用了某种压缩算法,毕竟这84GiB包含了529MiB+99MiB+68.39GiB+14.98GiB≈83.98GiB共四个分区,14.98GiB的未分配分区不必占用虚拟磁盘,而68.39GiB的C盘也只利用了89%,可以看到,排除空闲空间后的有效数据,即所有22个虚拟磁盘的总大小为56.8GiB≈529MiB+99MiB+68.39GiB-13.13GiB=55.87GiB。

虚拟机只存储"压缩后的有效数据",实际占用主机的存储空间接近Current Size(要大一些),这些有效数据只能通过vmware tools或者虚拟机设置里Disk Utilities的Defragment Disk与Compact Disk进行压缩

好了,弄懂虚拟机虚拟磁盘的分配方式后就需要解决“如何减小分配给虚拟机的最大空间Maximum Size”的问题了,

解决办法:先确定一个大于Current Size的目标Maximum Size,我希望缩小到65GiB=1363148880簇=16×8323072簇+3145728簇,修改"Window 10 x64-cl1.vmdk"中片段虚拟磁盘的簇为:

RW 8323072 SPARSE "Windows 10 x64-cl1-s001.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s002.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s003.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s004.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s005.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s006.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s007.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s008.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s009.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s010.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s011.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s012.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s013.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s014.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s015.vmdk"
RW 8323072 SPARSE "Windows 10 x64-cl1-s016.vmdk"
RW 314572  SPARSE "Windows 10 x64-cl1-s017.vmdk"
#RW 8323072 SPARSE "Windows 10 x64-cl1-s017.vmdk"
#RW 8323072 SPARSE "Windows 10 x64-cl1-s018.vmdk"
#RW 8323072 SPARSE "Windows 10 x64-cl1-s019.vmdk"
#RW 8323072 SPARSE "Windows 10 x64-cl1-s020.vmdk"
#RW 8323072 SPARSE "Windows 10 x64-cl1-s021.vmdk"
#RW 1376256 SPARSE "Windows 10 x64-cl1-s022.vmdk"

然后启动虚拟机,如果报错虚拟机所在磁盘分区空间不足,那确实是磁盘分区空间不足,增加虚拟机所在主机磁盘分区。此时虽然能启动,但如果尝试使用vmtools压缩磁盘可能会在99%时跳到宿主机的压缩消息框时提示Snapshot power on failed或者Insufficient permission to access the file等的其他问题,所以不要尝试压缩了,关机虚拟机,然后VM > Manage > Clone把当前虚拟机克隆到U盘上,此时打开克隆的虚拟机会看到Current Size缩小到了45.6GiB并且System Free的要求也降到了9.6GiB,完了删除当前虚拟机,然后将U盘上克隆的虚拟机再拷贝回来,只要保证虚拟机所在磁盘分区剩余空间大于System Free要求的9.6GiB就可以在虚拟机使用vmtools进行磁盘压缩了。

Maximum Size成功缩小,修改*.vmx的簇之后启动虚拟机后使用vmtools压缩虚拟磁盘文件时,由于Current Size没变,则虚拟机在压缩虚拟磁盘时仍需要原来那么大的转储空间,这个空间要求比System Free大一些,所以会在压缩到99%时报各种错,我没有记录下来。这时关闭虚拟机,对虚拟机进行克隆Clong,则克隆后的Current Size会减小,这时候vmtools压缩需要的转储空间也会减小,只要给虚拟机所在磁盘分区留有比System Free和这个转储空间大的剩余空间,就可以成功用vmtools压缩了,至于这个转储空间是多少,我是试出来的。

System Free可能有考虑到*.vmem虚拟内存文件的大小,和其他的不知道什么需求。总之要能在虚拟机内使用vmtools压缩,则虚拟机所在主机磁盘分区的剩余空间要比System Free大个5GiB作用,我试出来的。

猜你喜欢

转载自blog.csdn.net/HayPinF/article/details/108252631