缩小vmdk Virtualbox磁盘映像

rub*_*o77 24 virtualbox

VirtualBox能够压缩(缩小尺寸).vdi图像,但.vmdk磁盘图像无法实现.但是.vmdk如果我们可以压缩文件:

  1. 分离
  2. 转换成 .vdi
  3. 紧凑
  4. 转换回来 .vmdk
  5. 再次附加到原始的虚拟机器

所以我尝试用这个脚本缩小我的VirtualBox图像:

#/bin/bash

VM_PATH=~/VirtualBox\ VMs
cd "$VM_PATH"
VM="$(ls ffnord-example_gc-gw0_* -d -1|head -n 1)"
cd "$VM"
VM_VDMK_NAME="$(ls *.vmdk -1|head -n 1)"
VM_NAME="$VM_PATH/$VM/$VM_VDMK_NAME"

echo reducing size of "$VM_NAME"
ls -lah "$VM_NAME"
set -x
vboxmanage showvminfo "${VM}"
vboxmanage storageattach "${VM}" --storagectl SATA --port 0 --device 0 --type hdd --medium none
vboxmanage clonehd --format vdi "${VM_NAME}" /tmp/VM-disk.vdi
vboxmanage closemedium disk "${VM_NAME}" --delete
vboxmanage modifyhd /tmp/VM-disk.vdi --compact
vboxmanage clonehd --format vmdk /tmp/VM-disk.vdi "${VM_NAME}"
vboxmanage closemedium disk /tmp/VM-disk.vdi --delete
vboxmanage storageattach "${VM}" --storagectl SATA --port 0 --device 0 --type hdd --medium 4/VMs/VM-disk1.vmdk
Run Code Online (Sandbox Code Playgroud)

从crysol改编了这个脚本,但似乎这不适用于Ubuntu?第一个vboxmanage storageattach开始时立即出错:

VBoxManage: error: Could not find a controller named 'SATA'
Run Code Online (Sandbox Code Playgroud)

如果我尝试"SATA Controller":

vboxmanage storageattach "${VM}" --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium none
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

VBoxManage: error: No storage device attached to device slot 0 on port 0 of controller 'SATA Controller'
VBoxManage: error: Details: code VBOX_E_OBJECT_NOT_FOUND (0x80bb0001), component SessionMachine, interface IMachine, callee nsISupports
VBoxManage: error: Context: "DetachDevice(Bstr(pszCtl).raw(), port, device)" at line 381 of file VBoxManageStorageController.cpp
Run Code Online (Sandbox Code Playgroud)

如果我注释掉这些vboxmanage storageattach行,脚本工作正常,但生成的VM与之前的大小相同,并且不再启动.

这是输出vboxmanage showvminfo "${VM}"

rub*_*o77 31

我找到了解决方案:

首先在VM内部用零填充所有可用空间:

cat /dev/zero > zero.fill;sync;sleep 1;sync;rm -f zero.fill
Run Code Online (Sandbox Code Playgroud)

在主机中,从VMware知识库安装vmware-vdiskmanager :

cd /tmp/
wget http://kb.vmware.com/selfservice/viewAttachment.do?attachID=1023856-vdiskmanager-linux.7.0.1.zip&documentID=1023856
unp 1023856-vdiskmanager-linux-7.0.1.zip
mv 1023856-vmware-vdiskmanager-linux.7.0.1 /usr/bin/vmware-vdiskmanager
chmod +x /usr/bin/vmware-vdiskmanager
Run Code Online (Sandbox Code Playgroud)

注意,在开始之前你有足够的可用磁盘空间,你需要MV在这个过程中增长到一倍.

然后压缩它:

/usr/bin/vmware-vdiskmanager -k ~/VirtualBox\ VMs/<virtual disk.vmdk>
Run Code Online (Sandbox Code Playgroud)

资源

  • @Quanlong VMWare KB文章末尾的"附件"部分,其中rubo77链接有3个版本的vmware-vdiskmanager.第一个是Mac OS Finder将其识别为Unix可执行文件,至少运行在我测试过的El Capitan上. (5认同)
  • 是否有针对OSX的预构建`vmware-vdiskmanager`? (2认同)

小智 7

我无法在vmware-vdiskmanager解决方案上面使用rubo77s解决方案来工作,我相信它依赖于vmware工作站或vmware播放器,我都没有,我确实找到了可执行文件并且它给了我错误.

我能够通过使用他的零命令来解决这个问题

cat/dev/zero> zero.fill; sync; sleep 1; sync; rm -f zero.fill

然后使用virtualboxes导出到.ova工具.

这将导致ova剥离/压缩归零空间.然后你可以重新导入它.


Chl*_*loe 7

我不需要安装VMWare或转换回VMDK,所以我使用了

https://scotch.io/tutorials/how-to-create-a-vagrant-base-box-from-an-existing-one#toc-make-the-box-as-small-as-possible

主机内部:

sudo yum clean all
sudo dd if=/dev/zero of=/EMPTY bs=1M
sudo rm -f /EMPTY
cat /dev/null > ~/.bash_history && history -c && exit
Run Code Online (Sandbox Code Playgroud)

然后,在访客关闭后:

$ vboxmanage clonehd --format vdi centos-7-1-1.x86_64.vmdk newdisk.vdi
$ ls -lh
-rwx------+ 1 Chloe None  39G Mar 26 14:52 centos-7-1-1.x86_64.vmdk
-rwx------+ 1 Chloe None  22G Mar 26 15:01 newdisk.vdi
Run Code Online (Sandbox Code Playgroud)

它还允许稍后压缩

$ vboxmanage modifyhd newdisk.vdi --compact
Run Code Online (Sandbox Code Playgroud)

在VirtualBox GUI中,我选择了“选择虚拟硬盘文件”以选择新文件。