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

onk*_*ows 12 virtualbox gparted clone clonezilla vdi

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

它需要修复,因为出于合规性原因,我将在其上安装 PGP 磁盘加密。这会将动态磁盘扩展到最大大小。

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

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

vboxmanage clonehd --format VDI MSWIN7.VHDX MSWIN7.vdi
Run Code Online (Sandbox Code Playgroud)

据称,使用 vdi,您可以使用类似于以下命令的命令减少虚拟大小/容量

vboxmanage modifyhd MSWIN7.vdi --resize 160000
Run Code Online (Sandbox Code Playgroud)

我发现这不起作用。即使您尝试变体,您也会始终收到如下错误消息:

进度状态:VBOX_E_NOT_SUPPORTED VBoxManage:错误:此格式的调整硬盘大小操作尚未实现!

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

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

顺便说一句,我尝试了 CloneZilla,但它似乎也不喜欢将容量缩小到较小的磁盘。我在 CloneZilla 中尝试了各种设置,但没有成功。

如何减少虚拟大小/容量?

在此处输入图片说明

And*_*edo 24

  1. 来宾操作系统的磁盘末尾释放空间,其中空间 >= size(source-disk) - size(new-disk)。通常通过缩小最后一个分区
  2. 关闭虚拟机。
  3. 创建具有所需大小的新 Virtual Box 磁盘。
  4. 将内容从旧磁盘移动到新磁盘内:

    vboxmanage clonehd "source-disk.vmdk" "new-disk.vmdk" --existing
    
    Run Code Online (Sandbox Code Playgroud)
  5. 开启虚拟机。

  6. 您可能需要调整来宾操作系统中的分区大小以填充磁盘的其余部分,具体取决于步骤 1 中释放的空间。

  • 这是将创建使用非常大分区的动态 vdi 转换为新 vdi(出于性能原因可能是固定大小格式)的真正正确方法。我不知道为什么没有人回答这个答案而更喜欢 dd 方式...... (2认同)

onk*_*ows 3

最后,我设法使用预安装的命令行实用程序(dd请参阅磁盘克隆)以意想不到的简单方式解决了这个难题。如下所示,现在我的来宾操作系统中的 160GB 驱动器存储在 160GB 固定 VirtualBox vdi 文件中。

\n\n

在此输入图像描述

\n\n

我使用以下步骤解决了它:

\n\n
    \n
  1. 使用 MS Windows 中的磁盘管理将磁盘大小调整为等于或略小于 VDI 的大小。
  2. \n
  3. 将带有 MS Windows 7 的源 vdi 添加MSWIN7.vdi到 Ubuntu VM 作为第二个磁盘。
  4. \n
  5. 创建一个新的固定 160GB vdi 并将其添加到 Ubuntu VM。现在有三个磁盘:/dev/sda1正在运行的 Ubuntu VM、/dev/sdb2源磁盘MSWIN7.vdi/dev/sdc1新的 vdi。
  6. \n
  7. 在 上创建正确的分区/dev/sdc。CloneZilla 为我做了这个。它没有复制数据,但确实创建了我想要的分区。当然,您可以手动执行此操作。
  8. \n
  9. 使用类似于 的命令复制sdb到。该命令以 no space left 错误消息结束,这是预期的。我忽略了这一点,因为这只是未分配的空间,无法复制。sdcddsudo dd if=/dev/sdb of=/dev/sdc
  10. \n
\n\n

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

\n\n
vagrant@devops:~$ sudo dd if=/dev/sdb of=/dev/sdc\ndd: writing to \xe2\x80\x98/dev/sdc\xe2\x80\x99: No space left on device\n335544321+0 records in\n335544320+0 records out\n171798691840 bytes (172 GB) copied, 6360.3 s, 27.0 MB/s\n
Run Code Online (Sandbox Code Playgroud)\n