这个问题其实困扰了挺久的,一直没闲情去解决,网上搜索过不少压缩方法感受都太麻烦太复杂,因最近在windows上搞docker就一并解决了。
首先下载DiskGenius,这工具很牛X,相信不少人都用过其硬盘分区、合并、数据恢复等功能,可谓至关强大,甚至虚拟硬盘文件也不放过。。。php
首先把要压缩的虚拟硬盘vmdk打开(菜单:“硬盘 –> 打开虚拟硬盘文件”)。打开后就能够在左边的窗口中看到加载上的虚拟磁盘了。html
新建一个容量不小于源虚拟硬盘的虚拟硬盘vmdk文件docker
选择(菜单:“工具 –> 克隆硬盘”),弹出对话框后,在“选择源硬盘”时选择要压缩的源vmdk虚拟硬盘,在“选择目标硬盘”时选择刚刚咱们新建的vmdk虚拟硬盘,而后点“开始”等待压缩完成便可。windows
先把源vmdk备份,再把压缩好的vmdk复盖源vmdk,以后启动虚拟机。。。工具
没啥意外会报出以下错误ui
UUID {00000000-0000-0000-0000-000000000000} of the medium 'C:\Users\Neil\.docker\machine\machines\default\disk.vmdk' does not match the value {131b2a66-a477-41dd-b920-1a0a460d3ec8} stored in the media registry ('C:\Users\Neil\.VirtualBox\VirtualBox.xml'). 返回 代码: E_FAIL (0x80004005) 组件: MediumWrap 界面: IMedium {4afe423b-43e0-e9d0-82e8-ceb307940dda}
大概意思是压缩后的vmdk文件的UUID和原来注册表里的UUID不匹配spa
so good,咱们到VirtualBox安装目录C:\Program Files\Oracle\VirtualBox.net
在目录空白处 shift+右建 –> 选择“在此处打开命令窗口”code
输入xml
VBoxManage internalcommands sethduuid C:\Users\Neil\.docker\machine\machines\default\disk.vmdk 131b2a66-a477-41dd-b920-1a0a460d3ec8
返回要修改的UUID值就成功了
UUID changed to: 131b2a66-a477-41dd-b920-1a0a460d3ec8
disk.vmdk从C盘移到其它盘,而后在VirtualBox中将虚拟硬盘指向新的disk.vmdk,这时会报错
错误:打开虚拟硬盘失败,UUID already exists
由于这个UUID在注册表里已经存在,咱们用命令修改一下vmdk的路径
VBoxManage internalcommands sethduuid X:\yourDir\disk.vmdk
而后VirtualBox中从新指向这个disk.vmdk就行了
参考:
http://www.diskgenius.cn/exp/...