内容简介:默认情况下,vmware 虚拟机的硬盘空间可以在 vmware 的虚拟机设置里调整大小,但只能『扩展』,却无法缩小。一,vmware 的虚拟硬盘文件 *.vmdk 默认是动态分配空间的,没有数据的虚拟 “硬盘空间” 并不占用真实主机的实际硬盘空间。当虚拟机内需要储存更多数据时,对应的 vmdk 文件会相应增大,以便容纳新增的数据。但当虚拟机内的数据被清理时,已经增大的 vmdk 文件却不会自动缩小。随着虚拟机的不断使用,『只增大不缩小』的情况会逐渐严重,直到 vmdk 体积达到预设的虚拟机硬盘完整容量为止
默认情况下,vmware 虚拟机的硬盘空间可以在 vmware 的虚拟机设置里调整大小,但只能『扩展』,却无法缩小。
当输入较小数字时,按钮变灰,无法点击。
问题:为什么要缩小虚拟机硬盘
一,vmware 的虚拟硬盘文件 *.vmdk 默认是动态分配空间的,没有数据的虚拟 “硬盘空间” 并不占用真实主机的实际硬盘空间。当虚拟机内需要储存更多数据时,对应的 vmdk 文件会相应增大,以便容纳新增的数据。但当虚拟机内的数据被清理时,已经增大的 vmdk 文件却不会自动缩小。随着虚拟机的不断使用,『只增大不缩小』的情况会逐渐严重,直到 vmdk 体积达到预设的虚拟机硬盘完整容量为止。
- 向虚拟机内复制文件并随后删除。
- 设置虚拟机快照并随后删除。
- 安装各类软件而后卸载 / 利用快照恢复原样
等等各种情况都会增大 vmdk 体积。vmware 针对这种情况提供了 shrink disk(压缩硬盘)功能,也就是在虚拟机数据已经被清除后,整体扫描一遍 vmdk 文件,清理无效数据,缩小真实体积。但这也有两个麻烦:
- 因为膨胀永远存在,所以压缩也要经常进行,难免感觉在做无用功。
- Linux 下 shrink 功能有 bug,需要配合 dd 命令先以 0 数据充,相当于先撑大再缩小,耗时数倍。参考:第四条豆知识
二,很多情况下,我们安装虚拟机的用途都比较单一,比如干净 WinXP / Win7 测试软件,练习多个 Ubuntu Server 组集群,或在 Linux/Mac 主机上利用 Windows 虚拟机操作网银。虚拟机的实际硬盘占用也往往小于 vmware 的推荐值。这是实际需求方面及可操作方面。
三,强迫症 / 好奇 / 无理由。
于是,根据实际使用情况,适当降低虚拟机的硬盘容量,将『使用膨胀』的上限卡住,释放真实硬盘空间并避免经常的压缩操作,对时间和金钱都有好处。尤其是现在 SSD 逐步标配的阶段,虚拟机硬盘容量设置不当造成的浪费是很可观的。
问题:如何操作
我以一个当初决策不当分配了 40GB 硬盘空间的虚拟机 Windows XP 为例,重新调整的目标为 10GB。该虚拟机的所有文件放在 D:\Program files\Windows XP.vmwarevm 目录下。一般来说,全新安装的 Windows XP 大约占 4-5GB 空间,则我们还有约 5GB 空间可用来安装测试软件等,足够了。如果不够就自行酌情决定调整目标。
一、清理删除当前虚拟机下的所有快照,如果这些快照很重要不能删,那接下来的操作对你就没意义了。
二、确认虚拟机硬盘是拆分成多个文件的动态分配硬盘。用 VSCode 打开虚拟机目录下和虚拟机同名的 *.vmdk 文件,如 『Windows XP.vmdk』。找到 # Extent description 部分,检查描述部分,一看就懂了。如图:
- 如果有多行描述,并且每行写了 SPARSE ,这是我们需要的类型,拆分+动态分配磁盘。
- 如果有多行描述,但每行写的是 FLAT ,则为拆分的预分配磁盘,需要转格式。
- 只有一行描述,写的是 FLAT ,则是单一文件预分配磁盘,也需要转格式。
- 如果乱码或者提示打不开,则是单一文件动态分配磁盘,还是需要转格式。
VMWare 在新建虚拟机时会默认选择第一种类型,但玩家当初可能出于性能等考虑,选择了其它类型的虚拟硬盘。那么就需要使用 vmware 自带的一个命令行工具 vmware-vdiskmanager.exe 转换成第一种类型。该 工具 在 vmware 安装目录下,默认为 “C:\Program Files (x86)\VMware\VMware Workstation\vmware-vdiskmanager.exe”。
转换方法:
该工具的命令行写法为:
工具名 | 参数1 | 源文件 | 参数2 | 参数3 | 目标名称 |
---|---|---|---|---|---|
vmware-vdiskmanager | -r(转格式) | Windows XP.vmdk(例) | -t(目的) | 1(目的磁盘类型,1 为拆分+动态分配) | newdisk.vmdk |
该命令中, - r , - t1 两部分不需要变化, 目标名称 随意,之后会改名覆盖源文件。 源文件名 根据实际情况变化,而 工具名 通常要带上路径。
所以完整的命令大约是如下样子:
>"c:\Program Files (x86)\VMware\VMware Workstation\vmware-vdiskmanager.exe" -r "d:\Program Files\Windows XP.vmwarevm\Windows XP.vmdk" -t 1 "d:\Program Files\Windows XP.vmwarevm\newdisk.vmdk"
回车以后开始执行转换:
转换完成以后,删除旧的 “windows XP.vmdk” 和多个关联文件 “windows XP-s0xx.vmdk”,然后把新的 newdisk.vmdk 重命名成 “windows XP.vmdk” 以替换。其它 newdisk-s00x.vmdk 不用变。
三,打开虚拟机,进入系统。
- 在虚机机内,使用分区管理软件将硬盘分区缩小,并将空闲保留在右端,分区块保持在左端。我们的整体目标是从 40GB 缩到 10GB,则现在要多缩一点给后续操作留出余量。如图,暂时缩到 9GB。
- Windows 7 以上系统,自带的磁盘管理就有『压缩卷』功能可以调整分区大小,WinXP 用的是 DiskGenius 免费版本。Win98 则需要寻找更古老的相应软件。
- 中途可能需要重启虚拟机,无妨,调整完关闭虚拟机即可。
四,加减乘除:
再次打开 Windows XP.vmdk 文件,定位到 # Extent description 部分。这次重点放在第二部分数字内容上,经计算,该数字为每个分块文件对应虚拟硬盘的簇数量,每簇 512 Byte,2 簇 = 1KB。我们的目标容量为 10GB,也就是:
- 10(GB)*1024(MB/GB)*1024(KB/MB)= 10485760 KB = 20971520 簇。
检查 # Extent description,前两个文件每个 8323072,则把第三行的数字改为
- 20971520 – 8323072*2 = 4325376
并删掉后续各行及对应文件,我们就在 vmware 部分完成了虚拟机硬盘大小调整。
五,补足余量:
重开虚拟机。前次调整分区时,预留了 1GB 左右的余量。再次打开分区工具,把剩余未使用空间重新分配给各分区。
这是因为对计算机分区而言,存在分区表、特殊扇区等原因,物理上的 10GB 空间在系统内的表现肯定是略小于 10GB 的,这对于虚拟机也一样成立。『内』『外』之间有差额,如果一开始就分区 10GB 而外部调整也等 10GB 的话,再次启动虚拟机就会报分区表错误,界时修改起来反而麻烦。预留余量,而后补足分区就没问题了。
六,清理死数据:
由于直接修改了描述文件,改小了簇数量,-s003.vmdk 里原本存于 4325376 之后的数据变成了永久的『死数据』。关闭虚拟机后,需要使用 vmware-vdistmanager -r -t 1 再作一次转换。虽说是转换,但目的却是清理死数据。清理完以后直接单独替换新旧 -s003.vmdk 即可。(想想为什么?) 目标> 源>
————————————————-
相关细节:
- 虚拟机 Linux 系统时原理一样。利用 GParted 等分区工具,首先缩小使用分区,并调整未分区块到尾端。而后编辑 vmdk 描述改为需要的容量,最后再重进系统分区调整补足余量即可。
- 预分配类型的虚拟硬盘必须先 vdiskmanager 转类型,不能直接操作。追求性能的话在编辑完再转回去。不过追求性能的话应该上 SSD,一力降十会。
- 编辑 .vmx 和 .vmdk 文件不要用 windows 自带的记事本。
- 虚拟机备份直接复制整个目录即可。
以上所述就是小编给大家介绍的《减小 vmware 虚拟机的硬盘容量,不是压缩》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 减小APK大小
- 使用 Docker 多阶段构建来减小镜像大小
- [译] 让 Apache Cassandra 尾部延迟减小 10 倍,已开源
- 【译】使用 webpack 进行 web 性能优化(一):减小前端资源大小
- ESXi虚拟机磁盘格式转换与减小硬盘容量的方法 荐
- Swift 5 将进一步减小 iOS 应用安装包大小
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。