這個問題其實困擾了挺久的,一直沒閒情去解決,網上搜索過不少壓縮方法感受都太麻煩太複雜,因最近在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/...