如何减lessVirtualbox vdi文件的虚拟大小/容量

我想把运行MS Windows 7的物理机器变成一个VirtualBox虚拟机。 这很容易,我以前做过这个,但是这次我需要磁盘的虚拟大小/容量是固定的和更小的大小。

它需要被修复,因为我将在其上安装PGP磁盘encryption。 这会将dynamic磁盘扩展到最大尺寸。

除了这种特殊情况之外,还有其他的原因希望磁盘变小和固定。 是我的经验。 如果在dynamic扩展磁盘上运行Jenkins构build服务器,则可以看到该磁盘快速扩展到其最大大小,而在来宾操作系统中,磁盘空间使用情况稳定且有大量可用空间。

使用Disk2vhd我创build了一个vhdx文件。 这个文件我转换为vdi格式。

vboxmanage clonehd --format VDI MSWIN7.VHDX MSWIN7.vdi 

据称与vdi你可以减less虚拟的大小/容量与类似的命令

 vboxmanage modifyhd MSWIN7.vdi --resize 160000 

我发现这是行不通的。 即使你尝试变种,你也会一直得到如下的错误信息:

进度状态:VBOX_E_NOT_SUPPORTED VBoxManage:错误:调整此格式的硬盘操作尚未执行!

以下是我的vdi磁盘的磁盘布局。 我将其添加到Ubuntu VM中,使用Gparted和CloneZilla查看。 容量大约300GB。 未分配145GB。 使用大约153GB。

我想把容量缩小到160GB左右。 这应该足以适应/dev/sdb1/dev/sdb2

顺便说一下,我试过CloneZilla,但它似乎也不想缩小容量到一个更小的磁盘。 我在CloneZilla中尝试了各种设置,但没有成功。

我怎样才能减less虚拟大小/容量?

在这里输入图像说明

  1. guest虚拟机操作系统中的磁盘末尾取消分配空间,其中空间> =大小(源磁盘) – 大小(新磁盘)。 通常通过缩小最后的分区 。
  2. closures虚拟机。
  3. 创build所需大小的新的虚拟磁盘。
  4. 将内容从旧磁盘移动到新磁盘中:

     vboxmanage clonehd "source-disk.vmdk" "new-disk.vmdk" --existing 
  5. 打开虚拟机。

  6. 您可能必须调整guest虚拟机操作系统中的分区大小,以根据步骤1中释放的空间填充磁盘的其余部分。

最后,我设法使用预安装的命令行实用工具dd以一种非常容易的方式解决了这个难题。请参阅磁盘克隆 。 如下图所示,我现在在我的客户操作系统中有160GB硬盘,存储在一个160GB固定的VirtualBox vdi文件中。

在这里输入图像说明

我使用以下步骤解决它:

  1. 使用MS Windows中的“ 磁盘pipe理”将磁盘大小调整为等于或略大于VDI大小的大小。
  2. 将MS Windows 7的源vdi MSWIN7.vdi添加到Ubuntu VM作为第二个磁盘。
  3. 创build一个新的固定160GB vdi,并将其添加到Ubuntu VM。 现在有三个磁盘:运行Ubuntu VM的/dev/sda1 ,源MSWIN7.vdi /dev/sdb2和具有新vdi的/dev/sdc1
  4. /dev/sdc上创build正确的分区。 CloneZilla为我做了这个。 它没有复制数据,但确实创build了我想要的分区。 当然,你可以手动做到这一点。
  5. 使用类似于sudo dd if=/dev/sdb of=/dev/sdc dd命令将sdb复制到sdc sudo dd if=/dev/sdb of=/dev/sdc 。 该命令以没有空间剩余错误消息结束,这是预期的。 我忽略了这一点,因为这只是未分配的空间,它没有复制。

我认为可以运行每个分区的命令。 也许这是更好的,不会显示错误消息。 sudo dd if=/dev/sdb1 of=/dev/sdc1sudo dd if=/dev/sdb2 of=/dev/sdc2

 vagrant@devops:~$ sudo dd if=/dev/sdb of=/dev/sdc dd: writing to '/dev/sdc': No space left on device 335544321+0 records in 335544320+0 records out 171798691840 bytes (172 GB) copied, 6360.3 s, 27.0 MB/s 

我相信这个解决scheme是非常危险的! 它依赖于原始300 GB分区的前153 GB中的所有文件。 dd命令不会复制文件。 它只是顺序复制所有的块。 因此,如果你不幸在160 GB截止后有重要的文件,dd将不知道复制它们。

我在很多很多post中看到的典型解决scheme是启动Windows VM,并使用碎片整理工具和pipe理工具的一些组合来将所有文件整合到磁盘的前端 – 困难在于许多碎片整理工具不会移动不可移动Windows系统文件(我不得不closures系统恢复来删除一个7GB的不可移动的磁盘块),这是在你想要整合的空间中间的某个地方。

将文件合并到磁盘前(MyDefrag是一个免费的工具,提供文件在磁盘上的显示位置),则必须缩小Windows分区的大小。 我使用了收缩选项的diskpart工具。

此时,您可以使用dd将现在较小的分区复制到新的vdi。

我也在我的Linux主机上使用了vboxmanage modifymedium win10.vdi –compact,但是我首先必须在Windows系统中运行sdelete.exe,以便首先清除所有未使用的空间(sdelete -zc :)。 使用vboxmanage来压缩现有的vdi文件可以让你做所有的事情(但总是有一个备份)。